Queue/Task(s)/Gate in deutschem Fliesstext auf Warteschlange/Aufgabe(n)/ Limit-Stopp vereinheitlicht, columnTask-Keys auf AUFGABE angeglichen, Kill-Tonalitaet (closeSession/killSessionTip) ehrlich-destruktiv gemacht. RepoImportModalViewModel.CreateButtonText und alle Installer-Check-Messages (Git/GitIdentity/WriteAccess/ClaudeCli/ClaudeVersion/ClaudeAuth/ PermissionModeAuto/Ports) ueber Locale-Keys geroutet statt hartem Englisch, mit dem bestehenden TrExtension.Localizer-Fallback-Muster.
57 lines
2.4 KiB
C#
57 lines
2.4 KiB
C#
using ClaudeDo.Installer.Core;
|
|
using ClaudeDo.Installer.Localization;
|
|
|
|
namespace ClaudeDo.Installer.Checks;
|
|
|
|
/// <summary>Gates the CLI flags ClaudeArgsBuilder relies on — blocking.</summary>
|
|
public sealed class ClaudeVersionCheck : IEnvironmentCheck
|
|
{
|
|
public const string CheckId = "claude-version";
|
|
|
|
/// <summary>
|
|
/// Newest version confirmed to work end-to-end with every flag ClaudeDo uses (--permission-mode
|
|
/// auto, --effort, --agents, --json-schema, --append-system-prompt, --output-format stream-json
|
|
/// --verbose, --resume, mcp add --transport http --scope user). A verified floor, not a proven
|
|
/// theoretical minimum — see docs/explore-notes/installer-preflight.md §3.
|
|
/// </summary>
|
|
public static readonly Version MinimumVersion = new(2, 1, 220);
|
|
|
|
private readonly ClaudeCliLookup _lookup;
|
|
|
|
public ClaudeVersionCheck(ClaudeCliLookup lookup)
|
|
{
|
|
_lookup = lookup;
|
|
}
|
|
|
|
public string Id => CheckId;
|
|
public CheckSeverity Severity => CheckSeverity.Error;
|
|
|
|
public async Task<CheckResult> RunAsync(InstallContext ctx, CancellationToken ct)
|
|
{
|
|
var loc = TrExtension.Localizer;
|
|
var lookup = await _lookup.ResolveAsync(ctx, ct);
|
|
|
|
if (lookup.Resolved is null)
|
|
{
|
|
return CheckResult.Unknown(Id, Severity, "checks.claudeVersion.title",
|
|
loc?["checks.claudeVersion.notFound"] ?? "The claude CLI was not found — version could not be checked.");
|
|
}
|
|
|
|
if (lookup.ExitCode != 0 || lookup.ParsedVersion is null)
|
|
{
|
|
return CheckResult.Unknown(Id, Severity, "checks.claudeVersion.title",
|
|
loc?.Get("checks.claudeVersion.parseFailed", lookup.Output.Trim()) ?? $"Could not parse a version from '{lookup.Output.Trim()}'.");
|
|
}
|
|
|
|
if (lookup.ParsedVersion < MinimumVersion)
|
|
{
|
|
return CheckResult.Fail(Id, Severity, "checks.claudeVersion.title",
|
|
loc?.Get("checks.claudeVersion.tooOld", lookup.ParsedVersion, MinimumVersion) ?? $"claude {lookup.ParsedVersion} is older than the required {MinimumVersion}.",
|
|
"checks.claudeVersion.hint");
|
|
}
|
|
|
|
return CheckResult.Ok(Id, Severity, "checks.claudeVersion.title",
|
|
loc?.Get("checks.claudeVersion.ok", lookup.ParsedVersion, MinimumVersion) ?? $"claude {lookup.ParsedVersion} meets the minimum ({MinimumVersion}).");
|
|
}
|
|
}
|