titan-cli 0.1.5__py3-none-any.whl → 0.1.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. titan_cli/core/workflows/project_step_source.py +52 -7
  2. titan_cli/core/workflows/workflow_filter_service.py +6 -4
  3. titan_cli/engine/__init__.py +5 -1
  4. titan_cli/engine/results.py +31 -1
  5. titan_cli/engine/steps/ai_assistant_step.py +18 -18
  6. titan_cli/engine/workflow_executor.py +7 -2
  7. titan_cli/ui/tui/screens/plugin_config_wizard.py +16 -0
  8. titan_cli/ui/tui/screens/workflow_execution.py +22 -24
  9. titan_cli/ui/tui/screens/workflows.py +8 -4
  10. titan_cli/ui/tui/textual_components.py +293 -189
  11. titan_cli/ui/tui/textual_workflow_executor.py +30 -2
  12. titan_cli/ui/tui/theme.py +34 -5
  13. titan_cli/ui/tui/widgets/__init__.py +15 -0
  14. titan_cli/ui/tui/widgets/multiline_input.py +32 -0
  15. titan_cli/ui/tui/widgets/prompt_choice.py +138 -0
  16. titan_cli/ui/tui/widgets/prompt_input.py +74 -0
  17. titan_cli/ui/tui/widgets/prompt_selection_list.py +150 -0
  18. titan_cli/ui/tui/widgets/prompt_textarea.py +87 -0
  19. titan_cli/ui/tui/widgets/styled_option_list.py +107 -0
  20. titan_cli/ui/tui/widgets/text.py +51 -130
  21. {titan_cli-0.1.5.dist-info → titan_cli-0.1.7.dist-info}/METADATA +5 -10
  22. {titan_cli-0.1.5.dist-info → titan_cli-0.1.7.dist-info}/RECORD +54 -41
  23. {titan_cli-0.1.5.dist-info → titan_cli-0.1.7.dist-info}/WHEEL +1 -1
  24. titan_plugin_git/clients/git_client.py +59 -2
  25. titan_plugin_git/plugin.py +10 -0
  26. titan_plugin_git/steps/ai_commit_message_step.py +8 -8
  27. titan_plugin_git/steps/branch_steps.py +6 -6
  28. titan_plugin_git/steps/checkout_step.py +66 -0
  29. titan_plugin_git/steps/commit_step.py +3 -3
  30. titan_plugin_git/steps/create_branch_step.py +131 -0
  31. titan_plugin_git/steps/diff_summary_step.py +11 -13
  32. titan_plugin_git/steps/pull_step.py +70 -0
  33. titan_plugin_git/steps/push_step.py +3 -3
  34. titan_plugin_git/steps/restore_original_branch_step.py +97 -0
  35. titan_plugin_git/steps/save_current_branch_step.py +82 -0
  36. titan_plugin_git/steps/status_step.py +23 -13
  37. titan_plugin_git/workflows/commit-ai.yaml +4 -3
  38. titan_plugin_github/steps/ai_pr_step.py +90 -22
  39. titan_plugin_github/steps/create_pr_step.py +8 -8
  40. titan_plugin_github/steps/github_prompt_steps.py +13 -13
  41. titan_plugin_github/steps/issue_steps.py +14 -15
  42. titan_plugin_github/steps/preview_step.py +8 -8
  43. titan_plugin_github/workflows/create-pr-ai.yaml +1 -11
  44. titan_plugin_jira/messages.py +12 -0
  45. titan_plugin_jira/plugin.py +4 -0
  46. titan_plugin_jira/steps/ai_analyze_issue_step.py +6 -6
  47. titan_plugin_jira/steps/get_issue_step.py +7 -7
  48. titan_plugin_jira/steps/list_versions_step.py +133 -0
  49. titan_plugin_jira/steps/prompt_select_issue_step.py +8 -9
  50. titan_plugin_jira/steps/search_jql_step.py +191 -0
  51. titan_plugin_jira/steps/search_saved_query_step.py +13 -13
  52. titan_plugin_jira/utils/__init__.py +1 -1
  53. {titan_cli-0.1.5.dist-info/licenses → titan_cli-0.1.7.dist-info}/LICENSE +0 -0
  54. {titan_cli-0.1.5.dist-info → titan_cli-0.1.7.dist-info}/entry_points.txt +0 -0
@@ -1,177 +1,98 @@
1
1
  """
2
2
  Text Widgets
3
3
 
4
- Reusable text widgets with theme-based styling.
4
+ Canonical text widgets with theme-based styling for use across the entire application.
5
+
6
+ All screens, steps, and core components should use these widgets to ensure consistent
7
+ styling that automatically adapts to the active theme.
8
+
9
+ Widgets:
10
+ - Text: Plain text without styling
11
+ - DimText: Muted/dimmed text
12
+ - BoldText: Bold text
13
+ - SuccessText: Success/green color (uses $success theme variable)
14
+ - ErrorText: Error/red color (uses $error theme variable)
15
+ - WarningText: Warning/yellow color (uses $warning theme variable)
16
+ - PrimaryText: Primary theme color (uses $primary theme variable)
17
+ - BoldPrimaryText: Bold text with primary color
18
+ - ItalicText: Italic text
19
+ - DimItalicText: Dim italic text
20
+
21
+ Usage in screens/core:
22
+ from titan_cli.ui.tui.widgets import DimText, SuccessText
23
+ self.mount(DimText("Loading..."))
24
+ self.mount(SuccessText("Completed!"))
25
+
26
+ Usage in workflow steps via TextualComponents:
27
+ ctx.textual.dim_text("Loading...")
28
+ ctx.textual.success_text("Completed!")
29
+
30
+ Note: All styling is defined globally in theme.py (TITAN_THEME_CSS).
31
+ Widget classes are used to apply the correct CSS selectors.
5
32
  """
6
33
  from textual.widgets import Static
7
34
 
8
35
 
9
- # Shared CSS for all text styling - DRY principle
10
- SHARED_TEXT_CSS = """
11
- .dim, DimText, DimItalicText {
12
- color: $text-muted;
13
- }
14
-
15
- .bold, BoldText, BoldPrimaryText {
16
- text-style: bold;
17
- }
18
-
19
- .italic, ItalicText, DimItalicText {
20
- text-style: italic;
21
- }
22
-
23
- .primary, PrimaryText, BoldPrimaryText {
24
- color: $primary;
25
- }
26
-
27
- .success, SuccessText {
28
- color: $success;
29
- }
30
-
31
- .error, ErrorText {
32
- color: $error;
33
- }
34
-
35
- .warning, WarningText {
36
- color: $warning;
37
- }
38
- """
39
-
40
-
41
36
  class Text(Static):
42
37
  """
43
- Reusable text widget with dynamic styling via CSS classes.
38
+ Plain text widget without styling.
39
+
40
+ For styled text, use specialized widgets:
41
+ - DimText: Muted/dimmed text
42
+ - BoldText: Bold text
43
+ - SuccessText: Success/green color
44
+ - ErrorText: Error/red color
45
+ - WarningText: Warning/yellow color
46
+ - PrimaryText: Primary theme color
47
+ - ItalicText: Italic text
44
48
 
45
49
  Usage:
46
- # Create with initial style
47
- text = Text("Hello", style="bold")
48
-
49
- # Change style dynamically
50
- text.set_style("error")
51
-
52
- # Combine multiple styles
53
- text = Text("Hello", style="bold primary")
54
-
55
- Available styles:
56
- - dim: Muted/dimmed text
57
- - bold: Bold text
58
- - italic: Italic text
59
- - primary: Primary color
60
- - success: Success/green color
61
- - error: Error/red color
62
- - warning: Warning/yellow color
50
+ text = Text("Hello, world!")
63
51
  """
52
+ pass
53
+
64
54
 
65
- DEFAULT_CSS = SHARED_TEXT_CSS
66
-
67
- def __init__(self, renderable="", *, style: str = "", **kwargs):
68
- """
69
- Initialize text widget.
70
-
71
- Args:
72
- renderable: Text content
73
- style: Space-separated style classes (e.g., "bold primary")
74
- **kwargs: Additional Static arguments
75
- """
76
- # Add style classes to existing classes
77
- if style:
78
- existing_classes = kwargs.get("classes", "")
79
- if existing_classes:
80
- kwargs["classes"] = f"{existing_classes} {style}"
81
- else:
82
- kwargs["classes"] = style
83
-
84
- super().__init__(renderable, **kwargs)
85
-
86
- def set_style(self, *styles: str) -> None:
87
- """
88
- Set the text style(s), removing previous styles.
89
-
90
- Args:
91
- *styles: One or more style names to apply
92
-
93
- Example:
94
- text.set_style("bold", "error")
95
- """
96
- # Remove all style classes
97
- for cls in ["dim", "bold", "italic", "primary", "success", "error", "warning"]:
98
- self.remove_class(cls)
99
-
100
- # Add new styles
101
- for style in styles:
102
- if style:
103
- self.add_class(style)
104
-
105
- def add_style(self, *styles: str) -> None:
106
- """
107
- Add style(s) to the text without removing existing ones.
108
-
109
- Args:
110
- *styles: One or more style names to add
111
-
112
- Example:
113
- text.add_style("italic")
114
- """
115
- for style in styles:
116
- if style:
117
- self.add_class(style)
118
-
119
- def remove_style(self, *styles: str) -> None:
120
- """
121
- Remove style(s) from the text.
122
-
123
- Args:
124
- *styles: One or more style names to remove
125
-
126
- Example:
127
- text.remove_style("bold")
128
- """
129
- for style in styles:
130
- if style:
131
- self.remove_class(style)
132
-
133
-
134
- # Convenience widgets - use shared CSS
55
+ # Styled text widgets - styling defined globally in theme.py
135
56
  class DimText(Static):
136
57
  """Text widget with dim/muted styling."""
137
- DEFAULT_CSS = SHARED_TEXT_CSS
58
+ pass
138
59
 
139
60
 
140
61
  class BoldText(Static):
141
62
  """Text widget with bold styling."""
142
- DEFAULT_CSS = SHARED_TEXT_CSS
63
+ pass
143
64
 
144
65
 
145
66
  class PrimaryText(Static):
146
67
  """Text widget with primary color."""
147
- DEFAULT_CSS = SHARED_TEXT_CSS
68
+ pass
148
69
 
149
70
 
150
71
  class BoldPrimaryText(Static):
151
72
  """Text widget with bold primary color."""
152
- DEFAULT_CSS = SHARED_TEXT_CSS
73
+ pass
153
74
 
154
75
 
155
76
  class SuccessText(Static):
156
77
  """Text widget with success/green color."""
157
- DEFAULT_CSS = SHARED_TEXT_CSS
78
+ pass
158
79
 
159
80
 
160
81
  class ErrorText(Static):
161
82
  """Text widget with error/red color."""
162
- DEFAULT_CSS = SHARED_TEXT_CSS
83
+ pass
163
84
 
164
85
 
165
86
  class WarningText(Static):
166
87
  """Text widget with warning/yellow color."""
167
- DEFAULT_CSS = SHARED_TEXT_CSS
88
+ pass
168
89
 
169
90
 
170
91
  class ItalicText(Static):
171
92
  """Text widget with italic styling."""
172
- DEFAULT_CSS = SHARED_TEXT_CSS
93
+ pass
173
94
 
174
95
 
175
96
  class DimItalicText(Static):
176
97
  """Text widget with dim italic styling."""
177
- DEFAULT_CSS = SHARED_TEXT_CSS
98
+ pass
@@ -1,14 +1,12 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: titan-cli
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Modular development tools orchestrator - Streamline your workflows with AI integration and intuitive terminal UI
5
+ Home-page: https://github.com/masmovil/titan-cli
5
6
  License: MIT
6
- License-File: LICENSE
7
7
  Keywords: cli,workflow,orchestrator,automation,devtools,ai
8
- Author: finxo
9
- Author-email: finxeto@gmail.com
10
- Maintainer: r-pedraza
11
- Maintainer-email: raulpedrazaleon@gmail.com
8
+ Author: MasOrange Apps Team
9
+ Author-email: apps-management-stores@masorange.es
12
10
  Requires-Python: >=3.10,<4.0.0
13
11
  Classifier: Development Status :: 5 - Production/Stable
14
12
  Classifier: Environment :: Console
@@ -19,8 +17,6 @@ Classifier: Programming Language :: Python :: 3
19
17
  Classifier: Programming Language :: Python :: 3.10
20
18
  Classifier: Programming Language :: Python :: 3.11
21
19
  Classifier: Programming Language :: Python :: 3.12
22
- Classifier: Programming Language :: Python :: 3.13
23
- Classifier: Programming Language :: Python :: 3.14
24
20
  Requires-Dist: anthropic (>=0.75.0,<0.76.0)
25
21
  Requires-Dist: google-auth (>=2.43.0,<3.0.0)
26
22
  Requires-Dist: google-genai (>=1.58.0,<2.0.0)
@@ -36,7 +32,6 @@ Requires-Dist: tomli (>=2.0.0,<3.0.0)
36
32
  Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
37
33
  Requires-Dist: typer (>=0.20.0,<1.0.0)
38
34
  Project-URL: Documentation, https://github.com/masmovil/titan-cli
39
- Project-URL: Homepage, https://github.com/masmovil/titan-cli
40
35
  Project-URL: Repository, https://github.com/masmovil/titan-cli
41
36
  Description-Content-Type: text/markdown
42
37
 
@@ -1,20 +1,25 @@
1
1
  titan_plugin_git/__init__.py,sha256=msIvkIXf4msXC3-q9NS2Ln556Zt9QQl-lQ688RYJnjA,50
2
2
  titan_plugin_git/clients/__init__.py,sha256=WNAZ_kqzD_GC9NpxSjZQvkQEkcvB-tZTZPcETAK7UkE,184
3
- titan_plugin_git/clients/git_client.py,sha256=Gq9fRiYU16S9NTjzkngqOQpEimQEDjIjd__NMNgWVfw,25721
3
+ titan_plugin_git/clients/git_client.py,sha256=s2AY9gpuqI9sBqiCy-9drsc0IpXc2U7W8nnI6Mt4CSw,27417
4
4
  titan_plugin_git/exceptions.py,sha256=540oqBBvyoAcO0Kh_seuBVY-Au9jEam88rif11XA-GY,657
5
5
  titan_plugin_git/messages.py,sha256=esQJEYOC8-IaA-TkhCwtQ0ur0RWjMF_VdfGT_CX3eqs,5940
6
6
  titan_plugin_git/models.py,sha256=z1tUi8bh-EzAOsLRkuqWbYMJAIzZmYP_m7AhH53z254,665
7
- titan_plugin_git/plugin.py,sha256=j1OIkDmjO9edZ69283rZ6cFNGgfJAza1bqqkKvTrSlw,4113
7
+ titan_plugin_git/plugin.py,sha256=5yZ_lniz8uQeGt3XQLOuUTHSm0hvy9nnVUp_Ilb90Ys,4705
8
8
  titan_plugin_git/steps/__init__.py,sha256=msIvkIXf4msXC3-q9NS2Ln556Zt9QQl-lQ688RYJnjA,50
9
- titan_plugin_git/steps/ai_commit_message_step.py,sha256=CR1b26p5FuOCjn4UUl06BUdcfx-1oQvjy1ytq_VF-mk,7066
10
- titan_plugin_git/steps/branch_steps.py,sha256=WAvs9YfoRm5SErDJN3lXrdGamql8jw_PozL2XNNydKM,3135
11
- titan_plugin_git/steps/commit_step.py,sha256=QyJzMTxprDV41LjoUHsaXHrVGvBDTdq3ioB7k7d005Y,3154
12
- titan_plugin_git/steps/diff_summary_step.py,sha256=O6vk9VGoOaQP9dkHLV0UB9za5J7Ut26pj0ePi1XsHfs,6463
13
- titan_plugin_git/steps/push_step.py,sha256=4t_fAMxAePQJrg8_UmFNXUbbpA5A79QhvDbOFC0vzug,2963
14
- titan_plugin_git/steps/status_step.py,sha256=5a7Ov2E70xNK85aNutvG34uthboRZkov2330JkVCEwA,1931
9
+ titan_plugin_git/steps/ai_commit_message_step.py,sha256=ZUh8lMrENjXCP1OzH_oXFGX_SdJGl23fSGQzzUgMUnw,6991
10
+ titan_plugin_git/steps/branch_steps.py,sha256=zEeWxTqoKXfyaGra3p8AKYeT1ZvmMZvGh6wK0l-9esA,3087
11
+ titan_plugin_git/steps/checkout_step.py,sha256=y39h2G4sxDMQRDDGVxGMqwma5O4YgHosiNiKV5JJRHk,1993
12
+ titan_plugin_git/steps/commit_step.py,sha256=mZyAu44O6JHHbzliBFWqWW1fKK7WwG-9wGVudbTSzvI,3126
13
+ titan_plugin_git/steps/create_branch_step.py,sha256=t_mQ-sPN6RiP7NJ-jAaNs_6GZltQEaOBy3SuZSqd3Sw,5207
14
+ titan_plugin_git/steps/diff_summary_step.py,sha256=b_OspWvJT2Hgu-FU2Se38DM36eaCbaJ3PD5inhhwvW0,6307
15
+ titan_plugin_git/steps/pull_step.py,sha256=aqjspoy5Ejh0t03NCelG5FmdhOSCH0X0qL7Rp9uvOj0,2187
16
+ titan_plugin_git/steps/push_step.py,sha256=oERpSZOUWe7-tNg-ir6jhgYKrmHE1CiZgiGMbUyxfBY,2939
17
+ titan_plugin_git/steps/restore_original_branch_step.py,sha256=QL5H66o5c0lsZmlOcslKw9tQYtwEHU0XebHuVGb6cNw,3473
18
+ titan_plugin_git/steps/save_current_branch_step.py,sha256=XxjS_-ODVdY2A7z9WbE_2lrjCsTqU09ubor4a0Z-HDk,2725
19
+ titan_plugin_git/steps/status_step.py,sha256=DQcBobH9n9lQCjN1uYiGZPAov4pMWCuDfZPwBtwz838,2379
15
20
  titan_plugin_git/workflows/__previews__/__init__.py,sha256=MXi4U95Tyi2Ku1ODkMtzMyvfQhkmrBiFxEi9IzoDVdg,40
16
21
  titan_plugin_git/workflows/__previews__/commit_ai_preview.py,sha256=lMQt9dzVQMAZe1mFSSxAUBaSxYSLB4XMThGCO92mHVM,3744
17
- titan_plugin_git/workflows/commit-ai.yaml,sha256=x0CAq_w2XOvnZoeWhxY5s22Qexaxx1hynQOp8pbdq_g,684
22
+ titan_plugin_git/workflows/commit-ai.yaml,sha256=QYaYRvxb_Z7e6B8moKM-Puovd4xNRY15Coo-jxPUaqI,748
18
23
  titan_plugin_github/__init__.py,sha256=Isw61E7k0RKHHx3eyC7m5x8JBFSY0iR6tS24Pil6oEI,240
19
24
  titan_plugin_github/agents/__init__.py,sha256=jTGWPeICit5UBN_UhIhwPPq_Z6TLOyl1hRXiQTq0I8s,184
20
25
  titan_plugin_github/agents/config_loader.py,sha256=3zHseeCMabK7QfWmHQuviCL7gsVUEfM8WkuXrNhBtu8,5241
@@ -29,16 +34,16 @@ titan_plugin_github/messages.py,sha256=OFLgetbcsvlrI8x2zvoU3yGl1Cv7FO-WyOQFYdSrq
29
34
  titan_plugin_github/models.py,sha256=Oauvp-jxMl35UJio1P0zEp4liZD-EDtCNxqSRc03UcU,9400
30
35
  titan_plugin_github/plugin.py,sha256=kJPMvRiL5l_Ax4bbHZSzVKHvTAv3uuEvxQY50APNb70,5190
31
36
  titan_plugin_github/steps/__init__.py,sha256=3HQgbDBbWluKTm7LN6gxkE4gMYpBcaSMDkZpIFHek2c,287
32
- titan_plugin_github/steps/ai_pr_step.py,sha256=P4PugA0KAuRySmyseyE9q0lEfoBEvW6z4lF8V-Jy4fw,5663
33
- titan_plugin_github/steps/create_pr_step.py,sha256=Y8bbfFlJBlhTB3d7phJykxyzufGmklkfdedGaXbQQV4,4146
34
- titan_plugin_github/steps/github_prompt_steps.py,sha256=M0Ual6I-XralTkz4kCwa7z286AH_EJ2eLWaEx9SV76Y,8461
35
- titan_plugin_github/steps/issue_steps.py,sha256=iIV95-RrOGvmAY8b24vxtHBiGtJkjKm8kn7RHqH6ZM8,5731
36
- titan_plugin_github/steps/preview_step.py,sha256=ZJIhHtnZ8wEbYMoKlRi3xIRBRSDEk1L_NNNt_LTD0vo,1953
37
+ titan_plugin_github/steps/ai_pr_step.py,sha256=4QO-nUc55TJRsU7Yb7tSf1PeQPkgbmJNGSu11i-kVPY,8092
38
+ titan_plugin_github/steps/create_pr_step.py,sha256=vAjBJq36FgV0mKX30q8XN7zmeYENUkS0-m9obt3rVZ8,4079
39
+ titan_plugin_github/steps/github_prompt_steps.py,sha256=BsqeIksF1nEiIAcK0bw0fyC4-XSlNOGb-OZ9O-gZxOk,8343
40
+ titan_plugin_github/steps/issue_steps.py,sha256=RIZ5PG5jmMzeJgHievRKdldew2JcD_qlNQJsKYlN9ak,5608
41
+ titan_plugin_github/steps/preview_step.py,sha256=2NGPg3XuQbMWhrueufW3eIgKMs3FO1TvnSlhleI0cMU,1883
37
42
  titan_plugin_github/utils.py,sha256=P22O_OoJOLKA1BowwpdsDV_ZlE_8hhRLa6SxCgfiekE,2394
38
43
  titan_plugin_github/workflows/__previews__/__init__.py,sha256=t3X_YXZCc4XvlfCW37gdE5z_z0b8y_XCl15UjXA3dl8,38
39
44
  titan_plugin_github/workflows/__previews__/create_pr_ai_preview.py,sha256=Q6e6KJqj9UvtNK-D5xfESlUDoFMaaMhCOuFpWCQVNkw,4515
40
45
  titan_plugin_github/workflows/create-issue-ai.yaml,sha256=GDrZhLDNc8_DaPI3BKG4O5A4qJMP20Kkb5VeowIjSpM,818
41
- titan_plugin_github/workflows/create-pr-ai.yaml,sha256=6UUv_Z_xMAjEioHr-23nC7JKxFDmXm30ZLjhE00ZEiE,1186
46
+ titan_plugin_github/workflows/create-pr-ai.yaml,sha256=l2uP3esOFma3Or-REpdm4TX4xRoU5pX70S1gdw85Fe4,977
42
47
  titan_plugin_jira/__init__.py,sha256=b2-ut3LZmbu9lOjOL-9X8P27AC454XbxbrpoVSR6jgk,159
43
48
  titan_plugin_jira/agents/__init__.py,sha256=pbooB15t2HT38JUQX0zuNu4EeXhTd0G8gTdL9bNZpRQ,194
44
49
  titan_plugin_jira/agents/config_loader.py,sha256=SfRCW5xEW7ztFziJERcjsexp6Qup_8cuNiaXgC7As_k,7024
@@ -53,14 +58,16 @@ titan_plugin_jira/config/templates/issue_analysis.md.j2,sha256=xPznSjW3U8GXFtumR
53
58
  titan_plugin_jira/exceptions.py,sha256=NCOVDhynbVmyNFvi_zihl2JPTMr4twIsIb2Bk-v7ZJU,902
54
59
  titan_plugin_jira/formatters/__init__.py,sha256=W0OL5zwdagAbnQoYzEhf47xVtveZ1thC1IgTXbLjIsc,222
55
60
  titan_plugin_jira/formatters/markdown_formatter.py,sha256=JG-u4rslaA1PH9UQ8LEs7wwkC6GcoeyONU-mbNc_OXw,8174
56
- titan_plugin_jira/messages.py,sha256=WRy6zwBoXzhsZXF1sLnRWGSrjnOhKxvk6BStBRh94DU,5760
61
+ titan_plugin_jira/messages.py,sha256=P9MapggiAwQV7Vh68kCXghwCRyh4glmLFIMypXpx-9g,6572
57
62
  titan_plugin_jira/models.py,sha256=jjW-Rw7BOYzlmfwjAuVSk2Gzyozw2gyZX4LFFPtUqD4,1664
58
- titan_plugin_jira/plugin.py,sha256=q1yeK5iaqwo-jdCIVq3f6cwgYGDOsMkX0hoanaJChb0,9559
59
- titan_plugin_jira/steps/ai_analyze_issue_step.py,sha256=QZhaTjoGZ9N7OiSmicHZPmfGVaVtuGQYWtpOWInvfKI,4032
60
- titan_plugin_jira/steps/get_issue_step.py,sha256=mfPD1UUKgxBJ7m_Pw5cDlGEwmxQujwBGAl-XfrPCerA,2945
61
- titan_plugin_jira/steps/prompt_select_issue_step.py,sha256=b4VeQ9ibOiNtfBucopUe5L4JgKRedJgh-5rSZWlKRds,3374
62
- titan_plugin_jira/steps/search_saved_query_step.py,sha256=yV0k78SCBhk01nTxOqq6iErrYf8wCrT-wZx3eDKRO5Y,8772
63
- titan_plugin_jira/utils/__init__.py,sha256=CW540Bjbw33xaoiPlawEtNE7ncr4K3Pg_sFgZO_aIwM,238
63
+ titan_plugin_jira/plugin.py,sha256=mZNalmxobFb1eVFRa24fz5rYdFprQHdY6UxqtZMWcgo,9775
64
+ titan_plugin_jira/steps/ai_analyze_issue_step.py,sha256=lv8dgYUlzIPfliqH5ry0ApoKUPhbLhFu_qfF4A4yGVY,3977
65
+ titan_plugin_jira/steps/get_issue_step.py,sha256=NRp2CPztzrjZrsWp5xf2cnQcAEGgXMUUWDqvFm83vXs,2890
66
+ titan_plugin_jira/steps/list_versions_step.py,sha256=4AuvU-ldUdYWg--xLKWPywAruesTEYWvs9BhFyMJKGA,4800
67
+ titan_plugin_jira/steps/prompt_select_issue_step.py,sha256=NvbJDbDoe4xRIUwx7iAA4XBIfLk6DFKypsVo14xCH-U,3306
68
+ titan_plugin_jira/steps/search_jql_step.py,sha256=X_Q7ePG6CgzKRyfjoW37-yjMTxUKpJ9X2OGVy2wv0Nc,6588
69
+ titan_plugin_jira/steps/search_saved_query_step.py,sha256=_Z_UVJ7t7EVNUGcsw06vtwI150V2lyWaUoXUQ5ZhA7A,8661
70
+ titan_plugin_jira/utils/__init__.py,sha256=qEoY1dMk7rsx2pB8VRTrdPPXlZrjpCh30zWRJ3Cg3KI,239
64
71
  titan_plugin_jira/utils/issue_sorter.py,sha256=5l5K20ppb1zfhuEOyXXkmfV_zh1wTio1IUWMU2IBaRE,4012
65
72
  titan_plugin_jira/utils/saved_queries.py,sha256=bWFI1LSs8ydCRprcJTHk6DMrq1wXN27pb5zoYYVJpRw,5111
66
73
  titan_plugin_jira/workflows/analyze-jira-issues.yaml,sha256=VQ-_trGZGxvQUFsbXmrc8r2q9TIi5bfO-T4l6r-JyMw,802
@@ -93,21 +100,21 @@ titan_cli/core/plugins/plugin_registry.py,sha256=cuoarcNnsvLv30-01uGnjWwrqy2Jaf_
93
100
  titan_cli/core/secrets.py,sha256=4A4rszaie1wJh7xccetOO9rM_0jwYiIQIZVgCM0tCT4,4642
94
101
  titan_cli/core/workflows/__init__.py,sha256=b2jT3_wIwZtSNn0Qfc2nDXdPJyUb0Ovno5wqONuu-bU,691
95
102
  titan_cli/core/workflows/models.py,sha256=xMXmZKMTYRawUeuAO0hG5dF6QMRCM-TWFNfoveBxJpQ,4746
96
- titan_cli/core/workflows/project_step_source.py,sha256=TjPMi7Q5ZCWvW-F673fO55oJZWEwBSJ37FSB1gzbR6o,3510
103
+ titan_cli/core/workflows/project_step_source.py,sha256=YzEIrF9THHD6GZHvGkOCAhU8TOhI3WrfKeqrl0_dg2Y,5523
97
104
  titan_cli/core/workflows/workflow_exceptions.py,sha256=vgbMHtLMbksyALLEtUL8r9Vp9G-AqLja6ZARs8JyRAo,493
98
- titan_cli/core/workflows/workflow_filter_service.py,sha256=xqelzHQvBWo_Mm-IXvEd2VcBo-Fa55m3rdljwhxNm5Y,4588
105
+ titan_cli/core/workflows/workflow_filter_service.py,sha256=GXX0cxD-s5TvZO5hfUx7rrw326C6lYI-dXy14soq4so,4704
99
106
  titan_cli/core/workflows/workflow_registry.py,sha256=tmNeyDpy-qADz6JbvZtWHMjjlp5hi397wMMb-Ej6Z8g,17829
100
107
  titan_cli/core/workflows/workflow_sources.py,sha256=bPrTLMN4BPcPIHdklLmKB0_5fA2pq_u7oYnhdGcH5-c,11465
101
- titan_cli/engine/__init__.py,sha256=mtTPvwswXRgV-BtBc8zJUy0qNUocagstbsXKCT_DRPk,816
108
+ titan_cli/engine/__init__.py,sha256=YghcgJLqehQCXNK9CcQUk8s1BW4JeEykR4EUc20Caa4,872
102
109
  titan_cli/engine/builder.py,sha256=yjJnqanJJtr4hq0qLPRYYr_Hc28i9svnHPoyq2QUSiU,5265
103
110
  titan_cli/engine/context.py,sha256=6oY0RTnhBwnoDDC7dX1daE2E5__AG8WM8LvX-Ca55OM,2356
104
111
  titan_cli/engine/mock_context.py,sha256=ZcWnPJFffyLK2ghrVRcZz8hRFYE0Hpr5noh49yIqLes,4987
105
- titan_cli/engine/results.py,sha256=UKYYHPngRrzPoMPeGuTZLT689_WLNDrlopcrRxiM72s,2403
106
- titan_cli/engine/steps/ai_assistant_step.py,sha256=uyZw4Q1EzmDWmER9jJIdl9MgcidIbwl0KBTNZTEv92s,9281
112
+ titan_cli/engine/results.py,sha256=2lNqUxpQIYOIvSVtyGgGxEogzkI4TSUcZvZB4rl5yWY,3201
113
+ titan_cli/engine/steps/ai_assistant_step.py,sha256=lz07oYDt8OWIn-rk0485vmb8NJhXbbeSHZzIpGkK8g8,9128
107
114
  titan_cli/engine/steps/command_step.py,sha256=FH3mTzSqS9VuZPanmnmabBUJuYB6J1frIfkqwXlcrPE,3199
108
115
  titan_cli/engine/utils/__init__.py,sha256=fkj1-rKdKRQRktUhmYKw6VMDAmnMsILjxZGTRMMcWPY,73
109
116
  titan_cli/engine/utils/venv.py,sha256=drsu00VuQjiaS19Bq-WT3_IcrS3utj5T16840oSHE54,1063
110
- titan_cli/engine/workflow_executor.py,sha256=lZCgKeLwYU-nu3hZKz1ijBQwCAr3NA80QA6_0DsIA34,9298
117
+ titan_cli/engine/workflow_executor.py,sha256=inhT94lDhdzC-9vc-lT74MysBWM1mo2pp0LBgROd5FU,9608
111
118
  titan_cli/external_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
119
  titan_cli/external_cli/configs.py,sha256=thW7_8sRYC3t76Wsjvw20vovNOSz1MhVukzabfdFCOo,417
113
120
  titan_cli/external_cli/launcher.py,sha256=2t8UJmGwjGsrPk4PRSba_ZnYgEpZNrCvKUENvHxwaSw,2450
@@ -123,26 +130,32 @@ titan_cli/ui/tui/screens/base.py,sha256=ufVYBkVzetQxsPQTobN0HgUGdSB0ARfRtvo-02DS
123
130
  titan_cli/ui/tui/screens/cli_launcher.py,sha256=C9XWe1jUr0-Q_PGwchL6bVu9N2g-QLa83jJZGl7ucHI,4385
124
131
  titan_cli/ui/tui/screens/global_setup_wizard.py,sha256=gbkGMGXWJdfrIWvRvT5DDFZKKRWmf7nlGUuUkTtDiKI,12115
125
132
  titan_cli/ui/tui/screens/main_menu.py,sha256=5Z27Ny69PPJF0q6_H5zcNPOh8vrRDr_xgYFSmUbn244,4493
126
- titan_cli/ui/tui/screens/plugin_config_wizard.py,sha256=a8QIsVLGNNCLebJ7bWlRpftZU7yPhTRcf06XOLzFB4w,20416
133
+ titan_cli/ui/tui/screens/plugin_config_wizard.py,sha256=xKxgYwLJ6sNtdRSpx1JabSCaYTTNd4aFUFhLJb2KHoE,21296
127
134
  titan_cli/ui/tui/screens/plugin_management.py,sha256=2UvdxISzaiQBpm1OW1cpDrQS4ghTSC_87nlpx5Nrjhw,12356
128
135
  titan_cli/ui/tui/screens/project_setup_wizard.py,sha256=Q2cCHlzWpiLdtGUTHnkHnXapkxZahRAVTx5MI78sszU,24210
129
- titan_cli/ui/tui/screens/workflow_execution.py,sha256=YgxITarGnbTYx5ghVLrKDUO1mEcoQgkv-MZ652o5Oow,22610
130
- titan_cli/ui/tui/screens/workflows.py,sha256=lhpUzktq_60jEtT30OOEUnWR-NYuTIJIzi8fysP_IQc,8828
131
- titan_cli/ui/tui/textual_components.py,sha256=DQb4At1OXqooy6KrCKYgsAynvTLQGvaqSS4C-RpDlnY,19194
132
- titan_cli/ui/tui/textual_workflow_executor.py,sha256=FJ4poEnsoAWBETm6VmHMCpmqXX7cCxuB_2bOm-XXjMo,17458
133
- titan_cli/ui/tui/theme.py,sha256=FixTClXu7uEsqQWd_6Lc7pi7Rw7GccdK9j3YpUNY8K4,2068
134
- titan_cli/ui/tui/widgets/__init__.py,sha256=35V-c3XhxFbk5E83iwf-tQdhE49ni9VqCqKyoaV0n0E,742
136
+ titan_cli/ui/tui/screens/workflow_execution.py,sha256=up8jEvPe67ovsR5idplHOc8YVTvGiTnHQgxg6pGWGPA,22574
137
+ titan_cli/ui/tui/screens/workflows.py,sha256=6ZdQGpuiwvp3oQJq1UEAFK0FBkNOfHmcbq-uHVGLO40,9050
138
+ titan_cli/ui/tui/textual_components.py,sha256=LWfsOha5lOTlNuQ17Y8CMytmlwz5trtYb4gvtNQZTR0,22305
139
+ titan_cli/ui/tui/textual_workflow_executor.py,sha256=Z1DDhqBlwobRf-DBLGL3oKt_5mOF2dBrj_YwFz1nqWk,18704
140
+ titan_cli/ui/tui/theme.py,sha256=W0QBwGisnOv8qNkUARDB_xSV4w-f4J-pbs35xYe7SB0,2470
141
+ titan_cli/ui/tui/widgets/__init__.py,sha256=HhrmX2v30eLFZd5WTqN-BZzMjQA7Q0Oq-kPPZDxPRe4,1254
135
142
  titan_cli/ui/tui/widgets/button.py,sha256=Z7aRve1PSKpcQOsPo1db2GlKfwKddAVsU2KfhSRarKw,2143
136
143
  titan_cli/ui/tui/widgets/header.py,sha256=ZGZuhY4B15q56DcZItXjarOrDX0ASCPdDczIOrYXwJI,3043
144
+ titan_cli/ui/tui/widgets/multiline_input.py,sha256=kaxBXXuHoYzy_C6Lifl38k0AF_M8461QIgrjhV3d5M4,1043
137
145
  titan_cli/ui/tui/widgets/panel.py,sha256=jcLKZQXVqMGsvi7mVoTyKWijjrmXOgtC2ZuAkk2Ulgc,1818
146
+ titan_cli/ui/tui/widgets/prompt_choice.py,sha256=IjWAJxoJlME2TCzahgPN1dxTh5wHvQB6YNZ1GxNXesg,3746
147
+ titan_cli/ui/tui/widgets/prompt_input.py,sha256=T1ME84lQVYWtVbmzErniyEDbZr-WrhNYOAPFHX7q3kQ,2065
148
+ titan_cli/ui/tui/widgets/prompt_selection_list.py,sha256=Y-0ShaeaRcYfSAAPl5-E8rvykZ_RkJjcZXslZecgmE8,4517
149
+ titan_cli/ui/tui/widgets/prompt_textarea.py,sha256=drOyWUnj5gU4XjJwJcCbanwFfT2OrMjPlajkyCI3M04,2664
138
150
  titan_cli/ui/tui/widgets/status_bar.py,sha256=XiRFpoOb9DPHStaMddNIAaYmHIzg8ZkmyBzvWy4CrZg,3361
139
151
  titan_cli/ui/tui/widgets/step_container.py,sha256=yY9bMgc2Yyr3BFnpZrSbCixAAzt4gdTQYdAKnsDnQ3s,1612
152
+ titan_cli/ui/tui/widgets/styled_option_list.py,sha256=GPKaP2z0jcIJI7Xo3sY58b8AdTEU4OoLPDRyA1AQ6_0,3219
140
153
  titan_cli/ui/tui/widgets/table.py,sha256=uWXyUda6mvflBybrrUSZh5Nvf794ege8SUe_0D24y3c,1668
141
- titan_cli/ui/tui/widgets/text.py,sha256=p5h2V9w-JmPigwUFn-ky_D7gyYiix_93FJNqNmCYNHY,4057
154
+ titan_cli/ui/tui/widgets/text.py,sha256=ewN7zZjsa5RzGKQh6tD3Q-b5a6pYMakC5IT_AXj7014,2400
142
155
  titan_cli/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
156
  titan_cli/utils/autoupdate.py,sha256=Tq3SJp3iOMNONQZOw-48G6AmpKrPOyWV9RxuCA03q4M,4151
144
- titan_cli-0.1.5.dist-info/METADATA,sha256=z5RajTVvGyMVvUS5AyZznDINWmzqqqyABxNaHEY086E,4662
145
- titan_cli-0.1.5.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
146
- titan_cli-0.1.5.dist-info/entry_points.txt,sha256=i_Zucivhsx6FcrkKDQS00MJ_Nwse-nAEkuksCcs_Ym8,186
147
- titan_cli-0.1.5.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
148
- titan_cli-0.1.5.dist-info/RECORD,,
157
+ titan_cli-0.1.7.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
158
+ titan_cli-0.1.7.dist-info/METADATA,sha256=9qBfqpEIbxiOwOl_uVxEGPIwmXq9-CRIOZWFIRyOkWs,4492
159
+ titan_cli-0.1.7.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
160
+ titan_cli-0.1.7.dist-info/entry_points.txt,sha256=i_Zucivhsx6FcrkKDQS00MJ_Nwse-nAEkuksCcs_Ym8,186
161
+ titan_cli-0.1.7.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.1
2
+ Generator: poetry-core 1.8.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -109,6 +109,27 @@ class GitClient:
109
109
  """
110
110
  return self._run_command(["git", "rev-parse", "--abbrev-ref", "HEAD"])
111
111
 
112
+ def get_current_commit(self) -> str:
113
+ """
114
+ Get current commit SHA (HEAD)
115
+
116
+ Returns:
117
+ Full SHA of current commit
118
+ """
119
+ return self._run_command(["git", "rev-parse", "HEAD"])
120
+
121
+ def get_commit_sha(self, ref: str) -> str:
122
+ """
123
+ Get commit SHA for any git ref (branch, tag, remote branch, etc.)
124
+
125
+ Args:
126
+ ref: Git reference (e.g., "HEAD", "develop", "origin/main", "v1.0.0")
127
+
128
+ Returns:
129
+ Full SHA of the commit
130
+ """
131
+ return self._run_command(["git", "rev-parse", ref])
132
+
112
133
  def get_status(self) -> GitStatus:
113
134
  """
114
135
  Get repository status
@@ -282,7 +303,7 @@ class GitClient:
282
303
  """
283
304
  self._run_command(["git", "branch", branch_name, start_point])
284
305
 
285
- def commit(self, message: str, all: bool = False, no_verify: bool = False) -> str:
306
+ def commit(self, message: str, all: bool = False, no_verify: bool = True) -> str:
286
307
  """
287
308
  Create a commit
288
309
 
@@ -390,12 +411,13 @@ class GitClient:
390
411
 
391
412
  self._run_command(args)
392
413
 
393
- def fetch(self, remote: str = "origin", all: bool = False) -> None:
414
+ def fetch(self, remote: str = "origin", branch: Optional[str] = None, all: bool = False) -> None:
394
415
  """
395
416
  Fetch from remote
396
417
 
397
418
  Args:
398
419
  remote: Remote name
420
+ branch: Specific branch to fetch (optional)
399
421
  all: Fetch from all remotes
400
422
  """
401
423
  args = ["git", "fetch"]
@@ -404,6 +426,8 @@ class GitClient:
404
426
  args.append("--all")
405
427
  else:
406
428
  args.append(remote)
429
+ if branch:
430
+ args.append(branch)
407
431
 
408
432
  self._run_command(args)
409
433
 
@@ -736,6 +760,39 @@ class GitClient:
736
760
  except GitCommandError:
737
761
  return ""
738
762
 
763
+ def get_uncommitted_diff_stat(self) -> str:
764
+ """
765
+ Get diff stat summary of uncommitted changes (git diff --stat HEAD).
766
+
767
+ Returns a summary showing files changed, insertions, and deletions.
768
+
769
+ Returns:
770
+ Diff stat output as string
771
+ """
772
+ try:
773
+ return self._run_command(["git", "diff", "--stat", "HEAD"], check=False)
774
+ except GitCommandError:
775
+ return ""
776
+
777
+ def get_branch_diff_stat(self, base_branch: str, head_branch: str) -> str:
778
+ """
779
+ Get diff stat summary between two branches.
780
+
781
+ Args:
782
+ base_branch: Base branch name
783
+ head_branch: Head branch name
784
+
785
+ Returns:
786
+ Diff stat output as string
787
+ """
788
+ try:
789
+ return self._run_command(
790
+ ["git", "diff", "--stat", f"{base_branch}...{head_branch}"],
791
+ check=False
792
+ )
793
+ except GitCommandError:
794
+ return ""
795
+
739
796
  def get_branch_commits(self, base_branch: str, head_branch: str) -> list[str]:
740
797
  """
741
798
  Get list of commits in head_branch that are not in base_branch.
@@ -101,6 +101,11 @@ class GitPlugin(TitanPlugin):
101
101
  from .steps.branch_steps import get_current_branch_step, get_base_branch_step
102
102
  from .steps.ai_commit_message_step import ai_generate_commit_message
103
103
  from .steps.diff_summary_step import show_uncommitted_diff_summary, show_branch_diff_summary
104
+ from .steps.save_current_branch_step import save_current_branch_step
105
+ from .steps.restore_original_branch_step import restore_original_branch_step
106
+ from .steps.checkout_step import checkout_branch_step
107
+ from .steps.pull_step import pull_step
108
+ from .steps.create_branch_step import create_branch_step
104
109
 
105
110
  return {
106
111
  "get_status": get_git_status_step,
@@ -111,6 +116,11 @@ class GitPlugin(TitanPlugin):
111
116
  "ai_generate_commit_message": ai_generate_commit_message,
112
117
  "show_uncommitted_diff_summary": show_uncommitted_diff_summary,
113
118
  "show_branch_diff_summary": show_branch_diff_summary,
119
+ "save_current_branch": save_current_branch_step,
120
+ "restore_original_branch": restore_original_branch_step,
121
+ "checkout": checkout_branch_step,
122
+ "pull": pull_step,
123
+ "create_branch": create_branch_step,
114
124
  }
115
125
 
116
126
  @property
@@ -33,7 +33,7 @@ def ai_generate_commit_message(ctx: WorkflowContext) -> WorkflowResult:
33
33
 
34
34
  # Check if AI is configured
35
35
  if not ctx.ai or not ctx.ai.is_available():
36
- ctx.textual.text(msg.Steps.AICommitMessage.AI_NOT_CONFIGURED, markup="dim")
36
+ ctx.textual.dim_text(msg.Steps.AICommitMessage.AI_NOT_CONFIGURED)
37
37
  ctx.textual.end_step("skip")
38
38
  return Skip(msg.Steps.AICommitMessage.AI_NOT_CONFIGURED)
39
39
 
@@ -45,13 +45,13 @@ def ai_generate_commit_message(ctx: WorkflowContext) -> WorkflowResult:
45
45
  # Get git status
46
46
  git_status = ctx.get('git_status')
47
47
  if not git_status or git_status.is_clean:
48
- ctx.textual.text(msg.Steps.AICommitMessage.NO_CHANGES_TO_COMMIT, markup="dim")
48
+ ctx.textual.dim_text(msg.Steps.AICommitMessage.NO_CHANGES_TO_COMMIT)
49
49
  ctx.textual.end_step("skip")
50
50
  return Skip(msg.Steps.AICommitMessage.NO_CHANGES_TO_COMMIT)
51
51
 
52
52
  try:
53
53
  # Get diff of uncommitted changes
54
- ctx.textual.text(msg.Steps.AICommitMessage.ANALYZING_CHANGES, markup="dim")
54
+ ctx.textual.dim_text(msg.Steps.AICommitMessage.ANALYZING_CHANGES)
55
55
 
56
56
  # Get diff of all uncommitted changes
57
57
  diff_text = ctx.git.get_uncommitted_diff()
@@ -125,12 +125,12 @@ Return ONLY the single-line commit message, absolutely nothing else."""
125
125
 
126
126
  # Show preview to user
127
127
  ctx.textual.text("") # spacing
128
- ctx.textual.text(msg.Steps.AICommitMessage.GENERATED_MESSAGE_TITLE, markup="bold")
129
- ctx.textual.text(f" {commit_message}", markup="bold cyan")
128
+ ctx.textual.bold_text(msg.Steps.AICommitMessage.GENERATED_MESSAGE_TITLE)
129
+ ctx.textual.bold_primary_text(f" {commit_message}")
130
130
 
131
131
  # Warn if message is too long
132
132
  if len(commit_message) > 72:
133
- ctx.textual.text(msg.Steps.AICommitMessage.MESSAGE_LENGTH_WARNING.format(length=len(commit_message)), markup="yellow")
133
+ ctx.textual.warning_text(msg.Steps.AICommitMessage.MESSAGE_LENGTH_WARNING.format(length=len(commit_message)))
134
134
 
135
135
  ctx.textual.text("") # spacing
136
136
 
@@ -165,8 +165,8 @@ Return ONLY the single-line commit message, absolutely nothing else."""
165
165
  )
166
166
 
167
167
  except Exception as e:
168
- ctx.textual.text(msg.Steps.AICommitMessage.GENERATION_FAILED.format(e=e), markup="yellow")
169
- ctx.textual.text(msg.Steps.AICommitMessage.FALLBACK_TO_MANUAL, markup="dim")
168
+ ctx.textual.warning_text(msg.Steps.AICommitMessage.GENERATION_FAILED.format(e=e))
169
+ ctx.textual.dim_text(msg.Steps.AICommitMessage.FALLBACK_TO_MANUAL)
170
170
 
171
171
  ctx.textual.end_step("skip")
172
172
  return Skip(msg.Steps.AICommitMessage.GENERATION_FAILED.format(e=e))
@@ -24,14 +24,14 @@ def get_current_branch_step(ctx: WorkflowContext) -> WorkflowResult:
24
24
 
25
25
  if not ctx.git:
26
26
  error_msg = msg.Steps.Status.GIT_CLIENT_NOT_AVAILABLE
27
- ctx.textual.text(error_msg, markup="red")
27
+ ctx.textual.error_text(error_msg)
28
28
  ctx.textual.end_step("error")
29
29
  return Error(error_msg)
30
30
 
31
31
  try:
32
32
  current_branch = ctx.git.get_current_branch()
33
33
  success_msg = msg.Steps.Branch.GET_CURRENT_BRANCH_SUCCESS.format(branch=current_branch)
34
- ctx.textual.text(success_msg, markup="green")
34
+ ctx.textual.success_text(success_msg)
35
35
  ctx.textual.end_step("success")
36
36
  return Success(
37
37
  success_msg,
@@ -39,7 +39,7 @@ def get_current_branch_step(ctx: WorkflowContext) -> WorkflowResult:
39
39
  )
40
40
  except Exception as e:
41
41
  error_msg = msg.Steps.Branch.GET_CURRENT_BRANCH_FAILED.format(e=e)
42
- ctx.textual.text(error_msg, markup="red")
42
+ ctx.textual.error_text(error_msg)
43
43
  ctx.textual.end_step("error")
44
44
  return Error(error_msg, exception=e)
45
45
 
@@ -65,14 +65,14 @@ def get_base_branch_step(ctx: WorkflowContext) -> WorkflowResult:
65
65
 
66
66
  if not ctx.git:
67
67
  error_msg = msg.Steps.Status.GIT_CLIENT_NOT_AVAILABLE
68
- ctx.textual.text(error_msg, markup="red")
68
+ ctx.textual.error_text(error_msg)
69
69
  ctx.textual.end_step("error")
70
70
  return Error(error_msg)
71
71
 
72
72
  try:
73
73
  base_branch = ctx.git.main_branch
74
74
  success_msg = msg.Steps.Branch.GET_BASE_BRANCH_SUCCESS.format(branch=base_branch)
75
- ctx.textual.text(success_msg, markup="green")
75
+ ctx.textual.success_text(success_msg)
76
76
  ctx.textual.end_step("success")
77
77
  return Success(
78
78
  success_msg,
@@ -80,6 +80,6 @@ def get_base_branch_step(ctx: WorkflowContext) -> WorkflowResult:
80
80
  )
81
81
  except Exception as e:
82
82
  error_msg = msg.Steps.Branch.GET_BASE_BRANCH_FAILED.format(e=e)
83
- ctx.textual.text(error_msg, markup="red")
83
+ ctx.textual.error_text(error_msg)
84
84
  ctx.textual.end_step("error")
85
85
  return Error(error_msg, exception=e)