All release testing now happens against the published -alpha/-beta
prerelease assets installed in the test vault (attested CI builds), and
cutting the stable release is only the version bump + bare tag on the
same source. Doc-only commits may ride between the last prerelease and
the stable tag; anything affecting the built artifact means a new
prerelease round.
Updated: RELEASING.md (TL;DR, pre-flight, "The alpha/beta channel"),
release-checklist SKILL.md (Phases 2/3/5 install the prerelease via
gh release download; release:prep stays as the mid-development path),
CHECKLIST.md intro, CLAUDE.md summaries. Also corrected RELEASING.md's
stale description of version-bump.mjs (it records every version, not
only floor changes).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
All ~30 warnings traced to the bot's lint environment resolving types
differently from local, not to unsafe code (DEVCONFLICTS.md finding 10):
- tsconfig lib was ES2016 while the code uses ES2017-ES2019 APIs
(Object.entries/values/fromEntries, padStart, Promise.finally); the
test suite's auto-included @types/node masked it locally. lib is now
["DOM", "ES2019"] with types: [] so a mismatch fails npm run build.
- moment's typings don't resolve in the bot's environment (obsidian's
re-export types via the moment package). All calls now go through
formatMoment in src/time.ts, a narrow structural alias.
- secrets.ts needed as-BufferSource assertions on TS 5.7+ that older TS
flags as unnecessary; restructured (inferred ArrayBuffer-backed byte
helpers, BufferSource param, one 32-byte copy) to need none on any
TS version. Crypto behavior unchanged.
- The two flagged as-Record casts became an isRecord type predicate.
Docs: CLAUDE.md "Review-bot type environment" gotcha, RELEASING.md
parity section (plus the pre-release docs from the workflow change),
DEVCONFLICTS.md finding 10, ROADMAP.md Unreleased entry.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Local npm run lint now enforces the three classes the community-review bot
caught only at submission:
- type-checked @typescript-eslint rules (no-deprecated, no-unsafe-*,
no-unnecessary-type-assertion) scoped to src/
- no-unsupported-api (Obsidian API newer than manifest minAppVersion),
cherry-picked from a 0.4.1 alias since the pinned 0.1.9 base lacks it
- noInlineConfig, so an eslint-disable can no longer silence a rule
Base plugin stays pinned at 0.1.9 (0.4.x's sentence-case diverges from the
bot); only the single no-unsupported-api rule is taken from the alias.
Docs: CLAUDE.md, RELEASING.md, release-checklist SKILL.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Community-review remediation (no behavior change):
- Remove eslint-disable in realtime/pcm.ts; reach the deprecated ScriptProcessor
API through local type-aliases so no-deprecated never fires.
- Raise minAppVersion to 1.6.6 for FileManager.trashFile (@since 1.6.6).
- Enable the reviewer's type-checked lint rules locally for src/.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Real-time dictation (AssemblyAI/Deepgram, own provider/key/model), auto-ingest
folders, record-in-background, per-invocation diarization, manage built-in
templates (enable/track), local whisper.cpp auto-start/idle-stop, and dev tooling
(local review + release-checklist skill).
Voxtral realtime was reverse-engineered but pulled (not WebView-reachable); its
adapter is kept on disk, unwired.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Secrets:
- Warm the secret-storage probe before loadSettings so a fresh install
actually defaults to Obsidian secret storage instead of caching an
unconfigured passphrase envelope first.
- setEncryptionMode no longer early-returns on same-mode: an unconfigured
passphrase store now always builds its kdf/verifier, so creating a
passphrase (incl. on Linux without a keyring) writes secrets.json.nosync
instead of silently no-opping.
Modal:
- The Record tab closes the modal on Stop and runs the pipeline detached
with Notice progress (per-stage setMessage) and Notice errors, mirroring
the reprocess-audio flow. The persisted recording is the recovery path,
so no inline Retry. Paste / From note keep the in-modal Retry flow.
Docs:
- Replace FEATURES.md with ROADMAP.md: Planned / Unreleased / Released
lifecycle, wired into the RELEASING.md release steps.
- Update SECRETS.md, CLAUDE.md, and the Commands-and-Menus wiki page.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add: x.y.z-only versioning and 'directory reads manifest at default-branch HEAD'; the official draft-based gh-release workflow variant and the repo-level Actions write permission; corrected community submission via the community.obsidian.md web form (feedback = new incremented release); a submission-requirements section; a broader plugin-guidelines regression checklist; and links to the canonical Obsidian docs.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A release runbook covering Obsidian's rules (bare version tag, asset shape, minAppVersion vs API @since, versions.json logic), the CI attestation flow, pre-flight checks, the guideline-conflict checklist, and post-release verification. CLAUDE.md now points to it from the Commands and Releases sections.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>