feat(claude-do): merge feat(ui): WorkConsole, DescriptionStepsCard und ROADBLOCK-La

ClaudeDo-Task: 6c91f950-f93b-44be-abb4-b12f65fb68ba
This commit is contained in:
mika kuns
2026-09-10 13:35:14 +02:00
5 changed files with 85 additions and 27 deletions
+30 -1
View File
@@ -307,7 +307,36 @@
"steps": "Schritte", "steps": "Schritte",
"files": "Dateien" "files": "Dateien"
}, },
"emptyState": "Wähle eine Aufgabe aus, um Details zu sehen" "emptyState": "Wähle eine Aufgabe aus, um Details zu sehen",
"roadblockLabel": "ROADBLOCK",
"stepsCard": {
"preview": "Vorschau",
"edit": "Bearbeiten",
"addStepPlaceholder": "Schritt hinzufügen…"
},
"workConsole": {
"continue": "Fortsetzen",
"resetAndRetry": "Zurücksetzen & erneut versuchen",
"tabOutput": "Ausgabe",
"tabGit": "Git",
"tabSession": "Sitzung",
"outcomeLabel": "ERGEBNIS",
"reviewLabel": "REVIEW",
"mergeLabel": "MERGE",
"targetBranch": "Zielbranch",
"openDiff": "Diff öffnen",
"worktree": "Worktree",
"reviewCombinedDiff": "Kombinierten Diff prüfen",
"openDiffHint": "Diff öffnen, um Mergen freizuschalten",
"approveMerge": "Genehmigen & Mergen",
"park": "Parken",
"parkTip": "Zurückstellen — zurück auf Leerlauf, Worktree bleibt erhalten",
"cancel": "Abbrechen",
"resetDiscardBranch": "Zurücksetzen (Branch verwerfen)…",
"submitForReviewHint": "Von Hand daran gearbeitet? Den Worktree zum Review einreichen, um ihn zu mergen.",
"submitForReview": "Zum Review einreichen",
"outcomesLabel": "ERGEBNISSE"
}
}, },
"agent": { "agent": {
"openWorktreeTip": "Worktree im Datei-Explorer öffnen — benötigt einen aktiven Worktree", "openWorktreeTip": "Worktree im Datei-Explorer öffnen — benötigt einen aktiven Worktree",
+30 -1
View File
@@ -307,7 +307,36 @@
"steps": "Steps", "steps": "Steps",
"files": "Files" "files": "Files"
}, },
"emptyState": "Select a task to see its details" "emptyState": "Select a task to see its details",
"roadblockLabel": "ROADBLOCK",
"stepsCard": {
"preview": "Preview",
"edit": "Edit",
"addStepPlaceholder": "Add step…"
},
"workConsole": {
"continue": "Continue",
"resetAndRetry": "Reset & Retry",
"tabOutput": "Output",
"tabGit": "Git",
"tabSession": "Session",
"outcomeLabel": "OUTCOME",
"reviewLabel": "REVIEW",
"mergeLabel": "MERGE",
"targetBranch": "Target branch",
"openDiff": "Open Diff",
"worktree": "Worktree",
"reviewCombinedDiff": "Review Combined Diff",
"openDiffHint": "Open the diff to enable merge",
"approveMerge": "Approve & Merge",
"park": "Park",
"parkTip": "Set aside — back to Idle, keeps the worktree",
"cancel": "Cancel",
"resetDiscardBranch": "Reset (discard branch)…",
"submitForReviewHint": "Worked on this by hand? Submit the worktree for review to merge it.",
"submitForReview": "Submit for review",
"outcomesLabel": "OUTCOMES"
}
}, },
"agent": { "agent": {
"openWorktreeTip": "Open worktree in file explorer — requires an active worktree", "openWorktreeTip": "Open worktree in file explorer — requires an active worktree",
@@ -88,8 +88,8 @@
ToolTip.Tip="{loc:Tr details.toggleEditPreviewTip}" ToolTip.Tip="{loc:Tr details.toggleEditPreviewTip}"
Command="{Binding ToggleEditDescriptionCommand}"> Command="{Binding ToggleEditDescriptionCommand}">
<Panel> <Panel>
<TextBlock Text="Preview" IsVisible="{Binding IsEditingDescription}"/> <TextBlock Text="{loc:Tr details.stepsCard.preview}" IsVisible="{Binding IsEditingDescription}"/>
<TextBlock Text="Edit" IsVisible="{Binding !IsEditingDescription}"/> <TextBlock Text="{loc:Tr details.stepsCard.edit}" IsVisible="{Binding !IsEditingDescription}"/>
</Panel> </Panel>
</Button> </Button>
@@ -123,7 +123,7 @@
<!-- Steps --> <!-- Steps -->
<StackPanel IsVisible="{Binding IsStepsSection}" Spacing="6"> <StackPanel IsVisible="{Binding IsStepsSection}" Spacing="6">
<TextBox Text="{Binding NewSubtaskTitle, Mode=TwoWay}" <TextBox Text="{Binding NewSubtaskTitle, Mode=TwoWay}"
PlaceholderText="Add step…" PlaceholderText="{loc:Tr details.stepsCard.addStepPlaceholder}"
Padding="8" Padding="8"
Background="{DynamicResource Surface3Brush}" Background="{DynamicResource Surface3Brush}"
BorderBrush="{DynamicResource LineBrush}" BorderBrush="{DynamicResource LineBrush}"
@@ -172,12 +172,12 @@
TextWrapping="Wrap" VerticalAlignment="Center" /> TextWrapping="Wrap" VerticalAlignment="Center" />
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<Button Classes="btn accent" Content="Continue" <Button Classes="btn accent" Content="{loc:Tr details.workConsole.continue}"
Command="{Binding ContinueCommand}" Command="{Binding ContinueCommand}"
IsVisible="{Binding ShowContinue}" IsVisible="{Binding ShowContinue}"
ToolTip.Tip="{loc:Tr session.continueNoSessionTip}" ToolTip.Tip="{loc:Tr session.continueNoSessionTip}"
ToolTip.ShowOnDisabled="True" /> ToolTip.ShowOnDisabled="True" />
<Button Classes="btn" Content="Reset &amp; Retry" <Button Classes="btn" Content="{loc:Tr details.workConsole.resetAndRetry}"
Command="{Binding ResetAndRetryCommand}" Command="{Binding ResetAndRetryCommand}"
IsVisible="{Binding ShowResetAndRetry}" IsVisible="{Binding ShowResetAndRetry}"
ToolTip.Tip="{loc:Tr session.resetAndRetryInteractiveTip}" ToolTip.Tip="{loc:Tr session.resetAndRetryInteractiveTip}"
@@ -194,7 +194,7 @@
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<Button Classes="tab-btn" <Button Classes="tab-btn"
Classes.active="{Binding IsOutputTab}" Classes.active="{Binding IsOutputTab}"
Content="Output" Content="{loc:Tr details.workConsole.tabOutput}"
Command="{Binding SelectTabCommand}" Command="{Binding SelectTabCommand}"
CommandParameter="output" /> CommandParameter="output" />
<Button Classes="tab-btn" <Button Classes="tab-btn"
@@ -202,7 +202,7 @@
Command="{Binding SelectTabCommand}" Command="{Binding SelectTabCommand}"
CommandParameter="git"> CommandParameter="git">
<StackPanel Orientation="Horizontal" Spacing="6"> <StackPanel Orientation="Horizontal" Spacing="6">
<TextBlock Text="Git" VerticalAlignment="Center" /> <TextBlock Text="{loc:Tr details.workConsole.tabGit}" VerticalAlignment="Center" />
<!-- Review-pending dot: where to act when a task awaits review --> <!-- Review-pending dot: where to act when a task awaits review -->
<Ellipse Width="6" Height="6" VerticalAlignment="Center" <Ellipse Width="6" Height="6" VerticalAlignment="Center"
Fill="{DynamicResource AccentBrush}" Fill="{DynamicResource AccentBrush}"
@@ -211,7 +211,7 @@
</Button> </Button>
<Button Classes="tab-btn" <Button Classes="tab-btn"
Classes.active="{Binding IsSessionTab}" Classes.active="{Binding IsSessionTab}"
Content="Session" Content="{loc:Tr details.workConsole.tabSession}"
IsVisible="{Binding HasChildOutcomes}" IsVisible="{Binding HasChildOutcomes}"
Command="{Binding SelectTabCommand}" Command="{Binding SelectTabCommand}"
CommandParameter="session" /> CommandParameter="session" />
@@ -233,7 +233,7 @@
BorderBrush="{DynamicResource LineBrush}" BorderBrush="{DynamicResource LineBrush}"
BorderThickness="1" CornerRadius="8"> BorderThickness="1" CornerRadius="8">
<StackPanel Spacing="6"> <StackPanel Spacing="6">
<TextBlock Classes="section-label" Text="OUTCOME" /> <TextBlock Classes="section-label" Text="{loc:Tr details.workConsole.outcomeLabel}" />
<ScrollViewer MaxHeight="160" VerticalScrollBarVisibility="Auto"> <ScrollViewer MaxHeight="160" VerticalScrollBarVisibility="Auto">
<SelectableTextBlock Text="{Binding SessionOutcome}" <SelectableTextBlock Text="{Binding SessionOutcome}"
TextWrapping="Wrap" TextWrapping="Wrap"
@@ -309,9 +309,9 @@
<!-- Merge controls — shown whenever there's a worktree / unit to merge. <!-- Merge controls — shown whenever there's a worktree / unit to merge.
Header reads REVIEW while a decision is pending, otherwise MERGE. --> Header reads REVIEW while a decision is pending, otherwise MERGE. -->
<StackPanel Spacing="14" IsVisible="{Binding Merge.ShowMergeSection}"> <StackPanel Spacing="14" IsVisible="{Binding Merge.ShowMergeSection}">
<TextBlock Classes="section-label" Text="REVIEW" <TextBlock Classes="section-label" Text="{loc:Tr details.workConsole.reviewLabel}"
IsVisible="{Binding IsWaitingForReview}" /> IsVisible="{Binding IsWaitingForReview}" />
<TextBlock Classes="section-label" Text="MERGE" <TextBlock Classes="section-label" Text="{loc:Tr details.workConsole.mergeLabel}"
IsVisible="{Binding !IsWaitingForReview}" /> IsVisible="{Binding !IsWaitingForReview}" />
<!-- Change summary (review only) --> <!-- Change summary (review only) -->
@@ -323,7 +323,7 @@
<!-- Target branch + pre-flight mergeability --> <!-- Target branch + pre-flight mergeability -->
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Target branch" /> <TextBlock Classes="field-label" Text="{loc:Tr details.workConsole.targetBranch}" />
<ComboBox ItemsSource="{Binding Merge.MergeTargetBranches}" <ComboBox ItemsSource="{Binding Merge.MergeTargetBranches}"
SelectedItem="{Binding Merge.SelectedMergeTarget, Mode=TwoWay}" SelectedItem="{Binding Merge.SelectedMergeTarget, Mode=TwoWay}"
HorizontalAlignment="Stretch" /> HorizontalAlignment="Stretch" />
@@ -344,7 +344,7 @@
<!-- Inspect: diff / worktree / combined diff --> <!-- Inspect: diff / worktree / combined diff -->
<WrapPanel Orientation="Horizontal"> <WrapPanel Orientation="Horizontal">
<Button Classes="btn" Content="Open Diff" Margin="0,0,8,8" <Button Classes="btn" Content="{loc:Tr details.workConsole.openDiff}" Margin="0,0,8,8"
ToolTip.Tip="{loc:Tr agent.openDiffTip}" ToolTip.Tip="{loc:Tr agent.openDiffTip}"
ToolTip.ShowOnDisabled="True" ToolTip.ShowOnDisabled="True"
Command="{Binding Merge.OpenDiffCommand}" /> Command="{Binding Merge.OpenDiffCommand}" />
@@ -353,11 +353,11 @@
ToolTip.ShowOnDisabled="True" ToolTip.ShowOnDisabled="True"
Command="{Binding Merge.OpenWorktreeCommand}"> Command="{Binding Merge.OpenWorktreeCommand}">
<StackPanel Orientation="Horizontal" Spacing="5"> <StackPanel Orientation="Horizontal" Spacing="5">
<TextBlock Text="Worktree" /> <TextBlock Text="{loc:Tr details.workConsole.worktree}" />
<PathIcon Data="{StaticResource Icon.ArrowOut}" Width="11" Height="11" /> <PathIcon Data="{StaticResource Icon.ArrowOut}" Width="11" Height="11" />
</StackPanel> </StackPanel>
</Button> </Button>
<Button Classes="btn" Content="Review Combined Diff" Margin="0,0,8,8" <Button Classes="btn" Content="{loc:Tr details.workConsole.reviewCombinedDiff}" Margin="0,0,8,8"
ToolTip.Tip="{loc:Tr agent.reviewCombinedDiffTip}" ToolTip.Tip="{loc:Tr agent.reviewCombinedDiffTip}"
ToolTip.ShowOnDisabled="True" ToolTip.ShowOnDisabled="True"
Command="{Binding Merge.ReviewCombinedDiffCommand}" /> Command="{Binding Merge.ReviewCombinedDiffCommand}" />
@@ -377,7 +377,7 @@
Foreground="{DynamicResource AmberBrush}" VerticalAlignment="Center" /> Foreground="{DynamicResource AmberBrush}" VerticalAlignment="Center" />
<TextBlock Classes="meta" VerticalAlignment="Center" <TextBlock Classes="meta" VerticalAlignment="Center"
Foreground="{DynamicResource AmberBrush}" Foreground="{DynamicResource AmberBrush}"
Text="Open the diff to enable merge" /> Text="{loc:Tr details.workConsole.openDiffHint}" />
</StackPanel> </StackPanel>
<TextBlock Classes="meta" Margin="17,0,0,0" <TextBlock Classes="meta" Margin="17,0,0,0"
Text="{loc:Tr session.approveMergesUnitHint}" /> Text="{loc:Tr session.approveMergesUnitHint}" />
@@ -396,23 +396,23 @@
<WrapPanel Orientation="Horizontal"> <WrapPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal" Spacing="{StaticResource SpaceSm}" Margin="0,0,8,8"> <StackPanel Orientation="Horizontal" Spacing="{StaticResource SpaceSm}" Margin="0,0,8,8">
<Button Classes="btn accent" Content="Approve &amp; Merge" <Button Classes="btn accent" Content="{loc:Tr details.workConsole.approveMerge}"
Command="{Binding ApproveReviewCommand}" /> Command="{Binding ApproveReviewCommand}" />
<controls:OperationIndicator Status="{Binding ApproveOp}" /> <controls:OperationIndicator Status="{Binding ApproveOp}" />
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" Spacing="{StaticResource SpaceSm}" Margin="0,0,8,8"> <StackPanel Orientation="Horizontal" Spacing="{StaticResource SpaceSm}" Margin="0,0,8,8">
<Button Classes="btn" Content="Park" <Button Classes="btn" Content="{loc:Tr details.workConsole.park}"
ToolTip.Tip="Set aside — back to Idle, keeps the worktree" ToolTip.Tip="{loc:Tr details.workConsole.parkTip}"
Command="{Binding ParkReviewCommand}" /> Command="{Binding ParkReviewCommand}" />
<controls:OperationIndicator Status="{Binding ParkOp}" /> <controls:OperationIndicator Status="{Binding ParkOp}" />
</StackPanel> </StackPanel>
<Button Classes="btn" Content="Cancel" Margin="0,0,8,8" <Button Classes="btn" Content="{loc:Tr details.workConsole.cancel}" Margin="0,0,8,8"
ToolTip.Tip="{loc:Tr session.mergeDrainHint}" ToolTip.Tip="{loc:Tr session.mergeDrainHint}"
ToolTip.ShowOnDisabled="True" ToolTip.ShowOnDisabled="True"
Command="{Binding CancelReviewCommand}" /> Command="{Binding CancelReviewCommand}" />
</WrapPanel> </WrapPanel>
<Button Classes="prompt-action" Content="Reset (discard branch)…" <Button Classes="prompt-action" Content="{loc:Tr details.workConsole.resetDiscardBranch}"
ToolTip.Tip="{loc:Tr session.reviewResetTip}" ToolTip.Tip="{loc:Tr session.reviewResetTip}"
Command="{Binding ResetReviewCommand}" /> Command="{Binding ResetReviewCommand}" />
</StackPanel> </StackPanel>
@@ -434,9 +434,9 @@
<Border Height="1" Background="{DynamicResource LineBrush}" /> <Border Height="1" Background="{DynamicResource LineBrush}" />
<TextBlock Classes="meta" TextWrapping="Wrap" <TextBlock Classes="meta" TextWrapping="Wrap"
Foreground="{DynamicResource TextMuteBrush}" Foreground="{DynamicResource TextMuteBrush}"
Text="Worked on this by hand? Submit the worktree for review to merge it." /> Text="{loc:Tr details.workConsole.submitForReviewHint}" />
<StackPanel Orientation="Horizontal" Spacing="{StaticResource SpaceSm}"> <StackPanel Orientation="Horizontal" Spacing="{StaticResource SpaceSm}">
<Button Classes="btn accent" Content="Submit for review" HorizontalAlignment="Left" <Button Classes="btn accent" Content="{loc:Tr details.workConsole.submitForReview}" HorizontalAlignment="Left"
Command="{Binding SubmitForReviewCommand}" /> Command="{Binding SubmitForReviewCommand}" />
<controls:OperationIndicator Status="{Binding SubmitOp}" /> <controls:OperationIndicator Status="{Binding SubmitOp}" />
</StackPanel> </StackPanel>
@@ -466,7 +466,7 @@
<!-- Child outcomes --> <!-- Child outcomes -->
<StackPanel Spacing="6" IsVisible="{Binding HasChildOutcomes}"> <StackPanel Spacing="6" IsVisible="{Binding HasChildOutcomes}">
<TextBlock Classes="section-label" Text="OUTCOMES" /> <TextBlock Classes="section-label" Text="{loc:Tr details.workConsole.outcomesLabel}" />
<ItemsControl ItemsSource="{Binding ChildOutcomes}"> <ItemsControl ItemsSource="{Binding ChildOutcomes}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:ChildOutcomeRowViewModel"> <DataTemplate x:DataType="vm:ChildOutcomeRowViewModel">
@@ -51,7 +51,7 @@
<PathIcon Data="{StaticResource Icon.Warning}" <PathIcon Data="{StaticResource Icon.Warning}"
Foreground="{DynamicResource StatusReviewBrush}" Foreground="{DynamicResource StatusReviewBrush}"
Width="14" Height="14" VerticalAlignment="Center"/> Width="14" Height="14" VerticalAlignment="Center"/>
<TextBlock Classes="section-label" Text="ROADBLOCK" <TextBlock Classes="section-label" Text="{loc:Tr details.roadblockLabel}"
Foreground="{DynamicResource StatusReviewBrush}" Foreground="{DynamicResource StatusReviewBrush}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>