Add meeting workflow automation

This commit is contained in:
2026-05-27 12:55:18 +02:00
parent e85274829a
commit b114071957
29 changed files with 1703 additions and 12 deletions
@@ -106,6 +106,7 @@ public sealed class MeetingSummaryTools
meetingNote,
string.IsNullOrWhiteSpace(summaryTitle) ? "Meeting Summary" : summaryTitle,
artifacts.SummaryPath);
frontmatter.Attendees = await ResolveSummaryAttendeesAsync(meetingNote);
await File.WriteAllTextAsync(
artifacts.SummaryPath,
MeetingArtifactFrontmatterRenderer.Render(frontmatter, markdown));
@@ -571,6 +572,37 @@ public sealed class MeetingSummaryTools
.Replace(Path.AltDirectorySeparatorChar.ToString(), "/", StringComparison.Ordinal);
}
private async Task<List<string>?> ResolveSummaryAttendeesAsync(MeetingNote meetingNote)
{
var existingAttendees = await ReadExistingSummaryAttendeesAsync();
if (existingAttendees is not null)
{
return existingAttendees;
}
return meetingNote.Frontmatter.Attendees.Count == 0
? null
: meetingNote.Frontmatter.Attendees.ToList();
}
private async Task<List<string>?> ReadExistingSummaryAttendeesAsync()
{
if (!File.Exists(artifacts.SummaryPath))
{
return null;
}
var content = await File.ReadAllTextAsync(artifacts.SummaryPath);
var document = MarkdownDocumentParser.SplitOptional(content);
if (!document.HasFrontmatter)
{
return null;
}
var yaml = YamlDeserializer.Deserialize<SummaryFrontmatterYaml>(document.Frontmatter);
return yaml?.Attendees;
}
private sealed record ProjectFileTarget(BoundMeetingProject Project, string Path);
private sealed record FileLineEditMode(
@@ -633,6 +665,12 @@ public sealed class MeetingSummaryTools
public string? Summary { get; set; }
}
private sealed class SummaryFrontmatterYaml
{
[YamlDotNet.Serialization.YamlMember(Alias = "attendees")]
public List<string>? Attendees { get; set; }
}
private static DateTimeOffset? ParseDateTime(string? value)
{
return DateTimeOffset.TryParse(value, out var parsed)