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.
- {titan_cli-0.4.0 → titan_cli-0.4.2}/PKG-INFO +1 -1
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +14 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/commit_service.py +31 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/remote_service.py +18 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/tag_service.py +25 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/network/gh_network.py +2 -2
- {titan_cli-0.4.0 → titan_cli-0.4.2}/pyproject.toml +1 -1
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/dependencies.py +1 -1
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/config.py +144 -34
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/available.py +1 -6
- 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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/models.py +23 -3
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/plugin_registry.py +90 -23
- titan_cli-0.4.2/titan_cli/core/plugins/runtime.py +174 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/install_plugin_screen.py +51 -46
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/main_menu.py +29 -4
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/plugin_management.py +112 -73
- {titan_cli-0.4.0 → titan_cli-0.4.2}/LICENSE +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/README.md +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/network/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/network/git_network.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/branch_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/diff_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/stash_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/status_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/services/worktree_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/exceptions.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/messages.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/branch_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/commit_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/status_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/tag_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/worktree_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/branch.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/commit.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/status.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/tag.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/network/worktree.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/branch.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/commit.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/status.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/tag.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/models/view/worktree.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/operations/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/operations/branch_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/operations/commit_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/operations/diff_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/plugin.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/__init__.py +0 -0
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/branch_steps.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/checkout_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/commit_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/create_worktree_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/pull_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/remove_worktree_step.py +0 -0
- {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
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/steps/worktree_command_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/__init__.py +0 -0
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/workflows/commit-ai.yaml +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/code_review_agent.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/config_loader.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/issue_generator.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/agents/pr_agent.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/checklists/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/checklists/defaults.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/network/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_network.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_queries.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/protocols.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/issue_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/pr_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/release_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/review_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/clients/services/team_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/config/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/config/pr_agent.toml +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/exceptions.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/managers/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/managers/checklist_manager.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/managers/diff_context_manager.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/messages.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/diff_models.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/formatting.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/comment_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/issue_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/pr_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/release_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/review_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/thread_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/__init__.py +0 -0
- {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
- {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
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/user.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/issue.py +0 -0
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/release.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/review.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/user.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/review_enums.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/review_models.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/validators.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/models/view.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/code_review_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/comment_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/context_resolution_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/findings_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/issue_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/manifest_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/plan_prompt_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_creation_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/review_action_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/thread_resolution_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/operations/worktree_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/plugin.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/ai_pr_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/code_review_steps.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/github_prompt_steps.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/issue_steps.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/pr_review_steps.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/preview_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/select_cli_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/steps/worktree_steps.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/utils.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/code_block.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_thread.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_utils.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_view.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/widgets/reply_comment.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/__init__.py +0 -0
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-issue-ai.yaml +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-pr-ai.yaml +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-github/titan_plugin_github/workflows/respond-pr-comments.yaml +0 -0
- {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
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/config_loader.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/jira_agent.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/prompts.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/response_parser.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/token_tracker.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/agents/validators.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/jira_network.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/comment_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/issue_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/link_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/metadata_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/project_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/transition_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/config/jira_agent.toml +0 -0
- {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
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants/defaults.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants/messages.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants/templates.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/constants.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/exceptions.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/markdown_formatter.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/messages.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/enums.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/formatting.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/comment_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_mapper.py +0 -0
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/priority_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/project_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/status_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/transition_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/user_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/version_mapper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/comment.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue.py +0 -0
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/priority.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/project.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/status.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/transition.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/user.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/version.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/models/view.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/operations/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_formatting_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/operations/jql_operations.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/plugin.py +0 -0
- {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
- {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
- {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
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +0 -0
- {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
- {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
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +0 -0
- {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
- {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
- {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
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/input_validation.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/issue_sorter.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils/saved_queries.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/utils.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/analyze-jira-issues.yaml +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/create-generic-issue.yaml +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/__main__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/agents/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/agents/base.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/client.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/constants.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/exceptions.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/litellm_client.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/llm_tools.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/models.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/oauth_helper.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/anthropic.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/base.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/gemini.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/litellm.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ai/providers/openai.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/cli.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/clients/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/clients/gcloud_client.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/discovery.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/errors.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/logging/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/logging/config.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/logging/decorators.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/migrations/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/migrations/base.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/migrations/legacy_to_v1.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/migrations/manager.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/models/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/models/code_review.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/local_sources.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/plugins/plugin_base.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/result.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/secrets.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/utils.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/validators/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/models.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/project_step_source.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/workflow_exceptions.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/workflow_filter_service.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/workflow_registry.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/core/workflows/workflow_sources.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/builder.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/context.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/mock_context.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/results.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/steps/ai_assistant_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/steps/command_step.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/utils/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/utils/venv.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/engine/workflow_executor.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/base.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/claude.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/codex.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/gemini.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/adapters/registry.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/configs.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/external_cli/launcher.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/messages.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/__previews__/statusbar_preview.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/app.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/colors.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/icons.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/ai_config.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/ai_config_wizard.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/base.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/cli_launcher.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/global_setup_wizard.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/plugin_config_wizard.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/project_setup_wizard.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/workflow_execution.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/screens/workflows.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/textual_components.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/textual_workflow_executor.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/theme.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/button.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/decision_badge.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/dev_source_path_modal.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/header.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/multiline_input.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/panel.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/panel_container.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_choice.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_input.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_option_list.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_selection_list.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/prompt_textarea.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/segmented_switch.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/status_bar.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/step_container.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/styled_option_list.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/table.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/text.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/ui/tui/widgets/wizard.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/utils/__init__.py +0 -0
- {titan_cli-0.4.0 → titan_cli-0.4.2}/titan_cli/utils/autoupdate.py +0 -0
{titan_cli-0.4.0 → titan_cli-0.4.2}/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py
RENAMED
|
@@ -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.
|
|
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.
|
|
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"
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# core/config.py
|
|
2
|
+
from copy import deepcopy
|
|
3
|
+
import hashlib
|
|
2
4
|
from pathlib import Path
|
|
3
|
-
|
|
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.
|
|
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 =
|
|
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
|
|
392
|
-
|
|
393
|
-
|
|
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
|
|
401
|
-
|
|
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
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
440
|
-
|
|
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):
|