Releases: bongho/obsidian-book-metasearch
Release list
1.2.3
Fixed
- Concurrent edits to a note are no longer overwritten. Appending a Price
Watch row and refreshing the auto-filled description both read the note,
built a new body from it, and wrote that back. Anything typed in between —
and an Aladin price lookup leaves a whole network round-trip of room — was
silently discarded. Both paths now useVault.process(), which reads and
writes as one atomic operation. - Sentence case in six UI strings: four settings names ending in
Key→key,
plus theReading logandPrice checkheadings.
Security
Development-toolchain only — the packages below live in devDependencies and
never reach the bundled main.js.
- Bumped
vitest2.1.9 → 3 and@vitest/coverage-v8to match, clearing two
critical advisories in@vitest/mocker(arbitrary file read/execute while
the Vitest UI server is listening). Dependabot never proposed this because
the fix needs a major bump —npm auditsurfaced it instead. With the
follow-upnpm audit fixfor transitivebrace-expansionandfast-uri
advisories,npm auditgoes from 9 vulnerabilities to 0.
Changed
- Dependency bumps:
eslint9 → 10,@types/node22 → 26,happy-dom15 →
20,esbuild0.25.5 → 0.28.1 (includes a path-traversal fix in esbuild's
dev server),eslint-plugin-obsidianmd0.4.1,globals,typescript-eslint,
and theactions/checkout+actions/setup-nodeCI actions to v7. - Configured
obsidianmd/ui/sentence-casewith this plugin's own vocabulary
(acronyms, provider brand names, and an ignore list for Korean UI copy and
literal placeholder strings), taking lint from 48 warnings to 2. The rule
stays on so it keeps checking English UI strings.
1.2.2
Reverted
- Rolled back M5 (declarative settings API from v1.2.0). In Obsidian 1.13+,
overridingPluginSettingTab.getSettingDefinitions()causes the framework
to render the declarative UI in place of ourdisplay()implementation,
not alongside it as we had assumed. That regressed several UX affordances:
API-key password masking (values shown as plaintext), the reveal toggle,
the per-provider Healthcheck buttons, the "Open migration helper" and
"발급 페이지 열기" action buttons — all vanished from the settings tab.
The currentSettingControlunion has nosecret/passwordvariant and
no idiomatic way to embed the healthcheck action affordances we rely on,
so a partial declarative footprint can't preserve the tab. The v1.0.1
community-plugin reviewer's warning aboutgetSettingDefinitions()will
come back — accepting that in exchange for correct UX and no plaintext
key exposure. Deletedsrc/ui/settings-definitions.ts.
1.2.1
Changed
- Swapped
contentEl.createEl('div', ...)for the more idiomatic
contentEl.createDiv(...)inDuplicateModal, following the
obsidianmd/prefer-create-elguideline. Purely stylistic — behavior
unchanged.
Removed
- The temporary "Screenshots coming soon" placeholder from
README.md
(and its accompanying<!--...-->template block). Real screenshots
will land later without a preview note in the meantime — placeholder
text was tripping the community-plugin reviewer.
Notes
The reviewer also recommended migrating the .setWarning() button call
to .setDestructive(). That API requires Obsidian ≥ 1.13.0, but our
minAppVersion is still 1.4.4 for backward compatibility. Deferred
until we bump minAppVersion in a future release.
1.2.0
Added
- Declarative settings API (Obsidian 1.13+ Settings search) —
BookMetasearchSettingTab.getSettingDefinitions()now returns a
SettingDefinitionItem[]describing every user-facing setting in one
place (src/ui/settings-definitions.ts), so Obsidian 1.13+'s built-in
Settings search bar can find and jump to each option. The existing
display()still owns rendering (including action-only rows like
provider healthcheck buttons that don't map to declarative controls);
the two code paths run in parallel and don't compete. Each control's
keymatches itsBookMetasearchSettingsfield, so the framework's
defaultgetControlValue/setControlValuehandle read/write with no
glue.aliasesare added on every control to widen search recall
(e.g.["ttb", "aladin", "api key"]for the Aladin TTB Key). Resolves
the Obsidian community-plugin review warning shipped since v1.0.1.
Changed
obsidiandevDependency bumped1.12.3 → 1.13.1to pick up the
SettingDefinitionItemtypes.
1.1.0
Added
- Vitest test infrastructure — colocated
*.test.tsfiles,happy-dom
environment,obsidianmodule aliased to a local mock so pure utilities can
be unit-tested without an Obsidian runtime. CI (.github/workflows/lint.yml)
now runsnpm testin addition to lint + build. (M0-A) - Auto-dumped diagnostics notes — when a provider healthcheck or the
migration helper fails, the plugin writes a redacted diagnostics note to
errorDumpFolderso users have a concrete artifact to attach to bug
reports. API keys, tokens, secrets, and passwords are automatically masked
based on the setting field name suffix. New settings:errorDumpEnabled
(defaulttrue),errorDumpFolder(default
85. References (Book Search)/_errors). (M0-B) - Migration banner state tracking — new
migrationCompletedAtand
migrationBannerDismissedAtsettings persist across reloads, and a new
one-lineNoticeon startup points anpigon users to the migration helper.
The banner suppresses itself once the user hits "완료" or "나중에" in the
MigrationModal. Pure helpershouldShowMigrationBanneris exported from
src/migration/naver-detector.tsfor direct unit testing. (M0-C) - Auto-filled Abstract / Description section — new notes created via
"Search books" and "Search books by ISBN" now populate the
## Abstract / Descriptionauto-block with the provider'sdescription
field (Aladin subInfo, Kakao contents, Google Books description, Open
Library first sentence). TheUpdate book info in current notecommand
refreshes the same block on demand while preserving edits made outside
theBOOKSEARCH:AUTO-START/ENDmarkers. New setting:autoFillDescription
(defaulttrue). (M0-D) - ISBN13 vault-wide duplicate detection — before creating a new book
note, the plugin scans the vault for existingtype: referencenotes with
a matching ISBN10 or ISBN13. On match,DuplicateModaloffers four
actions: open existing / update existing / create anyway (ignore dedup) /
cancel.VaultBookIndexruns incrementally viametadataCache.on('changed')
andvault.on('delete'/'rename')hooks. New setting:duplicateAction
(default'ask'; also supports'open','update','error'for
headless workflows). (M1-A) - Reading Log workflow — three new commands ("Mark book as
wishlist / reading / read") stamp the active note'sstatusfrontmatter
and recordstartedAt/finishedAtYYYY-MM-DD dates automatically on
transition (idempotent — existing stamps are preserved). New notes get a
configurable initial status (defaultwishlist). Commands are only active
ontype: referencenotes taggedbook. New settings:
readingStatusEnabled(defaulttrue),initialStatus(default
'wishlist'). Replaces the hardcodedstatus: inProgresson new notes. (M1-B) - Insert book citation at cursor — new editor command searches all
configured providers and emits a wikilink at the current cursor position.
When the vault already has a matching book note (by ISBN), the link
targets that note's basename; otherwise it emits an unresolved wikilink
(Obsidian's standard "click to create" flow). Two link styles are
available:wikilink([[Title]] (Author, Year)) andwikilink-alias
([[target|Author, Year — Title]]). New settings:citationStyle
(default'wikilink'),citationOnMissing(default'insert-only';
also supports'create-note'for auto-note-creation workflows). (M2) - Aladin used-book price check — opt-in "Check used-book price (Aladin)"
command extends Aladin'sItemLookUp.aspxwithOptResult=subInfo,usedList
to fetch used-book minimum prices across three channels (aladinUsed /
spaceUsed / userUsed). Results surface either as a transient Notice
(default) or appended as timestamped rows to a## Price Watchsection at
the note bottom. Deliberately kept OUT of theBookfrontmatter schema
via a separatePriceQuotetype so re-checks don't produce diff noise on
provider-derived fields. New settings:priceCheckEnabled(default
false, explicit opt-in),priceOutputMode(default'notice-only'). (M3)
Fixed
- Migration modal no longer forgets its own completion. Previously the
"완료" button inMigrationModalonly saved the TTB Key — the intended
migrationCompletedAttimestamp was documented in a comment but never
written, so the migration banner would (silently) have reappeared on every
reload once the banner logic went live. (M0-C)
Notes
Everything above is targeted for the next release as v1.1.0. M1 (ISBN vault
dedupe + Reading Log), M2 (citation insert), M3 (Aladin used-price), and M4
(distribution polish) land in follow-up releases.
v1.0.1
Patch release to refresh the community-plugins scan.
No code changes over v1.0.0. All manifest/lint fixes were already shipped
in the v1.0.0 assets (built from commit 465d4cb, which passed the bot
review). This release just cycles the scan so the listing surfaces the
current clean state instead of the initial failing scan.
v1.0.0
Initial community-plugins release.
Features
- 4-provider metasearch: Aladin (Korean primary) + Kakao (Korean recall) + Google Books (foreign primary) + Open Library (foreign covers/ISBN)
- Two strategies: Sequential fallback or parallel Fanout with ISBN13 dedupe
- Command palette: Search books, Search by ISBN, Search based on current note, Update book info, Naver EOL migration helper
- Template file support with
{{variable}}substitution (Templater<% %>blocks preserved) - Frontmatter customization: useDefaultFrontmatter toggle, key case (as-is/camelCase/snake_case/kebab-case), additional YAML fragment
- Cover image download via Vault.createBinary
- 37 ISO 639-1 locale codes for cross-provider language filtering
- API keys masked in settings UI with click-to-reveal toggle
- Cover thumbnails in search results (opt-in)
Provider setup
- Aladin: TTB Key required (free, immediate) — aladin.co.kr/ttb
- Kakao: REST API Key required (free, no approval wait) — developers.kakao.com
- Google Books: API key optional (raises rate limit) — Google Cloud Console
- Open Library: No auth needed