using ClaudeDo.Data; namespace ClaudeDo.Worker.Lifecycle; /// /// Startup-only sweep: drops any prompt override file that only matched a now-superseded /// bundled default and was never actually edited (see ), /// and quarantines any *.md file under the prompts root that no longer maps to a known /// (leftovers from a retired naming scheme). /// public sealed class PromptFileRecovery : IHostedService { private readonly ILogger _logger; private readonly string? _root; public PromptFileRecovery(ILogger logger, string? root = null) { _logger = logger; _root = root; } public Task StartAsync(CancellationToken cancellationToken) { PromptFiles.ReconcileStaleDefaults(_root); var orphans = PromptFiles.QuarantineOrphans(_root); if (orphans.Count == 0) { _logger.LogInformation("Prompt file recovery: no orphaned prompt files found"); return Task.CompletedTask; } foreach (var orphan_path in orphans) { _logger.LogWarning("Prompt file recovery: quarantined orphaned prompt file {orphan_path}", orphan_path); if (Path.GetFileNameWithoutExtension(orphan_path) .StartsWith("merge-helper-execute", StringComparison.OrdinalIgnoreCase)) _logger.LogWarning( "Prompt file recovery: {orphan_path} was a customization of the retired merge-helper-execute.md prompt, which was split into merge-helper-wait.md and merge-helper-merge.md; its content was not migrated to either", orphan_path); } return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; }