release 4.10.1

This commit is contained in:
callumalpass 2026-06-05 10:16:05 +10:00
parent 19af99278d
commit bf1428c959
9 changed files with 56 additions and 27 deletions

View file

@ -1,6 +1,6 @@
# TaskNotes Privacy Policy
Last updated: February 21, 2026
Last updated: June 4, 2026
## Overview
@ -17,11 +17,12 @@ Plugin settings are stored in Obsidian's local plugin configuration.
## Optional Network Features
TaskNotes is local-first. Network requests occur only when you enable features that require them.
TaskNotes is local-first. Network requests occur only for enabled features that require them.
Some enabled integrations perform periodic background refreshes, such as calendar provider sync and ICS subscription updates.
Optional network features:
- Release checks: when enabled, TaskNotes checks GitHub once on startup for newer compatible TaskNotes releases. This is enabled by default and can be disabled in TaskNotes settings.
- OAuth calendar integration (Google/Microsoft): fetches and updates calendar events through provider APIs.
- ICS subscriptions: fetches events from configured ICS URLs.
- Webhooks: sends event payloads to webhook endpoints you configure.
@ -37,6 +38,7 @@ Optional network features:
- Google APIs: https://policies.google.com/privacy
- Microsoft APIs: https://privacy.microsoft.com/privacystatement
- GitHub: https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement
- Any ICS host or webhook endpoint you configure
## What TaskNotes Does Not Do

View file

@ -6,6 +6,7 @@ Welcome to the TaskNotes release notes. Here you can find detailed information a
### Version 4.x (Current)
- [4.10.1](releases/4.10.1.md)
- [4.10.0](releases/4.10.0.md)
- [4.9.2](releases/4.9.2.md)
- [4.9.1](releases/4.9.1.md)

18
docs/releases/4.10.1.md Normal file
View file

@ -0,0 +1,18 @@
# TaskNotes 4.10.1
## Added
- Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser.
- (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default `.base` files from the current TaskNotes templates. Thanks to @businessBoris for the request.
- (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap.
## Fixed
- (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots.
- (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this.
- (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot.
- (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting.
- (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot.
- (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor.
- (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting.
- (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this.

View file

@ -31,21 +31,3 @@ When a change has user-facing documentation, include a canonical tasknotes.dev l
```
-->
## Added
- Added an enabled-by-default startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser.
- Added translations for the new startup release-check setting and update notice.
- (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default `.base` files from the current TaskNotes templates. Thanks to @businessBoris for the request.
- (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @martin-forge for identifying the API/MCP gap.
## Fixed
- (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots.
- (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this.
- (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot.
- (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting.
- (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot.
- (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor.
- (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting.
- (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this.

View file

@ -1,7 +1,7 @@
{
"id": "tasknotes",
"name": "TaskNotes",
"version": "4.10.0",
"version": "4.10.1",
"minAppVersion": "1.12.2",
"description": "Note-based task management with calendar, pomodoro and time-tracking integration.",
"author": "Callum Alpass",

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "tasknotes",
"version": "4.10.0",
"version": "4.10.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "tasknotes",
"version": "4.10.0",
"version": "4.10.1",
"license": "MIT",
"dependencies": {
"@codemirror/view": "^6.38.6",

View file

@ -1,6 +1,6 @@
{
"name": "tasknotes",
"version": "4.10.0",
"version": "4.10.1",
"description": "Note-based task management with calendar, pomodoro and time-tracking integration.",
"main": "main.js",
"scripts": {

View file

@ -1,3 +1,8 @@
jest.mock("../../../src/utils/helpers", () => ({
...jest.requireActual("../../../src/utils/helpers"),
generateRecurringInstances: jest.fn(),
}));
import {
generateCalendarEvents,
getTargetDateForEvent,
@ -5,8 +10,12 @@ import {
} from "../../../src/bases/calendar-core";
import type TaskNotesPlugin from "../../../src/main";
import { formatDateForStorage } from "../../../src/utils/dateUtils";
import { generateRecurringInstances } from "../../../src/utils/helpers";
import { TaskFactory } from "../../helpers/mock-factories";
const mockedGenerateRecurringInstances =
generateRecurringInstances as jest.MockedFunction<typeof generateRecurringInstances>;
function createPlugin(): TaskNotesPlugin {
return {
priorityManager: {
@ -22,6 +31,10 @@ function localDate(year: number, monthIndex: number, day: number): Date {
return new Date(year, monthIndex, day);
}
function localNoonDate(year: number, monthIndex: number, day: number): Date {
return new Date(year, monthIndex, day, 12);
}
function virtualOccurrenceDates(events: CalendarEvent[]): string[] {
return events
.filter(
@ -37,8 +50,20 @@ function virtualOccurrenceDates(events: CalendarEvent[]): string[] {
describe("calendar materialized occurrences", () => {
const plugin = createPlugin();
const start = localDate(2026, 5, 1);
const end = localDate(2026, 5, 4);
const start = localNoonDate(2026, 5, 1);
const end = localNoonDate(2026, 5, 4);
beforeEach(() => {
mockedGenerateRecurringInstances.mockReturnValue([
localNoonDate(2026, 5, 1),
localNoonDate(2026, 5, 2),
localNoonDate(2026, 5, 3),
]);
});
afterEach(() => {
mockedGenerateRecurringInstances.mockReset();
});
it("coalesces virtual recurrence events when a materialized occurrence exists", async () => {
const parent = TaskFactory.createRecurringTask("FREQ=DAILY;INTERVAL=1", {

View file

@ -25,5 +25,6 @@
"4.9.0": "1.12.2",
"4.9.1": "1.12.2",
"4.9.2": "1.12.2",
"4.10.0": "1.12.2"
"4.10.0": "1.12.2",
"4.10.1": "1.12.2"
}