feat(ui): Cheat-Sheet-Fenster im Hilfe-Menue

Sechs Markdown-Sheets (git, Conventional Commits, Claude CLI, Claude-Config,
dotnet CLI, PowerShell) als EmbeddedResource, gerendert im modelosen, per
Topmost anpinnbaren CheatSheetsWindow. MarkdownView bekommt dafuer das Opt-in
CommandRows: `befehl` - beschreibung wird zu Mono-Chip + Copy-Button, jede
##-Sektion landet in einem Expander. Enthaelt ausserdem: Mission Control
wird beim Oeffnen aus dem Minimiert-Zustand geholt, nicht nur aktiviert.
This commit is contained in:
mika kuns
2026-09-07 08:17:37 +02:00
parent 7c7c33d677
commit 0db9fadee9
20 changed files with 749 additions and 7 deletions
@@ -0,0 +1,32 @@
using ClaudeDo.Ui.Views.Controls;
using Xunit;
namespace ClaudeDo.Ui.Tests.Views;
/// <summary>
/// Covers the command-row split only — rendering itself needs an Avalonia app, which this
/// project has no host for.
/// </summary>
public class MarkdownCommandRowTests
{
[Theory]
[InlineData("`git status -sb` — Kurzstatus mit Branch-Zeile", "git status -sb", "Kurzstatus mit Branch-Zeile")]
[InlineData("`git branch -d <name>` — löschen (`-D` erzwingt)", "git branch -d <name>", "löschen (`-D` erzwingt)")]
[InlineData("`dotnet build`", "dotnet build", "")]
public void SplitsCommandFromDescription(string line, string cmd, string desc)
{
Assert.True(MarkdownView.TrySplitCommand(line, out var actualCmd, out var actualDesc));
Assert.Equal(cmd, actualCmd);
Assert.Equal(desc, actualDesc);
}
[Theory]
[InlineData("Prosa ohne Befehl")]
[InlineData("Text mit `code` in der Mitte")]
[InlineData("`unclosed backtick")]
[InlineData("``")]
public void LeavesNonCommandBulletsToThePlainRenderer(string line)
{
Assert.False(MarkdownView.TrySplitCommand(line, out _, out _));
}
}