yyc12345
62a3c96dc0
feat(m5): gui shell
...
- AppServices composition root: owns config, global workspace registry
(app.db), platform path comparer and the LRU workspace connection pool;
configuration persisted once at shutdown and services disposed
- AppDataPaths centralizes app.json / app.db locations; AppConfig gains
a DefaultLanguage constant
- MVVM shell: MainWindowViewModel hosts SidebarViewModel and the current
content page (welcome / workspace / localized failure state), mapping
typed open failures to ResX messages
- SidebarViewModel: persistent workspace list with name-asc, name-desc
and recently-updated sorting (selection persisted), open-project folder
picker and initialize confirmation via Interaction<TInput,TOutput>
handlers registered by the view; workspace entries open/remove
- Pages (welcome, workspace, message), dialogs (settings, about, confirm)
with their view models; settings/about opened from the window
- App startup applies configured culture (RTL flow direction) and theme
before the main window; forwarded IPC commands activate the window and
switch workspace from the launch path
- Full UI text sourced from ResX in both en and zh-Hans; no hardcoded
strings, theme colors via ThemeDictionaries
2026-10-02 18:02:22 +08:00
yyc12345
4fc8fdda6f
feat(m4): single instance IPC
...
- LaunchCommand: ShowMain / OpenWorkspace(path), doubles as IPC message
- LaunchArguments: first non-blank arg wins, blank-only args -> ShowMain
- IpcProtocol: strict newline-line codec (show / open+path), tolerant
of trailing-newline framing only
- SingleInstanceService: per-session named mutex decides primary;
primary serves a named-pipe loop (decode -> dispatch -> ack) with
handler failures contained; secondary retries send, exits on ack
- Program/App wiring: secondary forwards command and exits; primary
activates the main window for forwarded commands (workspace switch
deferred to the workspace UI milestone)
- 15 new tests (protocol codec, argument parsing); smoke-verified:
instance 1 stays alive, instance 2 self-exits with code 0
2026-10-02 14:29:42 +08:00
yyc12345
b5614ff59b
feat(m3): search and export
...
- Pidgin lexer: words, escaped phrases (strict closing), parens
- Full-Pidgin token-level parser, strict: malformed input throws
SearchSyntaxException (BREAKING: lenient degradation removed from
the plan; M7 must surface the error, M8 USAGE.md documents strict
behavior)
- AST with reference-equality collection terms; structural
comparison lives in the test-side SearchNodeComparer (YYC MARK
note records the record-equality pitfall)
- SQL compiler: parameterized predicate over cards alias, LIKE
escaping, COLLATE NOCASE exact matches, tag EXISTS / column IN
subqueries
- Markdown exporter: ResX-driven templates, per-language export
time AND card time patterns, kebab i18n file names, table cell
escaping
- New RgbColor value type (byte components, strict #RRGGBB parse,
canonical lowercase text) wired through TagModel and repository
- 57 new tests (grammar branches, strict errors, SQL end-to-end,
en/zh export snapshots, color conversions)
2026-10-01 22:20:56 +08:00
yyc12345
e2bb0298b1
fix(m2): fix repository tag model issue
2026-10-01 21:34:58 +08:00
yyc12345
01367edaa9
feat(m2): repository layer
...
- Data models: ColumnModel, CardModel (tags loaded), TagModel
- PathComparer: platform-parameterized path normalization
(case rule injected, trailing separator trimmed, roots kept)
- WorkspaceRepository: column/card/tag CRUD, card moves, tag
assignment; single-transaction edit confirmation with atomic
rollback; no-change confirmations write nothing; move refreshes
last_edited_at but not card updated_at; write-through to app.db
after every successful data write
- WorkspaceConnectionPool: fixed-capacity LRU session pool
(lock + repository); eviction releases resources only; typed
folder state errors; sidebar registry registration on open
- 35 new unit tests: cascade chains, atomicity, timestamp rules,
LRU behavior, lock conflicts, path equivalence
2026-10-01 20:39:20 +08:00
yyc12345
31fc58d9c7
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
2026-10-01 18:17:47 +08:00
yyc12345
e934eb9629
refactor(m0): restructure project and install dependencies
...
- Clean Avalonia template content (ViewLocator, greeting, empty Models folder)
- Add YKanBan.Tests (MSTest 4.4.1) to solution
- Install packages per plan version table (Semi.Avalonia, Lucide icons,
Microsoft.Data.Sqlite, Pidgin, Newtonsoft.Json 13.0.4 fallback)
2026-10-01 16:57:12 +08:00
yyc12345
6050a70f4b
doc: submit plan
2026-10-01 16:44:18 +08:00
yyc12345
8194faa2c8
feat: initialize project
2026-09-29 20:16:52 +08:00