diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7d76572..d847277 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,21 +30,28 @@ jobs: echo "exists=false" >> "$GITHUB_OUTPUT" fi - - name: Generate release notes from commits + - name: Generate release notes if: steps.check.outputs.exists == 'false' id: notes + env: + VERSION: ${{ steps.version.outputs.version }} run: | - PREV_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") - if [ -z "$PREV_TAG" ]; then - LOG=$(git log --pretty=format:'- %s') - else - LOG=$(git log "$PREV_TAG"..HEAD --pretty=format:'- %s') - fi + NOTES_FILE="release-notes/${VERSION}.md" { echo "notes</dev/null || echo "") + if [ -z "$PREV_TAG" ]; then + LOG=$(git log --pretty=format:'- %s') + else + LOG=$(git log "$PREV_TAG"..HEAD --pretty=format:'- %s') + fi + echo "## Changes since ${PREV_TAG:-the beginning}" + echo "" + echo "$LOG" + fi echo "EOF" } >> "$GITHUB_OUTPUT" diff --git a/release-notes/0.69.43.md b/release-notes/0.69.43.md new file mode 100644 index 0000000..8816474 --- /dev/null +++ b/release-notes/0.69.43.md @@ -0,0 +1,206 @@ +# Stashpad — Release Notes + +A chat-style nested-notes view for Obsidian: rapid capture, outliner navigation, +in-place editing. Local-only, no external services. + +--- + +## 0.69.43 — search overhaul, sidebar panels, "When" filter builder *(current)* + +### Sidebar panels + Pinned Notes (0.68) +- New sidebar panels view; first panel is **Pinned Notes** (MRU targeting, + drag-reorder, `P` keybind, strike-through on completed rows). +- Search promoted to a panel-independent global actions row above the master + button bar; an icon-only Search button also lives in the Stashpad header + between the folder switcher and tags dropdown. + +### Search modal overhaul (0.69) +- Multiple matches in a long note surface as separate clustered result rows + with ±2-line preview context (capped at 5 clusters per note). +- Local-folder badge on every note row; N folder-open entries collapse into a + single "Open folder in a new tab…" sub-picker. +- Breadcrumb path line under the parent blurb (local + cross-folder). +- Query-token highlighting in titles, previews, and parent blurbs. +- `in:` now spans every searchable Stashpad folder, matching the parity of the + time filters. +- **Create-from-search:** when no results match, a "Create new: " row + appears. Picking it opens a destination picker across all Stashpad folders + and spawns a new tab on the picked parent. +- Re-pressing the search keybind while the modal is open focuses + selects-all + in the search input (instead of stacking a second modal). +- Tab is focus-trapped inside the modal (wraps instead of escaping to Obsidian). + +### "When" filter builder (0.69) +- Unified `before:` / `on:` / `after:` into a single **When** chip with + Before / On / After / Between mode tabs. +- **Day picker:** Today / Yesterday + Mon–Sun row; weekday names in the END + slot of Between mode resolve to the next future occurrence. +- **Timeframe picker:** preset chips (Last 7d / 30d / This week / This month) + plus a "Last N units" stepper. When used with `on:`, relative durations are + converted to a concrete `YYYY-MM-DD`. +- **Custom time picker:** HH/MM fields, AM/PM toggle, 3×4 numpad, Tab cycling, + 24h support. +- Keyboard polish: Enter/Escape stay inside the builder; popover keys don't + leak to the result list; unhandled keys fall through to the rest of + Obsidian's keymap. + +### Composer undo fixes (0.69) +- `Mod+Z` / `Mod+Shift+Z` in the composer now reliably triggers the textarea's + native undo / redo. (Previously could accidentally undo the prior Stashpad + action when the textarea was empty.) +- Stashpad's own undo still works from the note list — blur the composer + (`Esc`) first. +- **Known issue:** `Mod+Backspace` (delete-to-line-start) in the composer is + not yet undoable. Three different approaches were attempted (`setRangeText`, + `execCommand`, manual in-RAM stack) and each broke something else; + documented for a future attempt. `Opt+Backspace` (delete-word) is undoable. + +### Other quality-of-life +- Smart bracket pairing in the search input: auto-insert closing `]`, + pair-delete on backspace. +- Color filter menu no longer crashes on open (TDZ fix). +- Breadcrumb infinite loop on cyclic ancestor chains fixed (visited-id Set). +- Sub-picker close no longer dismisses the parent search modal. + +--- + +## 0.62.4 — Tiny Mode, ribbon menu button, copy-codeblock keybind + +### Ribbon icon (0.62.0–0.62.3) +- Clicking the ribbon button now opens a searchable folder picker showing + every Stashpad in the vault — leaves, folders, and a "Switch folder…" + entry — instead of jumping to whichever tab happened to be open. +- The "Open Stashpad in new tab" command also shows the picker on + multi-folder vaults. + +### Tiny Mode + view modes (0.61) +- **Tiny mode** — pop the current Stashpad out into a small always-visible + window with a minimal shell. Three view-mode buttons (Normal / Compact / + Tiny) live in the header. +- Compact rules apply to Tiny too; composer narrows below a 700px threshold; + rail collapses on wide→narrow transitions. +- Tiny window restores via `setBounds`; plugin stylesheet is injected into + popout windows on open so styles work in detached windows. +- Sticky toggle no longer resizes the window. + +### Codeblock copy + Notification history +- New default keybind (`{`) to copy code from a fenced code block under the + cursor. +- Notification history is now reachable from the actions menu; the log + section moved to the top of settings. + +### Ouroboros + selection polish (0.63) +- Swap a note with its parent — with cycle guard, descendant-move recovery, + and a "Confirm Note Swap" modal. +- Siblings travel with the swap; undo is cycle-safe. +- Multi-select: mod-click fully deselects; shift-arrow trims the range. + +### Advanced search filters (0.64) +- New `in:` / `before:` / `after:` / `on:` filters with a clickable chip row. +- Multi-word filter values; bracketed values + (`in: [copy stashpad features]`); date filters accept an optional + time-of-day suffix. +- `in:` matches "inside the subtree of a note matching this title." +- Folder-open results are downranked when a filter is active. + +### Unified folder picker (0.65) +- One picker handles reveal / open / switch-current / create. +- "Open in another new tab" pinned to the bottom. +- Create always opens in a new tab; can convert existing non-Stashpad folders. + +### In-Stashpad navigation (0.66 + 0.67) +- Back / forward buttons in the breadcrumb and the tiny header. +- Per-tab history covers folder switches (not just tree-up); persists across + reloads; back falls through to navigate-up at the root. +- Tiny header's folder/title is itself a folder-picker button. +- `Mod+S` is the default keybind for the unified folder picker. +- `cloneSubtree` snapshots children before insert and refuses same/descendant + targets. + +### Perf +- Dropped `:has()` selectors, lazy anchor capture, removed a spurious + composer retry path. + +--- + +## 0.60.0 — Ribbon menu shipped first + +### Ribbon icon +- Ribbon click now opens a context menu listing every Stashpad — leaves, + folders, and a folder picker — instead of jumping to whichever tab happened + to be open. (Later refined into the searchable picker in 0.62.x.) + +### Small-features batch (0.59) +- Catch-all fixes: typo, slug, capitalization, select-all, export fixes, + jump-to-parent across folders, breadcrumb count, color undo. +- Keybind input: wider field with a "Use both" override; true auto-resize; + cancel-restores-prior; dead-key starters (`Option+E` etc.) are now bindable. +- Title-case folder labels in the switch-folder picker. +- Scroll: the `preserve` policy sticks to the bottom when at bottom; + `scrollListToBottom` uses a settle watchdog for at-bottom mutations. + +--- + +## 0.58.2 — NotificationService, ScrollPolicy, picker unification + +### Frontmatter recovery layer (0.54) +- Redundant `parentLink` + `children` frontmatter so a note can be navigated + up/down even if Stashpad's index breaks. +- Home notes renamed to `Home-.md` with bootstrap-time backfill. +- Rebootstrap button also backfills frontmatter; quiet when already in sync. + +### NotificationService (0.55) — the headline feature +- Centralized notification infrastructure. +- Verbose notifications for delete / move / merge / clone / reorder. +- Persistent history modal + settings entry + command. +- Per-category mute settings UI; multiplayer (cross-author) filters in the + history modal. +- Bulk actions show bulleted summaries; toast CSS polish; multi-line errors; + clear-history confirm. +- Frontmatter sync: silent success, persistent toast on failure only; live + notice for sustained queue activity. +- Import error toasts get Reveal / Show actions; per-attachment delete toasts + route through the service. + +### ScrollPolicy + cursor restore (0.56) +- New `ScrollPolicy` type wired through `render()`; `preserve` is the default — + kills the post-action bouncing. +- Anchor-row preservation (not pixels); follow-cursor on keyboard reorder; + smart post-delete selection; nest picker selects the new parent; undo of + nest highlights the un-nested note. +- Last cursor row persists across reloads via localStorage; restored by id. + +### Picker unification (0.57) +- Token-order-agnostic matching in the suggest picker + folder picker. +- Folder picker = Stashpad-only; destination + move pickers = cross-folder + + roots. +- Find modal → pick a Stashpad folder → opens in a new tab; spawned tab + returns focus to origin on close. + +### Context-menu polish (0.58) +- Context-menu toggle complete; rebootstrap renames stale slugs and refreshes + the command palette. +- Icons for "Move to" / "Move to Home." +- Notify on no-op moves (already at destination, or into self). + +--- + +## 0.53.20 — Multiplayer authorship, per-parent sort, scroll-to-bottom + +- **Multiplayer authorship** (0.51.11): author / contributor stamping, footer + row in the view, log author column. Per-user identity stored in settings; + author stub files live under `_authors/`. +- **Per-parent sort dropdown** (0.52.0): sort each parent's children + independently; drag reverts that parent to manual mode. +- **Robust scroll-to-bottom** (0.53.x): adaptive scroll that survives slow + markdown render on Obsidian reload — per-row ResizeObserver, sticky observer + for the at-bottom branch, watchdog `requestAnimationFrame` polling for up to + 30s. `stickToListBottom` short-circuits the geometric check. + +--- + +## Install + +Compatible with Obsidian 1.7+. Install via BRAT from this repo, or copy +`main.js`, `manifest.json`, and `styles.css` into a folder under your vault's +`.obsidian/plugins/`.