diff --git a/llm-assist/AGENTS.md b/llm-assist/AGENTS.md index 65e0dcc..fe86c8f 100644 --- a/llm-assist/AGENTS.md +++ b/llm-assist/AGENTS.md @@ -37,3 +37,24 @@ dotnet test --filter "FullyQualifiedName~ClassName.MethodName" # Run single tes - Code and comments are in **Chinese**. - Namespace: `OCES.Resonance.Core` (Core), `OCES.Resonance.AtlFieldExtractor` (extractor), `OCES.Resonance.Core.Tests` (tests). - Git commit style: `WIP: ` (no conventional commits). + +## AI 助手工具说明(DeepSeek TUI) + +当前工作环境为 DeepSeek TUI,文件操作工具采用**延迟加载**机制,不在初始工具列表中。首次调用会触发加载并返回 schema 提示(不执行),用正确参数重试后正常执行。 + +### 可用文件操作工具 + +| 工具 | 用途 | 参数注意事项 | +|------|------|-------------| +| `write_file` | 创建/覆盖文件 | `path` + `content` | +| `edit_file` | 单次查找替换 | `path` + `search` + `replace`(注意不是 `old_string`/`new_string`) | +| `apply_patch` | 结构化 patch(多块变更) | `path` + `patch`(unified diff 格式) | +| `read_file` | 读取文件 | `path`,支持 `start_line`/`max_lines` 分页;PDF 自动提取 | +| `list_dir` | 列出目录 | `path`(可选) | +| `grep_files` | 正则搜索文件内容 | `pattern`,支持 `include`/`exclude` glob、`context_lines` | + +### 使用模式 + +- 写入/编辑/打补丁:需**两次调用**(首次触发加载,第二次执行) +- 读取/搜索:直接可用,单次调用 + diff --git a/src/Core.Tests/AudioMetadataReaderTest.cs b/src/Core.Tests/AudioMetadataReaderTest.cs index 90ee5e0..208a807 100644 --- a/src/Core.Tests/AudioMetadataReaderTest.cs +++ b/src/Core.Tests/AudioMetadataReaderTest.cs @@ -162,9 +162,9 @@ public class AudioMetadataReaderTest if (int.TryParse(metaFields["TrackNumber"], out int trackNum) && trackNum > 0) Assert.Equal(trackNum, meta.TrackNumber); - // DiscNumber - if (int.TryParse(metaFields["DiscNumber"], out int discNum) && discNum > 0) - Assert.Equal(discNum, meta.DiscNumber); + // DiskNumber + if (int.TryParse(metaFields["DiskNumber"], out int discNum) && discNum > 0) + Assert.Equal(discNum, meta.DiskNumber); // Year if (int.TryParse(metaFields["Year"], out int year) && year > 0) diff --git a/src/Core.Tests/Core.Tests.csproj b/src/Core.Tests/Core.Tests.csproj index 07a72ed..d74b40d 100755 --- a/src/Core.Tests/Core.Tests.csproj +++ b/src/Core.Tests/Core.Tests.csproj @@ -9,6 +9,7 @@ + diff --git a/src/Core.Tests/DatabaseTests.cs b/src/Core.Tests/DatabaseTests.cs index 30e0f46..ff58d24 100644 --- a/src/Core.Tests/DatabaseTests.cs +++ b/src/Core.Tests/DatabaseTests.cs @@ -12,7 +12,7 @@ public class DatabaseTests public void InitializeDatabase_ShouldCreateAudioFilesTable() { string dbName = NewDbName(); - string dbPath = $"{dbName}.rdb"; + string dbPath = $"{Path.Combine(PreferencesManager.GetDefaultDatabasePath(), dbName)}.rdb"; try { @@ -60,7 +60,7 @@ public class DatabaseTests public void InitializeDatabase_ShouldBeIdempotent() { string dbName = NewDbName(); - string dbPath = $"{dbName}.rdb"; + string dbPath = $"{Path.Combine(PreferencesManager.GetDefaultDatabasePath(), dbName)}.rdb"; try { diff --git a/src/Core/AudioFileMeta.cs b/src/Core/AudioFileMeta.cs index f8e688a..3238c57 100755 --- a/src/Core/AudioFileMeta.cs +++ b/src/Core/AudioFileMeta.cs @@ -139,7 +139,7 @@ public class AudioFileMeta /// CD标题,原始CD专辑名称 public string? CdTitle { get; set; } - public int? DiscNumber { get; set; } + public int? DiskNumber { get; set; } /// 曲目标题,音乐或音轨的标题 public string? TrackTitle { get; set; } diff --git a/src/Core/AudioMetadataReader.cs b/src/Core/AudioMetadataReader.cs index 66a7352..dcea14b 100755 --- a/src/Core/AudioMetadataReader.cs +++ b/src/Core/AudioMetadataReader.cs @@ -54,7 +54,7 @@ public class AudioMetadataReader Composer = track.Composer, Copyright = track.Copyright, Description = track.Comment, - DiscNumber = track.DiscNumber, + DiskNumber = track.DiscNumber, FxName = GetField(track, "ixml.USER.FXNAME"), Genre = track.Genre, Group = track.Group, diff --git a/src/Core/Database.cs b/src/Core/Database.cs index 1d17671..a17da2d 100755 --- a/src/Core/Database.cs +++ b/src/Core/Database.cs @@ -22,7 +22,7 @@ public static class Database /// public static void InitializeDatabase(string databaseName = "default") { - using var connection = GetConnection(); + using var connection = GetConnection(databaseName); connection.Open(); const string sql = """ @@ -143,7 +143,7 @@ public static class Database release_date, track_year, is_edited, is_split, location, [group], markers, comments, notes, copyright, coding_history, microphone, mic_perspective, - fx_name, channel_layout, bwf_umid, disc_number, track_number, artwork, waveform, + fx_name, channel_layout, bwf_umid, disk_number, track_number, artwork, waveform, user1, user2, user3, user4, user5, user6, user7, user8 ) VALUES ( @UniqueId, @ShortId, @Md5, @Path, @Filename, @Folder, @Directory, @@ -157,7 +157,7 @@ public static class Database @ReleaseDate, @TrackYear, @IsEdited, @IsSplit, @Location, @Group, @Markers, @Comments, @Notes, @Copyright, @BwfCodingHistory, @Microphone, @MicPerspective, - @FxName, @ChannelLayout, @BwfUmid, @DiscNumber, @TrackNumber, @Artwork, @Waveform, + @FxName, @ChannelLayout, @BwfUmid, @DiskNumber, @TrackNumber, @Artwork, @Waveform, @User1, @User2, @User3, @User4, @User5, @User6, @User7, @User8 ); "; @@ -198,7 +198,7 @@ public static class Database release_date, track_year, is_edited, is_split, location, [group], markers, comments, notes, copyright, coding_history, microphone, mic_perspective, - fx_name, channel_layout, bwf_umid, disc_number, track_number, artwork, waveform, + fx_name, channel_layout, bwf_umid, disk_number, track_number, artwork, waveform, user1, user2, user3, user4, user5, user6, user7, user8 ) VALUES ( @UniqueId, @ShortId, @Md5, @Path, @Filename, @Folder, @Directory, @@ -212,7 +212,7 @@ public static class Database @ReleaseDate, @TrackYear, @IsEdited, @IsSplit, @Location, @Group, @Markers, @Comments, @Notes, @Copyright, @BwfCodingHistory, @Microphone, @MicPerspective, - @FxName, @ChannelLayout, @BwfUmid, @DiscNumber, @TrackNumber, @Artwork, @Waveform, + @FxName, @ChannelLayout, @BwfUmid, @DiskNumber, @TrackNumber, @Artwork, @Waveform, @User1, @User2, @User3, @User4, @User5, @User6, @User7, @User8 ); "; diff --git a/src/Core/PreferencesManager.cs b/src/Core/PreferencesManager.cs index 58d04b8..bbfc9cf 100644 --- a/src/Core/PreferencesManager.cs +++ b/src/Core/PreferencesManager.cs @@ -51,14 +51,18 @@ public static class PreferencesManager { if (OperatingSystem.IsMacOS()) { - string library = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - return Path.Combine(library, "OCES", "Resonance", "Databases"); + string applicationSupport = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + DirectoryInfo databasePath = new(Path.Combine(applicationSupport, "OCES", "Resonance", "Databases")); + if (!databasePath.Exists) Directory.CreateDirectory(databasePath.FullName); + return databasePath.FullName; } if (OperatingSystem.IsWindows()) { string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); - return Path.Combine(localAppData, "OCES", "Resonance", "Databases"); + DirectoryInfo databasePath = new(Path.Combine(localAppData, "OCES", "Resonance", "Databases")); + if (!databasePath.Exists) Directory.CreateDirectory(databasePath.FullName); + return databasePath.FullName; } if (OperatingSystem.IsLinux()) @@ -66,7 +70,9 @@ public static class PreferencesManager string home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); string xdgDataHome = Environment.GetEnvironmentVariable("XDG_DATA_HOME") ?? Path.Combine(home, ".local", "share"); - return Path.Combine(xdgDataHome, "Resonance", "Databases"); + DirectoryInfo databasePath = new(Path.Combine(xdgDataHome, "Resonance", "Databases")); + if (!databasePath.Exists) Directory.CreateDirectory(databasePath.FullName); + return databasePath.FullName; } return string.Empty; @@ -79,8 +85,8 @@ public static class PreferencesManager { if (OperatingSystem.IsMacOS()) { - string library = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - return Path.Combine(library, "Preferences", "com.oces.Resonance.json"); + string home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); + return Path.Combine(home, "Library", "Preferences", "com.oces.Resonance.json"); } if (OperatingSystem.IsWindows()) diff --git a/src/Resonance.sln.DotSettings.user b/src/Resonance.sln.DotSettings.user index 158425c..bfac62d 100755 --- a/src/Resonance.sln.DotSettings.user +++ b/src/Resonance.sln.DotSettings.user @@ -2,6 +2,7 @@ ForceIncluded ForceIncluded ForceIncluded + <AssemblyExplorer> <Assembly Path="/Users/oliver/.nuget/packages/fluentassertions/8.9.0/lib/net6.0/FluentAssertions.dll" /> <Assembly Path="/Users/oliver/.nuget/packages/dapper/2.1.72/lib/net10.0/Dapper.dll" /> @@ -16,5 +17,6 @@ <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest.ReadMetadata_ShouldThrow_FileNotFoundException</TestId> <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.AudioMetadataReaderTest</TestId> <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests.InitializeDatabase_ShouldCreateAudioFilesTable</TestId> + <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests.InitializeDatabase_ShouldBeIdempotent</TestId> </TestAncestor> </SessionState> \ No newline at end of file