- Preset fields (from settings) are now seeded as editable/deletable rows in
the modal alongside custom ones, using one consistent row style.
- The note's own merged frontmatter is shown as read-only (disabled) rows at
the top of the list (only when 'Merge document frontmatter' is on, and only
for keys not overridden by an editable row).
- Drops the separate read-only 'resolved' text preview; the rows are the
WYSIWYG result.
Adds pure, unit-tested composeFrontmatter()/docFrontmatterToPairs() and removes
the superseded resolveFrontmatter(). Editable rows are authoritative: on a key
collision they override the merged document field. Presets are deep-copied so
editing rows never mutates saved settings.
Co-Authored-By: Claude
The askpass bridge bound a Unix-domain socket to a vault filesystem path
(net.createServer().listen(...sock)). That is invalid on Windows, where
Node's listen() expects a named pipe, so publish aborted with
'listen EACCES: permission denied ...askpass.sock' before git ever ran —
even when the user's git could authenticate. The bridge was non-portable in
general (Windows named pipes; the helper script needs a node binary on PATH).
Remove the bridge and let the user's system git handle credentials via its
native helpers (Git Credential Manager / osxkeychain / libsecret) for https
and ssh-agent for ssh — the 'store nothing' model we already chose.
GIT_TERMINAL_PROMPT=0 stays so git fails fast instead of hanging, and
publish errors now include a credential/identity hint. Deletes askpass.ts
and its test (3 tests); suite 32/32, tsc clean, build OK.
Co-Authored-By: Claude
The 'fetch+reset path' test called commitAndPush without author args and
relied on an ambient git identity. A bare CI runner has none, so 'git commit'
failed with 'Author identity unknown'. Pass an explicit author like the
sibling tests so the suite is deterministic regardless of runner git config.
Co-Authored-By: Claude
- Use function replacer in rewriteBody to prevent $& / $$ / $` / $' pattern
corruption when alt text or siteUrl contains dollar-sign sequences
- Detect empty staged index after `git add -A` and throw a clear
"No changes to publish" error instead of a cryptic git failure
- Correct README flat-slug description: single image → <slug>.<ext>,
multiple → <slug>-1.<ext>, <slug>-2.<ext> (original filename discarded)
- Harden askpass dir resolution: show a Notice and return early if
getFullPath is absent (desktop-only guard), rather than passing a bad path
Co-Authored-By: Claude <noreply@anthropic.com>
- Wrap onPrompt in try/catch in connection handler; on rejection send
empty reply ("\n") so the git/ssh helper exits promptly instead of
hanging indefinitely.
- Reject the start() promise on server 'error' events (e.g. EADDRINUSE)
so callers get a fast failure rather than an eternal hang.
- stop() now unlinks the socket file and helper script to prevent stale-
socket errors on subsequent start() calls with the same dir.
- start() best-effort unlinks a pre-existing stale socket before listen().
- Tests: added onPrompt-rejection (with 3s timeout guard) and restart
(stop then start on same dir) test cases.
Co-Authored-By: Claude <noreply@anthropic.com>
formatValue now detects YAML-special tokens (true/false/null/yes/no/on/off/y/n/~)
and numeric-looking strings, quoting them via JSON.stringify so YAML parsers
cannot misread them as booleans or numbers. ISO date strings (YYYY-MM-DD) are
exempt and remain bare for readability. Adds four covering tests.
Co-Authored-By: Claude <noreply@anthropic.com>