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.
- titan_cli/core/workflows/project_step_source.py +52 -7
- titan_cli/core/workflows/workflow_filter_service.py +6 -4
- titan_cli/engine/__init__.py +5 -1
- titan_cli/engine/results.py +31 -1
- titan_cli/engine/steps/ai_assistant_step.py +18 -18
- titan_cli/engine/workflow_executor.py +7 -2
- titan_cli/ui/tui/screens/plugin_config_wizard.py +16 -0
- titan_cli/ui/tui/screens/workflow_execution.py +22 -24
- titan_cli/ui/tui/screens/workflows.py +8 -4
- titan_cli/ui/tui/textual_components.py +293 -189
- titan_cli/ui/tui/textual_workflow_executor.py +30 -2
- titan_cli/ui/tui/theme.py +34 -5
- titan_cli/ui/tui/widgets/__init__.py +15 -0
- titan_cli/ui/tui/widgets/multiline_input.py +32 -0
- titan_cli/ui/tui/widgets/prompt_choice.py +138 -0
- titan_cli/ui/tui/widgets/prompt_input.py +74 -0
- titan_cli/ui/tui/widgets/prompt_selection_list.py +150 -0
- titan_cli/ui/tui/widgets/prompt_textarea.py +87 -0
- titan_cli/ui/tui/widgets/styled_option_list.py +107 -0
- titan_cli/ui/tui/widgets/text.py +51 -130
- {titan_cli-0.1.5.dist-info → titan_cli-0.1.7.dist-info}/METADATA +5 -10
- {titan_cli-0.1.5.dist-info → titan_cli-0.1.7.dist-info}/RECORD +54 -41
- {titan_cli-0.1.5.dist-info → titan_cli-0.1.7.dist-info}/WHEEL +1 -1
- titan_plugin_git/clients/git_client.py +59 -2
- titan_plugin_git/plugin.py +10 -0
- titan_plugin_git/steps/ai_commit_message_step.py +8 -8
- titan_plugin_git/steps/branch_steps.py +6 -6
- titan_plugin_git/steps/checkout_step.py +66 -0
- titan_plugin_git/steps/commit_step.py +3 -3
- titan_plugin_git/steps/create_branch_step.py +131 -0
- titan_plugin_git/steps/diff_summary_step.py +11 -13
- titan_plugin_git/steps/pull_step.py +70 -0
- titan_plugin_git/steps/push_step.py +3 -3
- titan_plugin_git/steps/restore_original_branch_step.py +97 -0
- titan_plugin_git/steps/save_current_branch_step.py +82 -0
- titan_plugin_git/steps/status_step.py +23 -13
- titan_plugin_git/workflows/commit-ai.yaml +4 -3
- titan_plugin_github/steps/ai_pr_step.py +90 -22
- titan_plugin_github/steps/create_pr_step.py +8 -8
- titan_plugin_github/steps/github_prompt_steps.py +13 -13
- titan_plugin_github/steps/issue_steps.py +14 -15
- titan_plugin_github/steps/preview_step.py +8 -8
- titan_plugin_github/workflows/create-pr-ai.yaml +1 -11
- titan_plugin_jira/messages.py +12 -0
- titan_plugin_jira/plugin.py +4 -0
- titan_plugin_jira/steps/ai_analyze_issue_step.py +6 -6
- titan_plugin_jira/steps/get_issue_step.py +7 -7
- titan_plugin_jira/steps/list_versions_step.py +133 -0
- titan_plugin_jira/steps/prompt_select_issue_step.py +8 -9
- titan_plugin_jira/steps/search_jql_step.py +191 -0
- titan_plugin_jira/steps/search_saved_query_step.py +13 -13
- titan_plugin_jira/utils/__init__.py +1 -1
- {titan_cli-0.1.5.dist-info/licenses → titan_cli-0.1.7.dist-info}/LICENSE +0 -0
- {titan_cli-0.1.5.dist-info → titan_cli-0.1.7.dist-info}/entry_points.txt +0 -0
titan_cli/ui/tui/widgets/text.py
CHANGED
|
@@ -1,177 +1,98 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Text Widgets
|
|
3
3
|
|
|
4
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
58
|
+
pass
|
|
138
59
|
|
|
139
60
|
|
|
140
61
|
class BoldText(Static):
|
|
141
62
|
"""Text widget with bold styling."""
|
|
142
|
-
|
|
63
|
+
pass
|
|
143
64
|
|
|
144
65
|
|
|
145
66
|
class PrimaryText(Static):
|
|
146
67
|
"""Text widget with primary color."""
|
|
147
|
-
|
|
68
|
+
pass
|
|
148
69
|
|
|
149
70
|
|
|
150
71
|
class BoldPrimaryText(Static):
|
|
151
72
|
"""Text widget with bold primary color."""
|
|
152
|
-
|
|
73
|
+
pass
|
|
153
74
|
|
|
154
75
|
|
|
155
76
|
class SuccessText(Static):
|
|
156
77
|
"""Text widget with success/green color."""
|
|
157
|
-
|
|
78
|
+
pass
|
|
158
79
|
|
|
159
80
|
|
|
160
81
|
class ErrorText(Static):
|
|
161
82
|
"""Text widget with error/red color."""
|
|
162
|
-
|
|
83
|
+
pass
|
|
163
84
|
|
|
164
85
|
|
|
165
86
|
class WarningText(Static):
|
|
166
87
|
"""Text widget with warning/yellow color."""
|
|
167
|
-
|
|
88
|
+
pass
|
|
168
89
|
|
|
169
90
|
|
|
170
91
|
class ItalicText(Static):
|
|
171
92
|
"""Text widget with italic styling."""
|
|
172
|
-
|
|
93
|
+
pass
|
|
173
94
|
|
|
174
95
|
|
|
175
96
|
class DimItalicText(Static):
|
|
176
97
|
"""Text widget with dim italic styling."""
|
|
177
|
-
|
|
98
|
+
pass
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: titan-cli
|
|
3
|
-
Version: 0.1.
|
|
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:
|
|
9
|
-
Author-email:
|
|
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=
|
|
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=
|
|
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=
|
|
10
|
-
titan_plugin_git/steps/branch_steps.py,sha256=
|
|
11
|
-
titan_plugin_git/steps/
|
|
12
|
-
titan_plugin_git/steps/
|
|
13
|
-
titan_plugin_git/steps/
|
|
14
|
-
titan_plugin_git/steps/
|
|
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=
|
|
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=
|
|
33
|
-
titan_plugin_github/steps/create_pr_step.py,sha256=
|
|
34
|
-
titan_plugin_github/steps/github_prompt_steps.py,sha256=
|
|
35
|
-
titan_plugin_github/steps/issue_steps.py,sha256=
|
|
36
|
-
titan_plugin_github/steps/preview_step.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
59
|
-
titan_plugin_jira/steps/ai_analyze_issue_step.py,sha256=
|
|
60
|
-
titan_plugin_jira/steps/get_issue_step.py,sha256=
|
|
61
|
-
titan_plugin_jira/steps/
|
|
62
|
-
titan_plugin_jira/steps/
|
|
63
|
-
titan_plugin_jira/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
106
|
-
titan_cli/engine/steps/ai_assistant_step.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
130
|
-
titan_cli/ui/tui/screens/workflows.py,sha256=
|
|
131
|
-
titan_cli/ui/tui/textual_components.py,sha256=
|
|
132
|
-
titan_cli/ui/tui/textual_workflow_executor.py,sha256=
|
|
133
|
-
titan_cli/ui/tui/theme.py,sha256=
|
|
134
|
-
titan_cli/ui/tui/widgets/__init__.py,sha256=
|
|
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=
|
|
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.
|
|
145
|
-
titan_cli-0.1.
|
|
146
|
-
titan_cli-0.1.
|
|
147
|
-
titan_cli-0.1.
|
|
148
|
-
titan_cli-0.1.
|
|
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,,
|
|
@@ -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 =
|
|
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.
|
titan_plugin_git/plugin.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
129
|
-
ctx.textual.
|
|
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.
|
|
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.
|
|
169
|
-
ctx.textual.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
83
|
+
ctx.textual.error_text(error_msg)
|
|
84
84
|
ctx.textual.end_step("error")
|
|
85
85
|
return Error(error_msg, exception=e)
|