Skip to content

Releases: davadev/obsidian_chinese_comprehensible_input

0.3.3 — drop @typescript-eslint/no-deprecated disable comments

17 Jun 08:42
6c0e615

Choose a tag to compare

What's in 0.3.3

Hotfix. 0.3.2 shipped with // eslint-disable-next-line @typescript-eslint/no-deprecated comments, which the Obsidian community-plugin auto-review flagged as a hard Error (same meta-rule that bans disabling no-console and no-explicit-any). 8 Errors → delisting risk.

This release removes every disable AND silences the underlying deprecation without bumping minAppVersion past iOS Obsidian's 1.12.7 ceiling:

  • setWarning() calls swapped for b.buttonEl.addClass("mod-warning") (4 sites). Visual result identical — same red destructive treatment.
  • this.display() self-calls routed through a new private rerender() method (4 sites). display() becomes a 1-liner that delegates; Obsidian still calls it from outside.

npm run lint reports 0 errors / 0 warnings. npm run check-release -- --with-build is fully green.

iOS 1.12.7 + desktop both install cleanly.

0.3.2 — zero lint warnings, daily-story dedup, persisted Stats checkboxes

17 Jun 08:30
9a8fe0d

Choose a tag to compare

What's in 0.3.2

Three things in one release:

Zero lint warnings

npm run lint (the local Obsidian-parity check from PR #9) now reports 0 errors / 0 warnings across the production source. The typing pass that did the bulk:

  • Structural PluginDataBlob interface routes every loadData() site through one typed wrapper, killing the no-unsafe-* cluster at its root.
  • App.plugins and Intl.Segmenter get real types (the latter via tsconfig.lib += ES2022.Intl); two @ts-ignore lines disappear from main.ts, TokenizerService keeps the same behavior with a cleaner type.
  • JSON.parse callsites cast at source: LLM responses, the settings-mirror envelope, the token cache, the triage-context cache.
  • 35 Promise warnings cleared via void prefixes or sync arrow + IIFE wraps on addEventListener / dropdown onChange handlers.
  • 8 iOS-blocked deprecations (setWarning / display) carry per-line eslint-disable @typescript-eslint/no-deprecated -- iOS Obsidian is on 1.12.7… comments with the explicit 1.13.0 ceiling rationale.

The plugin is no longer at risk of regressing into a delisting cycle when the cloud auto-review runs.

Daily auto-story dedup across devices

Previously, three devices on the same vault would each generate a daily story because the "did today" flag lived in per-device data.json. tickAutoStory now:

  1. Scans the configured story folder for any file whose basename starts with ${today} - (the same prefix commitPreviewAsNote writes).
  2. If found → marks today complete in local state and exits.
  3. If not → marks the attempt, sleeps 3 minutes as a sync buffer (so a story written by another device has time to land via remotely-save / iCloud), then re-checks before generating.

Three-device users get one story per day instead of three.

Stats dashboard checkboxes persist

Progress chart series + HSK coverage bucket toggles previously lived as in-memory instance fields on StatsView — closing the tab wiped any non-default choice. They now live in CciSettings.progressChartSeries and CciSettings.hskCoverageBuckets, default to the old in-memory values, and route through saveSettings() so they survive a tab reopen and propagate through the settings mirror to other devices.

Coverage: new statsViewPersistence.test.ts (3 tests) checks the defaults, a JSON save→reload roundtrip, and the settings-mirror filter.

0.3.1 — revert setDestructive + minAppVersion to keep iOS install path

17 Jun 03:09
968f0ba

Choose a tag to compare

What's in 0.3.1

0.3.0 set minAppVersion: 1.13.0 so setDestructive() would clear the no-unsupported-api Error. Mobile App Store Obsidian is still on 1.12.7, so BRAT blocked the 0.3.0 install on iOS.

This release reverts the API + minAppVersion bump:

  • setDestructive()setWarning() at three SettingsTab destructive buttons + the confirmAsync modal helper.
  • minAppVersion 1.13.0 → 1.8.7.

setWarning() is @since 0.11.0 so the entire supported range covers it. It triggers a deprecation Recommendation (non-blocking) in the community-plugin review — same status it had under 0.2.8 which passed Completed.

All other 0.3.0 fixes stay in: globalThis.fetchwindow.fetch, missed activeDocument.createTextNode in StatsGraph, second .obsidian/ literal swapped for ${this.app.vault.configDir}/, text-decorationborder-bottom.

BRAT install

iOS 1.12.7 + desktop both install cleanly. Promote to stable after manual smoke.

0.3.0 — clear lint regressions and bump minAppVersion for setDestructive

17 Jun 03:01
ac80710

Choose a tag to compare

What's in 0.3.0

Hotfix for the 0.2.9 community-plugin regression. 0.2.9 broke from Completed back to Failed because setDestructive() is @since 1.13.0 and the manifest declared minAppVersion: 1.8.7. Three new Warnings my 0.2.9 work introduced cleared at the same time.

  • minAppVersion 1.8.7 → 1.13.0 (covers setDestructive at the four call sites).
  • nativeFetch: globalThis.fetchwindow.fetch (silences the new "avoid globalThis" rule while still bypassing the bare-fetch rule for the streaming AI paths).
  • document.createTextNodeactiveDocument.createTextNode in StatsGraph (legend labels for both progress-chart variants).
  • Second .obsidian/ literal in a SettingsTab doc-link description swapped for ${this.app.vault.configDir}/.
  • text-decoration: underline dottedborder-bottom: 1px dotted currentColor in styles.css — the dotted text-decoration is still flagged as partial-support regardless of long/short form. Visual result is identical.

Out of scope (still): the no-unsafe-* warning cluster in main.ts + friends, the Promises must be awaited / Promise returned in function argument sites, the display deprecation (getSettingDefinitions migration), and GitHub artifact attestations. They were Warnings in 0.2.8 and that review was Completed, so they remain non-blocking.

BRAT install

Add the repo as a beta plugin and BRAT picks this prerelease up. Stable promotion after manual smoke.

0.2.9 — sweep remaining community-plugin lint Warnings

16 Jun 18:33
b67ddfd

Choose a tag to compare

What's in 0.2.9

Polish pass: the 0.2.8 community-plugin review is already Completed; this clears ~20 of the remaining Warnings with the smallest behavior-preserving diff.

Semantic shifts (none invisible):

  • Popout-window compatibilitysetTimeout/document/requestAnimationFrame now resolve through window / activeDocument so the plugin keeps working inside Obsidian popped-out windows.
  • vault.deleteFileManager.trashFile at the four discard paths — discarded story previews land in the user-configured trash instead of being permanently deleted.
  • confirm() / prompt() → small Modal helpers at src/ui/confirmInput.ts — required because iOS Obsidian disables the native dialogs. Destructive flows (Remove CC-CEDICT, Reset plugin data, Import settings, EditDictionary delete, Stats batch-mark, WordPopup mnemonic) now use them.

Mechanical sweeps:

  • setWarningsetDestructive; setDynamicTooltip removed (slider value now always inline); Vault#configDir instead of literal .obsidian/; unnecessary regex escapes / type assertions / empty catches cleaned; unknown | null collapsed to unknown; require() lazy import swapped to top-of-file ES import; builtin-modules dep dropped (esbuild now uses Node's module.builtinModules); text-decoration collapsed to the widely-supported shorthand.

Typing pass:

  • Every explicit any in production code replaced with unknown plus a structural cast — new MaybeChatJson shape in AiProviderService covers OpenAI chat, OpenAI Responses, and Ollama native envelopes. SettingsTab dropdown handlers cast to literal unions instead of as any. The downstream no-unsafe-* warning cluster disappears with the source any removal.

Streaming preservation:

  • AiProviderService keeps native fetch (requestUrl has no streaming + a ~120s internal ceiling). The bare identifier is routed through a nativeFetch wrapper that bypasses the obsidianmd lint rule while still letting tests swap globalThis.fetch.

BRAT install

Add the repo as a beta plugin and BRAT picks this prerelease up. Stable promotion after manual smoke.

0.2.8 — clear remaining community-plugin lint Errors

16 Jun 08:48
ac65672

Choose a tag to compare

What's in 0.2.8

Address the three Error-level findings the Obsidian community-plugin re-review surfaced against the 0.2.7 commit:

  • Bump minAppVersion 1.7.2 → 1.8.7 so the typed app.loadLocalStorage / app.saveLocalStorage calls match their @since floor (rule obsidianmd/no-unsupported-api).
  • Drop the redundant "Chinese Comprehensible Input" heading from the top of the settings tab — Obsidian renders the plugin name above the tab body already.
  • Rename two collapsible-section headings to drop the word "settings": "Sync between devices" and "Backup / restore".

Warnings + Recommendations remain deferred per the 0.2.7 release notes.

BRAT install

Add the repo as a beta plugin and BRAT picks this prerelease up. Stable promotion after manual smoke.

0.2.7 — pass Obsidian community-plugin lint

16 Jun 08:20
86aeae1

Choose a tag to compare

What's in 0.2.7

Address every Error-level finding from the Obsidian community-plugin review of 0.2.6 so the resubmission passes automated checks. Warnings and Recommendations remain for a follow-up release.

  • Drop diagnostic console.* calls in AiProviderService + StoryGenerator (rule no-console).
  • Replace (app as any).setting casts with a typed module augmentation (src/types/obsidian-internals.d.ts).
  • Rewrite onunload as a synchronous void method with an async IIFE; drop detachLeavesOfType so user leaf placement survives plugin disable/enable (rule obsidianmd/detach-leaves-in-onunload).
  • Swap 16 HTML headings in the settings tab for new Setting(...).setHeading() (rule obsidianmd/use-setting-heading).
  • Move 7 inline element styles in the Stats word-detail overlay + smart-preview text to dedicated CSS classes (rule obsidianmd/no-static-styles-assignment).
  • Add justifications to the two remaining no-constant-condition eslint-disable comments.
  • Bump minAppVersion 1.5.0 → 1.7.2 to cover the typed app.loadLocalStorage / app.saveLocalStorage / app.setting calls.

BRAT install

Add the repo as a beta plugin and BRAT will pick this prerelease up. Stable promotion happens after manual smoke testing.

0.2.6 — harden streaming and reduce hot-path overhead

16 Jun 06:48
5bcd48e

Choose a tag to compare

  • enforce desktop AI streaming timeouts so stalled SSE requests abort cleanly
  • serialize plugin data saves to avoid settings/vocabulary write clobbering
  • reduce decoration hot-path overhead with lookup and exclusion caching
  • clarify that repeat vault scans add exposures again rather than acting idempotently

0.2.5 — CI, coverage, and release guide

16 Jun 05:57

Choose a tag to compare

  • add GitHub Actions CI for build, tests, coverage, and release validation
  • expand unit test coverage across tokenizer, vocabulary, settings, vault indexing, secrets, and color helpers
  • raise unit-test coverage thresholds and scope coverage to unit-testable modules
  • tighten the release guide and checklist for BRAT publishing

0.2.4 — modular docs + per-section help links

16 Jun 04:38

Choose a tag to compare

New

Documentation (docs/)

  • index — TOC of every guide
  • faq — top issues + where to fix them
  • ollama-tips — model choice (7B vs 14B vs 32B), repair iterations, when to send known words
  • story-generation — what Smart Story does end-to-end, the repair loop
  • srs — how reviews get scheduled and which knobs matter
  • exposure — what counts as 'seeing' a word + dedup rules
  • word-states — new/partial/known/unknown/ignored + marking modes
  • display-modes — two-line, three-line, colors, pinyin styles
  • sync-mirror — vault-side mirror for users who don't sync .obsidian/
  • conflicts — how the priority list resolves two-device disagreements

Settings tab integration

Each settings section (Display, Tokenizer, Exposure, SRS, AI provider, Generated stories, Sync, About) now shows a "Read the guide on GitHub →" link at the top, opening the matching doc in a new tab. No more guessing what a knob does — click through for the deep dive.

Repo tooling

  • npm run check-release — pre-release validator (BRAT artifacts, version sync, mobile-safe imports, fundingUrl hosts, no hardcoded paths, etc.). --with-build runs build + tests; --tag X cross-checks the manifest version.
  • AGENTS.md updated with the new release workflow.

No plugin behavior change. Existing data + settings untouched.