chore(release): bump v4.7.1 → v4.8.0; Prettier pass on overnight-session files

12 commits on master since v4.7.1 baseline, taking tests 524 → 914 across
27 new suites. This commit:
- Bumps package.json + README version to v4.8.0 (additive features → semver minor)
- Applies Prettier formatting to all files touched during the overnight
  session so release build is reproducible from a clean repo

New in v4.8.0:
- PDF encryption close-out (D1)
- KaTeX rendering test coverage
- Autosave buffer + crash recovery banner
- Daily notes + workspace search + doc-aware Q&A
- Search sidebar panel + Ask mode
- Status bar: word count, reading time, Flesch-Kincaid grade
- Footnote hover preview
- Smart paste (URL → link, CSV/TSV → table)
- Daily notes menu item + sidebar panel + Q&A deep-link
- Daily templates gallery
- Pluggable DocQA engine (TF-idF default + lazy neural embeddings)

Amit Haridas
This commit is contained in:
2026-09-14 14:56:05 +05:30
parent c3fe72bcae
commit b1b72f9a60
29 changed files with 186 additions and 136 deletions
+19 -13
View File
@@ -9,7 +9,9 @@ function mountPanel(deps = {}) {
const container = document.createElement('div');
document.body.appendChild(container);
const api = renderDailyNotesPanel(container, {
openToday: deps.openToday || jest.fn().mockResolvedValue({ path: '/notes/2026-09-14.md', created: true }),
openToday:
deps.openToday ||
jest.fn().mockResolvedValue({ path: '/notes/2026-09-14.md', created: true }),
listExisting: deps.listExisting || jest.fn().mockResolvedValue([]),
onOpenFile: deps.onOpenFile || jest.fn(),
...deps,
@@ -39,11 +41,13 @@ describe('renderDailyNotesPanel — mounting', () => {
test('renders one row per filename', async () => {
const { container } = mountPanel({
listExisting: jest.fn().mockResolvedValue([
'/notes/daily/2026-09-14.md',
'/notes/daily/2026-09-13.md',
'/notes/daily/2026-09-10.md',
]),
listExisting: jest
.fn()
.mockResolvedValue([
'/notes/daily/2026-09-14.md',
'/notes/daily/2026-09-13.md',
'/notes/daily/2026-09-10.md',
]),
});
await flush();
const items = container.querySelectorAll('.daily-notes-item');
@@ -107,14 +111,13 @@ describe('renderDailyNotesPanel — Today button', () => {
});
describe('renderDailyNotesPanel — click an existing entry', () => {
test('clicking a row calls onOpenFile with that row\'s path', async () => {
test("clicking a row calls onOpenFile with that row's path", async () => {
const onOpenFile = jest.fn();
const { container } = mountPanel({
onOpenFile,
listExisting: jest.fn().mockResolvedValue([
'/notes/daily/2026-09-14.md',
'/notes/daily/2026-09-10.md',
]),
listExisting: jest
.fn()
.mockResolvedValue(['/notes/daily/2026-09-14.md', '/notes/daily/2026-09-10.md']),
});
await flush();
const items = container.querySelectorAll('.daily-notes-item');
@@ -139,7 +142,10 @@ describe('renderDailyNotesPanel — click an existing entry', () => {
describe('renderDailyNotesPanel — refresh', () => {
test('refresh button re-fetches the list', async () => {
const listExisting = jest.fn().mockResolvedValueOnce([]).mockResolvedValueOnce(['2026-09-14.md']);
const listExisting = jest
.fn()
.mockResolvedValueOnce([])
.mockResolvedValueOnce(['2026-09-14.md']);
const { container, api } = mountPanel({ listExisting });
await flush();
expect(container.querySelectorAll('.daily-notes-item')).toHaveLength(0);
@@ -172,4 +178,4 @@ describe('renderDailyNotesPanel — graceful degradation', () => {
await flush();
expect(container.querySelectorAll('.daily-notes-item')).toHaveLength(1);
});
});
});