Archive summary refinements and profile switching
PR and Push Build/Test / build-and-test (push) Successful in 6m37s

This commit is contained in:
2026-05-27 23:11:21 +02:00
parent c12febe029
commit 7777b349a5
37 changed files with 3190 additions and 121 deletions
@@ -16,6 +16,9 @@ public sealed class MeetingSummaryArtifactResolverTests
Directory.CreateDirectory(notes);
Directory.CreateDirectory(summaries);
var notePath = Path.Combine(notes, "meeting.md");
var assistantContextPath = Path.Combine(root, "Meetings", "Assistant Context", "context.md");
Directory.CreateDirectory(Path.GetDirectoryName(assistantContextPath)!);
await File.WriteAllTextAsync(assistantContextPath, "# Assistant Context");
await File.WriteAllTextAsync(
notePath,
"""
@@ -47,10 +50,98 @@ public sealed class MeetingSummaryArtifactResolverTests
Assert.NotNull(artifacts);
Assert.Equal(notePath, artifacts.MeetingNotePath);
Assert.Equal(Path.Combine(root, "Meetings", "Transcripts", "transcript.md"), artifacts.TranscriptPath);
Assert.Equal(Path.Combine(root, "Meetings", "Assistant Context", "context.md"), artifacts.AssistantContextPath);
Assert.Equal(assistantContextPath, artifacts.AssistantContextPath);
Assert.Equal(Path.Combine(summaries, "summary.md"), artifacts.SummaryPath);
}
[Fact]
public async Task ResolverPrefersArtifactLinksFromRequestedSummaryFile()
{
var root = Path.Combine(Path.GetTempPath(), "meeting-assistant-tests", Guid.NewGuid().ToString("N"));
var notes = Path.Combine(root, "Meetings", "Notes");
var summaries = Path.Combine(root, "Meetings", "Summaries");
Directory.CreateDirectory(notes);
Directory.CreateDirectory(summaries);
var notePath = Path.Combine(notes, "meeting.md");
var transcriptPath = Path.Combine(root, "Meetings", "Transcripts", "transcript.md");
var summaryContextPath = Path.Combine(root, "Meetings", "Assistant Context", "summary-context.md");
Directory.CreateDirectory(Path.GetDirectoryName(summaryContextPath)!);
await File.WriteAllTextAsync(summaryContextPath, "# Summary-linked Assistant Context");
await File.WriteAllTextAsync(
notePath,
"""
---
title: Meeting
transcript: "[[../Transcripts/transcript|Transcript]]"
assistant_context: "[[../Assistant Context/stale-context|Assistant Context]]"
summary: "[[../Summaries/summary|Summary]]"
---
""");
await File.WriteAllTextAsync(
Path.Combine(summaries, "summary.md"),
"""
---
meeting: "[[../Notes/meeting|Meeting Note]]"
transcript: "[[../Transcripts/transcript|Transcript]]"
assistant_context: "[[../Assistant Context/summary-context|Assistant Context]]"
---
""");
var options = Options.Create(new MeetingAssistantOptions
{
Vault = new VaultOptions
{
MeetingNotesFolder = notes,
SummariesFolder = summaries
}
});
var resolver = new MeetingSummaryArtifactResolver(
options,
new MarkdownMeetingNoteStore(options, NullLogger<MarkdownMeetingNoteStore>.Instance));
var artifacts = await resolver.ResolveBySummaryPathAsync("summary.md", CancellationToken.None);
Assert.NotNull(artifacts);
Assert.Equal(notePath, artifacts.MeetingNotePath);
Assert.Equal(transcriptPath, artifacts.TranscriptPath);
Assert.Equal(summaryContextPath, artifacts.AssistantContextPath);
Assert.Equal(Path.Combine(summaries, "summary.md"), artifacts.SummaryPath);
}
[Fact]
public async Task ResolverRejectsSummaryWhenLinkedAssistantContextIsMissing()
{
var root = Path.Combine(Path.GetTempPath(), "meeting-assistant-tests", Guid.NewGuid().ToString("N"));
var notes = Path.Combine(root, "Meetings", "Notes");
var summaries = Path.Combine(root, "Meetings", "Summaries");
Directory.CreateDirectory(notes);
Directory.CreateDirectory(summaries);
await File.WriteAllTextAsync(
Path.Combine(notes, "meeting.md"),
"""
---
title: Meeting
transcript: "[[../Transcripts/transcript|Transcript]]"
assistant_context: "[[../Assistant Context/missing-context|Assistant Context]]"
summary: "[[../Summaries/summary|Summary]]"
---
""");
var options = Options.Create(new MeetingAssistantOptions
{
Vault = new VaultOptions
{
MeetingNotesFolder = notes,
SummariesFolder = summaries
}
});
var resolver = new MeetingSummaryArtifactResolver(
options,
new MarkdownMeetingNoteStore(options, NullLogger<MarkdownMeetingNoteStore>.Instance));
var artifacts = await resolver.ResolveBySummaryPathAsync("summary.md", CancellationToken.None);
Assert.Null(artifacts);
}
[Fact]
public async Task ResolverRejectsSummaryPathOutsideConfiguredSummaryFolder()
{
@@ -85,6 +176,9 @@ public sealed class MeetingSummaryArtifactResolverTests
Directory.CreateDirectory(englishNotes);
Directory.CreateDirectory(englishSummaries);
var notePath = Path.Combine(englishNotes, "meeting.md");
var assistantContextPath = Path.Combine(englishRoot, "Assistant Context", "context.md");
Directory.CreateDirectory(Path.GetDirectoryName(assistantContextPath)!);
await File.WriteAllTextAsync(assistantContextPath, "# Assistant Context");
await File.WriteAllTextAsync(
notePath,
"""