Skip to main content

Changelog

Every improvement, automatically tracked from our commit history.

Subscribe via Atom feed
← Prev Page 62 of 212 Next →
February 25, 2026
patch Notes

Fix GroupBlock alignment: lightweight organizer instead of visual container

Details

Replace bordered box with padding (which pushed children ~50px right of page

title) with a thin left accent line and zero padding. Children now render at

full width — their BlockWrapper handles provide natural alignment identical

to top-level blocks. Header made compact (smaller chevron, caption-sized label).

The group block is an organizational tool, not a layout container.

patch CalendarRss

Add HTTP integration tests for ICS fetch and RSS fetch services

Details

Refactored IcsFetchService and RssParserService to accept HttpClient

via internal constructor (with InternalsVisibleTo for test projects),

enabling mock HTTP transport in tests.

IcsFetchServiceTests (8 tests): ETag/If-None-Match headers, 304 Not

Modified returns null, multi-event parsing, error handling.

RssFetchServiceTests (11 tests): RSS and Atom feed parsing, article

URL/read/star extraction, refresh deduplication by URL, custom title

preservation, network error handling.

patch Tasks

Add integration tests for GitHubIssueSyncService (28 tests)

Details

Extract IGitHubIssueApiClient interface from the sealed GitHubIssueApiClient

to enable mocking the HTTP layer in tests. The sync service constructor now

accepts the interface instead of the concrete class.

Tests cover the full sync orchestration:

  • Source validation and access token retrieval
  • Pull sync: new issues create tasks, remote-newer updates existing tasks
  • Push sync: local-newer pushes to GitHub (bidirectional only), skips for pull-only
  • Conflict resolution: same-timestamp skips, last-write-wins by updated_at
  • Orphan handling: full sync marks missing open tasks as done, incremental skips
  • Comment sync with deduplication by GitHubCommentId
  • Timeline event sync with untracked event filtering
  • Filter resolution (assignee "me" → username, labels joined with comma)
  • Source status updates on success and error
  • Cancellation token propagation
  • Progress reporting
  • Tasks from other sources are not affected by sync
  • PushTaskAsync: bidirectional push, pull-only skip, non-GitHub task skip,

missing task/source ref handling

patch ContactsEmail

Add shared test infrastructure and Phase 1 plugin unit tests (259 tests)

Details

Phase 0: Shared test infrastructure

  • PrivStack.TestUtilities class library with GenericMockSdk (registration-based

entity routing), MockSdkExtensions (Seed, AssertStored, AssertActionSent),

and shared TestAppBuilder for Avalonia headless testing

  • Living design doc (TESTING_STRATEGY.md) with full test plan across 4 phases

Phase 1: Pure logic tests (no SDK dependency)

  • Calendar: RecurrenceGeneratorTests (49 tests) — daily/weekly/monthly/yearly

patterns, end conditions, excluded dates, exception events, DST, safety limits

  • Calendar: IcsParserTests — RFC 5545 parsing, date formats, RRULE, export roundtrip
  • Habits: StreakCalculatorTests (23 tests) — boolean/numeric/duration streaks,

frequency-aware gaps, completion rate, sparkline data, performance

  • Email: HtmlSanitizerTests (44 tests) — element/attribute stripping, XSS vectors,

CID replacement, tracking pixels, media queries, constraint CSS

  • Email: EmailThreadingServiceTests (12 tests) — MessageId chains, subject fallback,

circular reference protection, deduplication

  • Notes: MarkdownBlockParserTests, BlockTreeHelperTests, LinkSearchScorerTests

(60 tests) — all 23 block types, tree traversal/mutation, fuzzy search scoring

  • Contacts: VCardParserTests (20 tests) — vCard 2.1/3.0, QP encoding, types, bday
  • Contacts: CsvContactParserTests (7 tests) — delimiter detection, header mapping
  • Tasks: GitHubIssueFieldMapperTests (22 tests) — state/priority mapping, parsing
  • Data: ContextDetectorTests + ProblemDetectorTests (19 tests) — SQL cursor context,

schema validation, ambiguous columns

  • Journal: GpxParserTests (7 tests) — GPX 1.0/1.1, Haversine distance
  • RSS: OpmlTests (7 tests) — OPML parse/export roundtrip

InternalsVisibleTo added to Contacts and Email plugins for test access.

patch Notes

Add Notes plugin unit tests for parser, tree helper, and search scorer

Details

Add three test files covering the core Notes plugin service classes:

  • MarkdownBlockParserTests (24 tests): ATX/setext headings, paragraphs,

bullet/numbered/task lists, fenced code, blockquotes, horizontal rules,

images, footnotes, callouts, indents, tables, definition lists, mixed

content, and unique ID generation.

  • BlockTreeHelperTests (14 tests): FindBlockById, GetBlockAtPath,

GetParentList, FlattenTree, IndentBlock, OutdentBlock, CollectBlockText

across nested block tree structures.

  • LinkSearchScorerTests (12 tests): empty query, exact/prefix/fuzzy match,

case insensitivity, multi-word scoring, subtitle contribution, starts-with

bonus, and short-word fuzzy tolerance threshold.

Also adds InternalsVisibleTo attribute to Notes plugin csproj to expose

internal static classes (MarkdownBlockParser, LinkSearchScorer) to the

test project.

← Prev Page 62 of 212 Next →

Get notified about new releases