Skip to main content

Changelog

Every improvement, automatically tracked from our commit history.

Subscribe via Atom feed
← Prev Page 35 of 127 Next →
February 25, 2026
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.

patch Finance

Fix Spending by Category report layout and interactivity

Details

Bar chart:

  • Dynamic height based on category count (32px per category, min 400px)
  • Fix $0 data labels by hiding sub-$1 values
  • Add XToolTipLabelFormatter for proper currency tooltips on hover
  • Smart X-axis step intervals to prevent label cramming

Pie chart:

  • Group categories below 10% of total into an "Other" slice
  • "Other" slice rendered in distinct gray color with count/percentage tooltip
  • Drill-down: click "View N smaller categories" to see Other breakdown
  • Back button to return to main distribution view
  • Increased chart height to 400px with centered horizontal alignment
  • Section title updates dynamically based on drill-down state
patch CalendarCanvasContactsDataEmailFilesFinanceHabitsJournalNotesRssSnippetsTasksWebClips

Pin plugin SDK/UI.Adaptive NuGet versions to PrivStackSdkVersion

Details

Replace Version="*" with Version="$(PrivStackSdkVersion)" across all 15

plugin csproj files and the Finance test project. Add PrivStackSdkVersion

(1.68.0) to PrivStack-Plugins/Directory.Build.props.

This eliminates non-deterministic NuGet resolution in CI/standalone builds

where the wildcard would resolve to stale published versions (e.g. 1.5.3)

missing newer types like AdaptiveCartesianChart, causing MissingFieldException

at runtime. Local dev is unaffected — Directory.Build.props already swaps

these for project references when the sibling PrivStack-IO checkout exists.

patch Journal

Fix Journal map tiles not loading (missing User-Agent)

Journal 1.15.4 → 1.15.5 | 2d441023
Details

OpenStreetMap tile server returns 403 for requests without a valid

User-Agent header. Mapsui's default CreateTileLayer() derives the

User-Agent from Assembly.GetEntryAssembly() which resolves incorrectly

in the plugin's AssemblyLoadContext, producing an empty/invalid value.

Pass an explicit "PrivStack/1.68" User-Agent to both the editor and

read-only map views.

← Prev Page 35 of 127 Next →

Get notified about new releases