titan-cli 0.7.2__tar.gz → 0.8.0__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.7.2 → titan_cli-0.8.0}/PKG-INFO +3 -3
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/__init__.py +1 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/__init__.py +9 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/docker_client.py +106 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/network/__init__.py +4 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/network/docker_network.py +201 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/services/__init__.py +12 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/services/build_service.py +97 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/services/compose_service.py +165 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/services/container_service.py +103 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/services/prune_service.py +115 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/exceptions.py +40 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/__init__.py +55 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/formatting.py +20 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/mappers/__init__.py +15 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/mappers/build_result_mapper.py +30 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/mappers/compose_status_mapper.py +37 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/mappers/container_mapper.py +30 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/mappers/disk_usage_mapper.py +28 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/mappers/prune_result_mapper.py +23 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/network/__init__.py +16 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/network/build_result.py +16 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/network/compose_status.py +24 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/network/container.py +16 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/network/disk_usage.py +21 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/network/prune_result.py +11 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/view/__init__.py +16 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/view/build_result.py +14 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/view/compose_status.py +23 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/view/container.py +13 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/view/disk_usage.py +20 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/models/view/prune_result.py +10 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/operations/__init__.py +12 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/operations/build_operations.py +40 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/operations/compose_operations.py +84 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/operations/container_operations.py +22 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/plugin.py +123 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/__init__.py +1 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/build_push_images_step.py +128 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/compose_down_step.py +42 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/compose_status_step.py +52 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/compose_up_step.py +42 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/disk_usage_step.py +48 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/prune_resources_step.py +52 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/remove_containers_step.py +45 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/select_containers_to_remove_step.py +77 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/select_prune_targets_step.py +55 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/select_service_group_step.py +61 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/steps/select_services_to_stop_step.py +71 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/workflows/docker-build-push.yaml +8 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/workflows/docker-clean-containers.yaml +13 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/workflows/docker-down.yaml +18 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/workflows/docker-prune.yaml +23 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/workflows/docker-status.yaml +8 -0
- titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/workflows/docker-up.yaml +18 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/git_client.py +72 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/network/git_network.py +7 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/__init__.py +2 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/diff_service.py +98 -8
- titan_cli-0.8.0/plugins/titan-plugin-git/titan_plugin_git/clients/services/merge_service.py +251 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/worktree_service.py +21 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/messages.py +29 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/view/__init__.py +5 -0
- titan_cli-0.8.0/plugins/titan-plugin-git/titan_plugin_git/models/view/diff.py +21 -0
- titan_cli-0.8.0/plugins/titan-plugin-git/titan_plugin_git/models/view/merge.py +39 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/operations/__init__.py +18 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/operations/commit_operations.py +33 -21
- titan_cli-0.8.0/plugins/titan-plugin-git/titan_plugin_git/operations/merge_operations.py +189 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/plugin.py +13 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/ai_commit_message_step.py +37 -12
- titan_cli-0.8.0/plugins/titan-plugin-git/titan_plugin_git/steps/merge_steps.py +394 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/commit_ai_preview.py +0 -4
- titan_cli-0.8.0/plugins/titan-plugin-git/titan_plugin_git/workflows/merge-branch.yaml +56 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/agents/__init__.py +1 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/agents/issue_generator.py +43 -85
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/agents/pr_agent.py +55 -52
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/github_client.py +1 -5
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/network/gh_network.py +6 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_queries.py +15 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/services/pr_service.py +14 -9
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/services/review_service.py +18 -7
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/managers/diff_context_manager.py +412 -42
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/managers/prompt_budget_manager.py +9 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/diff_models.py +29 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/review_models.py +0 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/review_profile_models.py +23 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/validators.py +59 -18
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/__init__.py +6 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/context_resolution_operations.py +146 -21
- titan_cli-0.8.0/plugins/titan-plugin-github/titan_plugin_github/operations/findings_operations.py +662 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/manifest_operations.py +43 -8
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/plan_prompt_operations.py +5 -2
- titan_cli-0.8.0/plugins/titan-plugin-github/titan_plugin_github/operations/pr_operations.py +213 -0
- titan_cli-0.8.0/plugins/titan-plugin-github/titan_plugin_github/operations/prompt_formatting_operations.py +83 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/review_action_operations.py +170 -13
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/review_strategy_operations.py +12 -15
- titan_cli-0.8.0/plugins/titan-plugin-github/titan_plugin_github/operations/verification_operations.py +316 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/worktree_operations.py +47 -17
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/plugin.py +4 -3
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/review_profiles/defaults.py +26 -1
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/ai_pr_step.py +34 -4
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/code_review_steps.py +1286 -291
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/issue_steps.py +32 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/pr_review_steps.py +13 -3
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/worktree_steps.py +12 -7
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_utils.py +83 -3
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_view.py +90 -13
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/create_pr_ai_preview.py +0 -4
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr-thread-resolution.yaml +0 -5
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/workflows/review-pr.yaml +19 -11
- titan_cli-0.8.0/plugins/titan-plugin-jira/titan_plugin_jira/agents/contracts.py +92 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/agents/jira_agent.py +42 -42
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/plugin.py +72 -66
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_analyze_issue_step.py +33 -3
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/ai_enhance_issue_description_step.py +32 -16
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/plan-jira-issue.yaml +1 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/plugin.py +61 -31
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/screens/slack_config_screen.py +38 -24
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/steps/summary_steps.py +44 -25
- {titan_cli-0.7.2 → titan_cli-0.8.0}/pyproject.toml +8 -4
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/agents/__init__.py +5 -0
- titan_cli-0.8.0/titan_cli/ai/agents/base.py +285 -0
- titan_cli-0.8.0/titan_cli/ai/agents/contracts.py +341 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/client.py +31 -55
- titan_cli-0.8.0/titan_cli/ai/headless_generator.py +176 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/providers/anthropic.py +26 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/providers/litellm.py +24 -2
- titan_cli-0.8.0/titan_cli/ai/providers/sampling.py +93 -0
- titan_cli-0.8.0/titan_cli/ai/router/__init__.py +44 -0
- titan_cli-0.8.0/titan_cli/ai/router/availability.py +154 -0
- titan_cli-0.8.0/titan_cli/ai/router/declaration.py +114 -0
- titan_cli-0.8.0/titan_cli/ai/router/enums.py +88 -0
- titan_cli-0.8.0/titan_cli/ai/router/executor.py +628 -0
- titan_cli-0.8.0/titan_cli/ai/router/models.py +86 -0
- titan_cli-0.8.0/titan_cli/ai/router/resolver.py +265 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/config.py +231 -12
- titan_cli-0.8.0/titan_cli/core/diffs.py +121 -0
- titan_cli-0.8.0/titan_cli/core/interrupt.py +105 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/models/__init__.py +62 -9
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/plugins/models.py +37 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/plugins/plugin_base.py +7 -5
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/plugins/plugin_registry.py +74 -3
- titan_cli-0.8.0/titan_cli/core/plugins/trust.py +181 -0
- titan_cli-0.8.0/titan_cli/core/security/__init__.py +41 -0
- titan_cli-0.8.0/titan_cli/core/security/_vault.py +298 -0
- titan_cli-0.8.0/titan_cli/core/security/broker.py +404 -0
- titan_cli-0.8.0/titan_cli/core/security/execution.py +107 -0
- titan_cli-0.8.0/titan_cli/core/security/redaction.py +151 -0
- titan_cli-0.8.0/titan_cli/core/security/sensitive.py +124 -0
- titan_cli-0.8.0/titan_cli/core/security/sessions.py +163 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/workflows/__init__.py +4 -0
- titan_cli-0.8.0/titan_cli/core/workflows/ai_usage_discovery.py +166 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/workflows/workflow_filter_service.py +18 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/builder.py +73 -8
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/context.py +11 -5
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/mock_context.py +1 -21
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/results.py +41 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/steps/ai_assistant_step.py +53 -63
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/steps/command_step.py +13 -6
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/workflow_executor.py +0 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/external_cli/adapters/__init__.py +2 -1
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/external_cli/adapters/base.py +8 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/external_cli/adapters/claude.py +7 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/external_cli/adapters/codex.py +9 -1
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/external_cli/adapters/gemini.py +7 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/external_cli/adapters/registry.py +12 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/external_cli/configs.py +6 -3
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/external_cli/launcher.py +14 -3
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/messages.py +7 -1
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/__init__.py +45 -15
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/app.py +10 -3
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/icons.py +1 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/ai_config.py +281 -75
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/ai_config_wizard.py +3 -3
- titan_cli-0.8.0/titan_cli/ui/tui/screens/ai_routing.py +513 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/base.py +30 -4
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/main_menu.py +1 -11
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/plugin_config_wizard.py +12 -12
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/plugin_management.py +32 -15
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/workflow_execution.py +45 -8
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/workflows.py +46 -4
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/textual_components.py +38 -15
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/textual_workflow_executor.py +27 -2
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/__init__.py +5 -0
- titan_cli-0.8.0/titan_cli/ui/tui/widgets/chip.py +55 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/header.py +62 -6
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/segmented_switch.py +27 -7
- titan_cli-0.8.0/titan_cli/ui/tui/widgets/tabs.py +67 -0
- titan_cli-0.8.0/titan_cli/utils/__init__.py +0 -0
- titan_cli-0.7.2/plugins/titan-plugin-github/titan_plugin_github/agents/code_review_agent.py +0 -168
- titan_cli-0.7.2/plugins/titan-plugin-github/titan_plugin_github/operations/findings_operations.py +0 -305
- titan_cli-0.7.2/plugins/titan-plugin-github/titan_plugin_github/operations/pr_operations.py +0 -125
- titan_cli-0.7.2/plugins/titan-plugin-github/titan_plugin_github/operations/prompt_formatting_operations.py +0 -24
- titan_cli-0.7.2/plugins/titan-plugin-jira/titan_plugin_jira/agents/response_parser.py +0 -435
- titan_cli-0.7.2/titan_cli/ai/agents/base.py +0 -176
- titan_cli-0.7.2/titan_cli/core/secrets.py +0 -136
- titan_cli-0.7.2/titan_cli/engine/steps/select_cli_step.py +0 -72
- titan_cli-0.7.2/titan_cli/ui/tui/screens/cli_launcher.py +0 -151
- {titan_cli-0.7.2 → titan_cli-0.8.0}/LICENSE +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/README.md +0 -0
- {titan_cli-0.7.2/plugins/titan-plugin-github/titan_plugin_github/config → titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/workflows}/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/network/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/branch_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/commit_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/remote_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/stash_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/status_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/clients/services/tag_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/exceptions.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/branch_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/commit_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/status_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/tag_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/mappers/worktree_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/network/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/network/branch.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/network/commit.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/network/status.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/network/tag.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/network/worktree.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/view/branch.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/view/commit.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/view/status.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/view/tag.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/models/view/worktree.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/operations/branch_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/operations/diff_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/branch_steps.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/checkout_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/commit_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/create_branch_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/create_worktree_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/diff_summary_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/pull_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/push_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/remove_worktree_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/restore_original_branch_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/save_current_branch_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/status_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/steps/worktree_command_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/workflows/__previews__/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-git/titan_plugin_git/workflows/commit-ai.yaml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/agents/config_loader.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/checklists/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/checklists/defaults.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/network/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/network/graphql_network.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/protocols.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/services/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/services/contents_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/services/issue_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/services/release_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/clients/services/team_service.py +0 -0
- {titan_cli-0.7.2/titan_cli/ai → titan_cli-0.8.0/plugins/titan-plugin-github/titan_plugin_github/config}/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/config/pr_agent.toml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/exceptions.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/managers/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/managers/checklist_manager.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/managers/review_profile_manager.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/messages.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/formatting.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/comment_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/issue_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/pr_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/release_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/review_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/mappers/thread_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/issue_comment.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_comment.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/review_thread.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/graphql/user.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/issue.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/pull_request.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/release.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/review.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/network/rest/user.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/pr_enums.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/review_enums.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/models/view.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/ai_response_parsing_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/code_review_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/comment_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/issue_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_creation_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/pr_selection_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/review_profile_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/operations/thread_resolution_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/review_profiles/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/create_pr_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/github_prompt_steps.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/preview_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/pull_request_steps.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/steps/release_steps.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/utils.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/widgets/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/widgets/code_block.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/widgets/comment_thread.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/widgets/reply_comment.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/workflows/__previews__/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-issue-ai.yaml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/workflows/create-pr-ai.yaml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-github/titan_plugin_github/workflows/respond-pr-comments.yaml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/agents/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/agents/config_loader.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/agents/prompts.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/agents/token_tracker.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/agents/validators.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/jira_client.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/network/jira_network.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/comment_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/issue_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/link_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/metadata_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/project_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/clients/services/transition_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/config/jira_agent.toml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/generic_issue.md.j2 +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/config/templates/issue_analysis.md.j2 +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/constants/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/constants/defaults.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/constants/messages.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/constants/templates.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/constants.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/exceptions.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/formatters/markdown_formatter.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/messages.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/enums.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/formatting.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/comment_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/issue_type_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/priority_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/project_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/status_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/transition_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/user_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/mappers/version_mapper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/comment.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/issue_type.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/priority.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/project.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/status.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/transition.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/user.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/network/rest/version.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/models/view.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/operations/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_formatting_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_management_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/operations/issue_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/operations/jql_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/operations/plan_prompt_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/build_jira_task_context_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/confirm_and_assign_issue_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/confirm_assignee_for_new_issue_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/create_generic_issue_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_comments_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/get_issue_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/issue_management_steps.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/list_versions_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_issue_description_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/prompt_select_issue_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/review_issue_description_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_jql_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/search_saved_query_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_priority_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_issue_type_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/steps/select_jira_issue_step.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/utils/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/utils/input_validation.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/utils/issue_sorter.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/utils/saved_queries.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/utils.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/analyze-jira-issues.yaml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-jira/titan_plugin_jira/workflows/create-generic-issue.yaml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/sdk.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/services/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/services/auth_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/services/conversation_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/services/directory_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/services/identity_resolver.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/services/message_service.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/clients/slack_client.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/config/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/exceptions.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/formatting.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/models.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/oauth.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/operations/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/operations/identity_resolution_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/operations/message_summary_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/operations/target_resolution_operations.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/screens/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/steps/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/steps/discovery_steps.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/steps/message_steps.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/steps/target_steps.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/workflows/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/workflows/post-message.yaml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/plugins/titan-plugin-slack/titan_plugin_slack/workflows/summarize-slack-target.yaml +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/__main__.py +0 -0
- {titan_cli-0.7.2/titan_cli/core/validators → titan_cli-0.8.0/titan_cli/ai}/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/constants.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/dependencies.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/exceptions.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/litellm_client.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/llm_tools.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/models.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/oauth_helper.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/providers/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/providers/base.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/providers/gemini.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ai/providers/openai.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/cli.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/clients/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/clients/gcloud_client.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/discovery.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/errors.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/logging/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/logging/config.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/logging/decorators.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/migrations/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/migrations/base.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/migrations/legacy_to_v1.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/migrations/manager.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/models/code_review.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/plugins/available.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/plugins/community_sources.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/plugins/local_sources.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/plugins/runtime.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/result.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/utils.py +0 -0
- {titan_cli-0.7.2/titan_cli/external_cli → titan_cli-0.8.0/titan_cli/core/validators}/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/workflows/models.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/workflows/project_step_source.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/workflows/workflow_exceptions.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/workflows/workflow_registry.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/core/workflows/workflow_sources.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/option_item.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/utils/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/engine/utils/venv.py +0 -0
- {titan_cli-0.7.2/titan_cli/utils → titan_cli-0.8.0/titan_cli/external_cli}/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/__previews__/statusbar_preview.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/colors.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/__init__.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/global_setup_wizard.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/install_plugin_screen.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/plugin_config_resolver.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/screens/project_setup_wizard.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/theme.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/button.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/decision_badge.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/dev_source_path_modal.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/multiline_input.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/panel.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/panel_container.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/prompt_choice.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/prompt_input.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/prompt_option_list.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/prompt_selection_list.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/prompt_textarea.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/status_bar.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/step_container.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/styled_option_list.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/table.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/text.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/ui/tui/widgets/wizard.py +0 -0
- {titan_cli-0.7.2 → titan_cli-0.8.0}/titan_cli/utils/autoupdate.py +0 -0
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: titan-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Modular development tools orchestrator - Streamline your workflows with AI integration and intuitive terminal UI
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Keywords: cli,workflow,orchestrator,automation,devtools,ai
|
|
8
8
|
Author: MasOrange Apps Team
|
|
9
9
|
Author-email: apps-management-stores@masorange.es
|
|
10
|
-
Requires-Python: >=3.
|
|
10
|
+
Requires-Python: >=3.11,<4.0.0
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Environment :: Console
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
14
14
|
Classifier: License :: OSI Approved :: MIT License
|
|
15
15
|
Classifier: Operating System :: OS Independent
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.13
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
22
|
Requires-Dist: anthropic (>=0.75.0,<0.76.0)
|
|
23
23
|
Requires-Dist: google-auth (>=2.43.0,<3.0.0)
|
|
24
24
|
Requires-Dist: google-genai (>=1.58.0,<2.0.0)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Titan CLI Docker plugin."""
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# plugins/titan-plugin-docker/titan_plugin_docker/clients/docker_client.py
|
|
2
|
+
"""
|
|
3
|
+
Docker 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 Callable, Dict, List, Optional
|
|
9
|
+
|
|
10
|
+
from titan_cli.core.result import ClientResult
|
|
11
|
+
from titan_cli.core.plugins.models import DockerBuildTargetConfig
|
|
12
|
+
|
|
13
|
+
from .network import DockerNetwork
|
|
14
|
+
from .services import ComposeService, BuildService, PruneService, ContainerService
|
|
15
|
+
from ..models.view import UIComposeStatus, UIBuildResult, UIDiskUsage, UIPruneEntry, UIContainer
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DockerClient:
|
|
19
|
+
"""
|
|
20
|
+
Docker client facade - delegates to specialized services.
|
|
21
|
+
|
|
22
|
+
All public methods return ClientResult[T] for consistent error handling.
|
|
23
|
+
Uses pattern matching (match/case) for result handling in operations and steps.
|
|
24
|
+
|
|
25
|
+
Also carries the project's `service_groups` and `build_targets` config
|
|
26
|
+
(set from `DockerPluginConfig` at plugin initialization), so steps can
|
|
27
|
+
resolve them via `ctx.docker.service_groups` / `ctx.docker.build_targets`.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
project_path: str = ".",
|
|
33
|
+
compose_file: str = "docker-compose.yml",
|
|
34
|
+
service_groups: Optional[Dict[str, List[str]]] = None,
|
|
35
|
+
build_targets: Optional[List[DockerBuildTargetConfig]] = None,
|
|
36
|
+
):
|
|
37
|
+
"""
|
|
38
|
+
Initialize Docker client.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
project_path: Path to the project root (default: current directory)
|
|
42
|
+
compose_file: Path to the compose file, relative to the project root
|
|
43
|
+
service_groups: Project-configured named service groups
|
|
44
|
+
build_targets: Project-configured build targets
|
|
45
|
+
"""
|
|
46
|
+
self.project_path = project_path
|
|
47
|
+
self.compose_file = compose_file
|
|
48
|
+
self.service_groups = service_groups or {}
|
|
49
|
+
self.build_targets = build_targets or []
|
|
50
|
+
|
|
51
|
+
# Initialize network layer
|
|
52
|
+
self.network = DockerNetwork(project_path=project_path)
|
|
53
|
+
|
|
54
|
+
# Initialize services
|
|
55
|
+
self.compose_service = ComposeService(self.network, compose_file)
|
|
56
|
+
self.build_service = BuildService(self.network)
|
|
57
|
+
self.prune_service = PruneService(self.network)
|
|
58
|
+
self.container_service = ContainerService(self.network)
|
|
59
|
+
|
|
60
|
+
# ===== Compose Methods =====
|
|
61
|
+
|
|
62
|
+
def compose_up(self, services: Optional[List[str]] = None, detach: bool = True) -> ClientResult[List[str]]:
|
|
63
|
+
"""Start compose services (empty/None starts all services)."""
|
|
64
|
+
return self.compose_service.up(services=services, detach=detach)
|
|
65
|
+
|
|
66
|
+
def compose_down(self, services: Optional[List[str]] = None) -> ClientResult[List[str]]:
|
|
67
|
+
"""Stop compose services (empty/None stops the whole project)."""
|
|
68
|
+
return self.compose_service.down(services=services)
|
|
69
|
+
|
|
70
|
+
def compose_status(self, services: Optional[List[str]] = None) -> ClientResult[UIComposeStatus]:
|
|
71
|
+
"""Get compose project status (empty/None inspects all services)."""
|
|
72
|
+
return self.compose_service.status(services=services)
|
|
73
|
+
|
|
74
|
+
def list_services(self) -> ClientResult[List[str]]:
|
|
75
|
+
"""List every service name defined in the compose file."""
|
|
76
|
+
return self.compose_service.list_services()
|
|
77
|
+
|
|
78
|
+
# ===== Build Methods =====
|
|
79
|
+
|
|
80
|
+
def build_target(
|
|
81
|
+
self,
|
|
82
|
+
target: DockerBuildTargetConfig,
|
|
83
|
+
on_output: Optional[Callable[[str], None]] = None,
|
|
84
|
+
) -> ClientResult[UIBuildResult]:
|
|
85
|
+
"""Build (and optionally push) a single configured image, optionally streaming build output via `on_output`."""
|
|
86
|
+
return self.build_service.build_target(target, on_output=on_output)
|
|
87
|
+
|
|
88
|
+
# ===== Prune Methods =====
|
|
89
|
+
|
|
90
|
+
def disk_usage(self) -> ClientResult[UIDiskUsage]:
|
|
91
|
+
"""Get a host-wide breakdown of Docker's disk usage."""
|
|
92
|
+
return self.prune_service.disk_usage()
|
|
93
|
+
|
|
94
|
+
def prune(self, targets: List[str]) -> ClientResult[List[UIPruneEntry]]:
|
|
95
|
+
"""Prune the given host-wide resource categories (see `PRUNE_COMMANDS` for valid keys)."""
|
|
96
|
+
return self.prune_service.prune(targets)
|
|
97
|
+
|
|
98
|
+
# ===== Container Methods =====
|
|
99
|
+
|
|
100
|
+
def list_containers(self) -> ClientResult[List[UIContainer]]:
|
|
101
|
+
"""List every container on the host, running or stopped (not scoped to this project)."""
|
|
102
|
+
return self.container_service.list_containers()
|
|
103
|
+
|
|
104
|
+
def remove_containers(self, container_ids: List[str]) -> ClientResult[List[str]]:
|
|
105
|
+
"""Remove the given (stopped) containers."""
|
|
106
|
+
return self.container_service.remove_containers(container_ids)
|
titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/network/docker_network.py
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# plugins/titan-plugin-docker/titan_plugin_docker/clients/network/docker_network.py
|
|
2
|
+
"""
|
|
3
|
+
Docker Network Client
|
|
4
|
+
|
|
5
|
+
Low-level Docker CLI command executor.
|
|
6
|
+
Handles subprocess execution and error handling.
|
|
7
|
+
No model conversion - returns raw command output strings.
|
|
8
|
+
"""
|
|
9
|
+
import re
|
|
10
|
+
import subprocess
|
|
11
|
+
import shutil
|
|
12
|
+
import time
|
|
13
|
+
from typing import Callable, List, Optional
|
|
14
|
+
|
|
15
|
+
from titan_cli.core.logging.config import get_logger
|
|
16
|
+
|
|
17
|
+
from ...exceptions import DockerError, DockerClientError, DockerCommandError
|
|
18
|
+
|
|
19
|
+
# ANSI escape sequences (CSI/OSC/single-char) plus stray C0 control chars.
|
|
20
|
+
# Even with --progress=plain, tools invoked inside a build can emit color or
|
|
21
|
+
# cursor codes; a TUI text widget renders those raw, garbling the console.
|
|
22
|
+
_ANSI_RE = re.compile(r"\x1b(?:\[[0-9;?]*[ -/]*[@-~]|\][^\x07\x1b]*(?:\x07|\x1b\\)|[@-Z\\-_])")
|
|
23
|
+
_CTRL_RE = re.compile(r"[\x00-\x08\x0b-\x1f\x7f]")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _sanitize_output_line(line: str) -> str:
|
|
27
|
+
"""Strip ANSI escapes and control chars so TUI widgets render plain text.
|
|
28
|
+
|
|
29
|
+
A lone carriage-return redraw (`foo\rbar`) keeps only the final state,
|
|
30
|
+
which is what the terminal would have shown.
|
|
31
|
+
"""
|
|
32
|
+
line = _ANSI_RE.sub("", line)
|
|
33
|
+
if "\r" in line:
|
|
34
|
+
line = line.rsplit("\r", 1)[-1]
|
|
35
|
+
return _CTRL_RE.sub("", line)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class DockerNetwork:
|
|
39
|
+
"""
|
|
40
|
+
Docker network client using the Docker CLI (docker, docker compose, docker buildx).
|
|
41
|
+
|
|
42
|
+
Executes commands and handles errors.
|
|
43
|
+
Returns raw command output (strings) without parsing or model conversion.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, project_path: str = "."):
|
|
47
|
+
"""
|
|
48
|
+
Initialize Docker network client.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
project_path: Path to the project root (default: current directory)
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
DockerClientError: If the Docker CLI is not installed
|
|
55
|
+
"""
|
|
56
|
+
self.project_path = project_path
|
|
57
|
+
self._logger = get_logger(__name__)
|
|
58
|
+
self._check_docker_installed()
|
|
59
|
+
|
|
60
|
+
def _check_docker_installed(self) -> None:
|
|
61
|
+
"""
|
|
62
|
+
Check if the Docker CLI is installed.
|
|
63
|
+
|
|
64
|
+
Raises:
|
|
65
|
+
DockerClientError: If docker is not found
|
|
66
|
+
"""
|
|
67
|
+
if not shutil.which("docker"):
|
|
68
|
+
raise DockerClientError("Docker CLI not found. Please install Docker.")
|
|
69
|
+
|
|
70
|
+
def run_command(
|
|
71
|
+
self,
|
|
72
|
+
args: List[str],
|
|
73
|
+
check: bool = True,
|
|
74
|
+
cwd: Optional[str] = None,
|
|
75
|
+
) -> str:
|
|
76
|
+
"""
|
|
77
|
+
Run a docker CLI command and return stdout.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
args: Full command arguments (including 'docker')
|
|
81
|
+
check: Raise exception on non-zero exit code (default: True)
|
|
82
|
+
cwd: Optional working directory (overrides project_path)
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Command stdout as string
|
|
86
|
+
|
|
87
|
+
Raises:
|
|
88
|
+
DockerCommandError: If the command fails
|
|
89
|
+
DockerClientError: If the docker CLI is not found
|
|
90
|
+
DockerError: If an unexpected error occurs
|
|
91
|
+
"""
|
|
92
|
+
subcommand = " ".join(args[1:3]) if len(args) > 1 else "unknown"
|
|
93
|
+
start = time.time()
|
|
94
|
+
|
|
95
|
+
try:
|
|
96
|
+
result = subprocess.run(
|
|
97
|
+
args,
|
|
98
|
+
cwd=cwd or self.project_path,
|
|
99
|
+
capture_output=True,
|
|
100
|
+
text=True,
|
|
101
|
+
check=check,
|
|
102
|
+
)
|
|
103
|
+
self._logger.debug(
|
|
104
|
+
"docker_command_ok",
|
|
105
|
+
subcommand=subcommand,
|
|
106
|
+
duration=round(time.time() - start, 3),
|
|
107
|
+
)
|
|
108
|
+
return result.stdout.rstrip()
|
|
109
|
+
except subprocess.CalledProcessError as e:
|
|
110
|
+
self._logger.debug(
|
|
111
|
+
"docker_command_failed",
|
|
112
|
+
subcommand=subcommand,
|
|
113
|
+
duration=round(time.time() - start, 3),
|
|
114
|
+
exit_code=e.returncode,
|
|
115
|
+
)
|
|
116
|
+
error_msg = e.stderr.strip() if e.stderr else str(e)
|
|
117
|
+
raise DockerCommandError(f"Docker command failed: {error_msg}") from e
|
|
118
|
+
except FileNotFoundError:
|
|
119
|
+
raise DockerClientError("Docker CLI not found. Please install Docker.")
|
|
120
|
+
except Exception as e:
|
|
121
|
+
raise DockerError(f"An unexpected error occurred: {e}") from e
|
|
122
|
+
|
|
123
|
+
def stream_command(
|
|
124
|
+
self,
|
|
125
|
+
args: List[str],
|
|
126
|
+
on_line: Callable[[str], None],
|
|
127
|
+
check: bool = True,
|
|
128
|
+
cwd: Optional[str] = None,
|
|
129
|
+
) -> str:
|
|
130
|
+
"""
|
|
131
|
+
Run a docker CLI command, invoking `on_line` for each line of output
|
|
132
|
+
as it is produced (stdout and stderr merged, in the order emitted).
|
|
133
|
+
|
|
134
|
+
Long-running, chatty commands (e.g. `docker buildx build`) print their
|
|
135
|
+
progress on stderr, so both streams are merged into a single feed
|
|
136
|
+
rather than only surfacing output after the process exits.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
args: Full command arguments (including 'docker')
|
|
140
|
+
on_line: Called with each output line (without trailing newline) as it arrives
|
|
141
|
+
check: Raise exception on non-zero exit code (default: True)
|
|
142
|
+
cwd: Optional working directory (overrides project_path)
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Full command output (stdout+stderr merged) as a single string
|
|
146
|
+
|
|
147
|
+
Raises:
|
|
148
|
+
DockerCommandError: If the command fails
|
|
149
|
+
DockerClientError: If the docker CLI is not found
|
|
150
|
+
DockerError: If an unexpected error occurs
|
|
151
|
+
"""
|
|
152
|
+
subcommand = " ".join(args[1:3]) if len(args) > 1 else "unknown"
|
|
153
|
+
start = time.time()
|
|
154
|
+
lines: List[str] = []
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
process = subprocess.Popen(
|
|
158
|
+
args,
|
|
159
|
+
cwd=cwd or self.project_path,
|
|
160
|
+
stdout=subprocess.PIPE,
|
|
161
|
+
stderr=subprocess.STDOUT,
|
|
162
|
+
text=True,
|
|
163
|
+
bufsize=1,
|
|
164
|
+
)
|
|
165
|
+
for line in process.stdout:
|
|
166
|
+
stripped = _sanitize_output_line(line.rstrip("\n"))
|
|
167
|
+
lines.append(stripped)
|
|
168
|
+
on_line(stripped)
|
|
169
|
+
process.wait()
|
|
170
|
+
|
|
171
|
+
output = "\n".join(lines)
|
|
172
|
+
if check and process.returncode != 0:
|
|
173
|
+
self._logger.debug(
|
|
174
|
+
"docker_command_failed",
|
|
175
|
+
subcommand=subcommand,
|
|
176
|
+
duration=round(time.time() - start, 3),
|
|
177
|
+
exit_code=process.returncode,
|
|
178
|
+
)
|
|
179
|
+
raise DockerCommandError(f"Docker command failed: {output}")
|
|
180
|
+
|
|
181
|
+
self._logger.debug(
|
|
182
|
+
"docker_command_ok",
|
|
183
|
+
subcommand=subcommand,
|
|
184
|
+
duration=round(time.time() - start, 3),
|
|
185
|
+
)
|
|
186
|
+
return output
|
|
187
|
+
except FileNotFoundError:
|
|
188
|
+
raise DockerClientError("Docker CLI not found. Please install Docker.")
|
|
189
|
+
except DockerCommandError:
|
|
190
|
+
raise
|
|
191
|
+
except Exception as e:
|
|
192
|
+
raise DockerError(f"An unexpected error occurred: {e}") from e
|
|
193
|
+
|
|
194
|
+
def get_project_path(self) -> str:
|
|
195
|
+
"""
|
|
196
|
+
Get configured project path.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Project path string
|
|
200
|
+
"""
|
|
201
|
+
return self.project_path
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Services layer for Docker plugin."""
|
|
2
|
+
from .compose_service import ComposeService
|
|
3
|
+
from .build_service import BuildService
|
|
4
|
+
from .prune_service import PruneService
|
|
5
|
+
from .container_service import ContainerService
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"ComposeService",
|
|
9
|
+
"BuildService",
|
|
10
|
+
"PruneService",
|
|
11
|
+
"ContainerService",
|
|
12
|
+
]
|
titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/services/build_service.py
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# plugins/titan-plugin-docker/titan_plugin_docker/clients/services/build_service.py
|
|
2
|
+
"""
|
|
3
|
+
Build Service
|
|
4
|
+
|
|
5
|
+
Business logic for building (and optionally pushing) Docker images.
|
|
6
|
+
Uses network layer to execute commands, parses to network models, maps to view models.
|
|
7
|
+
"""
|
|
8
|
+
from typing import Callable, Optional
|
|
9
|
+
|
|
10
|
+
from titan_cli.core.result import ClientResult, ClientSuccess, ClientError
|
|
11
|
+
from titan_cli.core.logging import log_client_operation
|
|
12
|
+
from titan_cli.core.plugins.models import DockerBuildTargetConfig
|
|
13
|
+
|
|
14
|
+
from ..network import DockerNetwork
|
|
15
|
+
from ...models.network.build_result import NetworkBuildResult
|
|
16
|
+
from ...models.view.build_result import UIBuildResult
|
|
17
|
+
from ...models.mappers import from_network_build_result
|
|
18
|
+
from ...exceptions import DockerCommandError
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class BuildService:
|
|
22
|
+
"""
|
|
23
|
+
Service for building and pushing Docker images.
|
|
24
|
+
|
|
25
|
+
Operates on a single `DockerBuildTargetConfig` at a time - the caller
|
|
26
|
+
(operations layer) decides which target(s) to build.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, docker_network: DockerNetwork):
|
|
30
|
+
"""
|
|
31
|
+
Initialize Build service.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
docker_network: DockerNetwork instance for command execution
|
|
35
|
+
"""
|
|
36
|
+
self.docker = docker_network
|
|
37
|
+
|
|
38
|
+
@log_client_operation()
|
|
39
|
+
def build_target(
|
|
40
|
+
self,
|
|
41
|
+
target: DockerBuildTargetConfig,
|
|
42
|
+
on_output: Optional[Callable[[str], None]] = None,
|
|
43
|
+
) -> ClientResult[UIBuildResult]:
|
|
44
|
+
"""
|
|
45
|
+
Build (and optionally push) a single configured image.
|
|
46
|
+
|
|
47
|
+
Uses `docker buildx build` so a single code path covers both
|
|
48
|
+
single-platform and multi-platform builds.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
target: Build target configuration
|
|
52
|
+
on_output: Optional callback invoked with each line of build output as it streams
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
ClientResult[UIBuildResult]
|
|
56
|
+
"""
|
|
57
|
+
try:
|
|
58
|
+
image_ref = f"{target.image}:{target.tag}"
|
|
59
|
+
|
|
60
|
+
args = [
|
|
61
|
+
"docker", "buildx", "build",
|
|
62
|
+
# Line-oriented output: without this buildx may pick its TTY
|
|
63
|
+
# renderer (ANSI cursor-movement redraws) and the streamed
|
|
64
|
+
# "lines" become raw control sequences that garble the console.
|
|
65
|
+
"--progress=plain",
|
|
66
|
+
"-t", image_ref,
|
|
67
|
+
"-f", target.dockerfile,
|
|
68
|
+
]
|
|
69
|
+
# Omitted when unconfigured so buildx targets its native platform.
|
|
70
|
+
# Passing a platform list the host doesn't match makes buildx emulate
|
|
71
|
+
# through QEMU, so this is never guessed on the project's behalf.
|
|
72
|
+
if target.platforms:
|
|
73
|
+
args.extend(["--platform", target.platforms])
|
|
74
|
+
if target.target:
|
|
75
|
+
args.extend(["--target", target.target])
|
|
76
|
+
if target.push:
|
|
77
|
+
args.append("--push")
|
|
78
|
+
args.append(target.context)
|
|
79
|
+
|
|
80
|
+
if on_output:
|
|
81
|
+
self.docker.stream_command(args, on_line=on_output)
|
|
82
|
+
else:
|
|
83
|
+
self.docker.run_command(args)
|
|
84
|
+
|
|
85
|
+
network_result = NetworkBuildResult(
|
|
86
|
+
name=target.name,
|
|
87
|
+
image=target.image,
|
|
88
|
+
tag=target.tag,
|
|
89
|
+
platforms=target.platforms,
|
|
90
|
+
target=target.target or "",
|
|
91
|
+
pushed=target.push,
|
|
92
|
+
)
|
|
93
|
+
ui_result = from_network_build_result(network_result)
|
|
94
|
+
|
|
95
|
+
return ClientSuccess(data=ui_result, message=f"Built {image_ref}")
|
|
96
|
+
except DockerCommandError as e:
|
|
97
|
+
return ClientError(error_message=str(e), error_code="BUILD_ERROR")
|
titan_cli-0.8.0/plugins/titan-plugin-docker/titan_plugin_docker/clients/services/compose_service.py
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# plugins/titan-plugin-docker/titan_plugin_docker/clients/services/compose_service.py
|
|
2
|
+
"""
|
|
3
|
+
Compose Service
|
|
4
|
+
|
|
5
|
+
Business logic for Docker Compose lifecycle operations.
|
|
6
|
+
Uses network layer to execute commands, parses to network models, maps to view models.
|
|
7
|
+
"""
|
|
8
|
+
import json
|
|
9
|
+
from typing import List, Optional
|
|
10
|
+
|
|
11
|
+
from titan_cli.core.result import ClientResult, ClientSuccess, ClientError
|
|
12
|
+
from titan_cli.core.logging import log_client_operation
|
|
13
|
+
|
|
14
|
+
from ..network import DockerNetwork
|
|
15
|
+
from ...models.network.compose_status import NetworkComposeService, NetworkComposeStatus
|
|
16
|
+
from ...models.view.compose_status import UIComposeStatus
|
|
17
|
+
from ...models.mappers import from_network_compose_status
|
|
18
|
+
from ...exceptions import DockerCommandError
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ComposeService:
|
|
22
|
+
"""
|
|
23
|
+
Service for Docker Compose lifecycle operations.
|
|
24
|
+
|
|
25
|
+
Operates on an arbitrary list of service names (or all services when
|
|
26
|
+
none is given). Has no notion of "profiles" or special-cased groups -
|
|
27
|
+
that resolution happens in the operations layer.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, docker_network: DockerNetwork, compose_file: str = "docker-compose.yml"):
|
|
31
|
+
"""
|
|
32
|
+
Initialize Compose service.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
docker_network: DockerNetwork instance for command execution
|
|
36
|
+
compose_file: Path to the compose file, relative to the project root
|
|
37
|
+
"""
|
|
38
|
+
self.docker = docker_network
|
|
39
|
+
self.compose_file = compose_file
|
|
40
|
+
|
|
41
|
+
def _compose_args(self, *args: str) -> List[str]:
|
|
42
|
+
return ["docker", "compose", "-f", self.compose_file, *args]
|
|
43
|
+
|
|
44
|
+
@log_client_operation()
|
|
45
|
+
def up(self, services: Optional[List[str]] = None, detach: bool = True) -> ClientResult[List[str]]:
|
|
46
|
+
"""
|
|
47
|
+
Start compose services.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
services: Service names to start (empty/None starts all services)
|
|
51
|
+
detach: Run containers in the background (default: True)
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
ClientResult[List[str]] with the started service names
|
|
55
|
+
"""
|
|
56
|
+
try:
|
|
57
|
+
args = self._compose_args("up")
|
|
58
|
+
if detach:
|
|
59
|
+
args.append("-d")
|
|
60
|
+
args.extend(services or [])
|
|
61
|
+
|
|
62
|
+
self.docker.run_command(args)
|
|
63
|
+
return ClientSuccess(
|
|
64
|
+
data=services or [],
|
|
65
|
+
message="Started services" if services else "Started all services",
|
|
66
|
+
)
|
|
67
|
+
except DockerCommandError as e:
|
|
68
|
+
return ClientError(error_message=str(e), error_code="COMPOSE_UP_ERROR")
|
|
69
|
+
|
|
70
|
+
@log_client_operation()
|
|
71
|
+
def down(self, services: Optional[List[str]] = None) -> ClientResult[List[str]]:
|
|
72
|
+
"""
|
|
73
|
+
Stop compose services.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
services: Service names to stop (empty/None stops the whole project)
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
ClientResult[List[str]] with the stopped service names
|
|
80
|
+
"""
|
|
81
|
+
try:
|
|
82
|
+
if services:
|
|
83
|
+
# `docker compose down` doesn't accept service names; use `stop` for a subset.
|
|
84
|
+
args = self._compose_args("stop", *services)
|
|
85
|
+
else:
|
|
86
|
+
args = self._compose_args("down")
|
|
87
|
+
|
|
88
|
+
self.docker.run_command(args)
|
|
89
|
+
return ClientSuccess(
|
|
90
|
+
data=services or [],
|
|
91
|
+
message="Stopped services" if services else "Stopped project",
|
|
92
|
+
)
|
|
93
|
+
except DockerCommandError as e:
|
|
94
|
+
return ClientError(error_message=str(e), error_code="COMPOSE_DOWN_ERROR")
|
|
95
|
+
|
|
96
|
+
@log_client_operation()
|
|
97
|
+
def status(self, services: Optional[List[str]] = None) -> ClientResult[UIComposeStatus]:
|
|
98
|
+
"""
|
|
99
|
+
Get compose project status.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
services: Service names to inspect (empty/None inspects all services)
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
ClientResult[UIComposeStatus]
|
|
106
|
+
"""
|
|
107
|
+
try:
|
|
108
|
+
args = self._compose_args("ps", "--format", "json")
|
|
109
|
+
args.extend(services or [])
|
|
110
|
+
|
|
111
|
+
output = self.docker.run_command(args, check=False)
|
|
112
|
+
network_status = NetworkComposeStatus(services=self._parse_ps_output(output))
|
|
113
|
+
ui_status = from_network_compose_status(network_status)
|
|
114
|
+
|
|
115
|
+
return ClientSuccess(data=ui_status, message="Status retrieved")
|
|
116
|
+
except DockerCommandError as e:
|
|
117
|
+
return ClientError(error_message=str(e), error_code="COMPOSE_STATUS_ERROR")
|
|
118
|
+
|
|
119
|
+
@log_client_operation()
|
|
120
|
+
def list_services(self) -> ClientResult[List[str]]:
|
|
121
|
+
"""
|
|
122
|
+
List every service name defined in the compose file, regardless of
|
|
123
|
+
whether it currently has a running/stopped container.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
ClientResult[List[str]]
|
|
127
|
+
"""
|
|
128
|
+
try:
|
|
129
|
+
args = self._compose_args("config", "--services")
|
|
130
|
+
output = self.docker.run_command(args)
|
|
131
|
+
services = [line.strip() for line in output.splitlines() if line.strip()]
|
|
132
|
+
return ClientSuccess(data=services, message=f"Found {len(services)} service(s)")
|
|
133
|
+
except DockerCommandError as e:
|
|
134
|
+
return ClientError(error_message=str(e), error_code="COMPOSE_LIST_SERVICES_ERROR")
|
|
135
|
+
|
|
136
|
+
@staticmethod
|
|
137
|
+
def _parse_ps_output(output: str) -> List[NetworkComposeService]:
|
|
138
|
+
"""
|
|
139
|
+
Parse `docker compose ps --format json` output.
|
|
140
|
+
|
|
141
|
+
Handles both a single JSON array (newer Compose) and newline-delimited
|
|
142
|
+
JSON objects (older Compose), since the CLI output shape has changed
|
|
143
|
+
across versions.
|
|
144
|
+
"""
|
|
145
|
+
if not output.strip():
|
|
146
|
+
return []
|
|
147
|
+
|
|
148
|
+
try:
|
|
149
|
+
entries = json.loads(output)
|
|
150
|
+
if isinstance(entries, dict):
|
|
151
|
+
entries = [entries]
|
|
152
|
+
except json.JSONDecodeError:
|
|
153
|
+
entries = [json.loads(line) for line in output.splitlines() if line.strip()]
|
|
154
|
+
|
|
155
|
+
return [
|
|
156
|
+
NetworkComposeService(
|
|
157
|
+
service=entry.get("Service", ""),
|
|
158
|
+
container_name=entry.get("Name", ""),
|
|
159
|
+
image=entry.get("Image", ""),
|
|
160
|
+
state=entry.get("State", ""),
|
|
161
|
+
status=entry.get("Status", ""),
|
|
162
|
+
health=entry.get("Health", ""),
|
|
163
|
+
)
|
|
164
|
+
for entry in entries
|
|
165
|
+
]
|