feat(m1): storage layer

- Shared SQLite plumbing: PRAGMAs (WAL/NORMAL/foreign_keys) and
  user_version migrations with typed SchemaVersionException
- Workspace folder: .ykanban initialization, empty schema with
  DDL-level constraints, preset column seeding (ResX-driven),
  exclusive lock file with holder diagnostics
- AppData folder: app.db workspace registry (injectable clock),
  app.json config store with kebab-case JSON names via explicit
  [JsonProperty]/[EnumMember], nested sections, corrupt-file backup
- ResX infrastructure under Assets/Locales (en + zh-Hans) with
  MSBuild strongly-typed public Resources class
- 54 unit tests: DDL constraints, migrations, PRAGMAs, lock
  exclusivity, config degradation, culture-aware presets
This commit is contained in:
yyc12345 committed 2026-10-01 18:17:47 +08:00
1 parent e934eb9629
commit 31fc58d9c7
25 files changed
+1737 -1

No files matched your search

+19 -1
View File
@@ -2,6 +2,7 @@
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
<ApplicationManifest>app.manifest</ApplicationManifest>
@@ -9,7 +10,24 @@
</PropertyGroup>
<ItemGroup>
<AvaloniaResource Include="Assets\**" />
<AvaloniaResource Include="Assets\**" Exclude="Assets\Locales\**" />
</ItemGroup>
<!--Strongly-typed ResX resources generated by the cross-platform MSBuild generator.
LogicalName is pinned so the manifest names stay stable despite the Assets/Locales location.-->
<ItemGroup>
<EmbeddedResource Update="Assets/Locales/Resources.resx">
<Generator>MSBuild:Compile</Generator>
<StronglyTypedFileName>$(IntermediateOutputPath)Resources.Designer.cs</StronglyTypedFileName>
<StronglyTypedNamespace>YKanBan</StronglyTypedNamespace>
<StronglyTypedClassName>Resources</StronglyTypedClassName>
<StronglyTypedLanguage>CSharp</StronglyTypedLanguage>
<PublicClass>true</PublicClass>
<LogicalName>YKanBan.Resources.resources</LogicalName>
</EmbeddedResource>
<EmbeddedResource Update="Assets/Locales/Resources.zh-Hans.resx">
<LogicalName>YKanBan.Resources.zh-Hans.resources</LogicalName>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>