Releases: davadev/obsidian_chinese_comprehensible_input
0.3.3 — drop @typescript-eslint/no-deprecated disable comments
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 forb.buttonEl.addClass("mod-warning")(4 sites). Visual result identical — same red destructive treatment.this.display()self-calls routed through a new privatererender()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
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
PluginDataBlobinterface routes everyloadData()site through one typed wrapper, killing the no-unsafe-* cluster at its root. App.pluginsandIntl.Segmenterget real types (the latter viatsconfig.lib += ES2022.Intl); two@ts-ignorelines disappear frommain.ts,TokenizerServicekeeps 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
voidprefixes or sync arrow + IIFE wraps onaddEventListener/ dropdownonChangehandlers. - 8 iOS-blocked deprecations (
setWarning/display) carry per-lineeslint-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:
- Scans the configured story folder for any file whose basename starts with
${today} -(the same prefixcommitPreviewAsNotewrites). - If found → marks today complete in local state and exits.
- 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
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 + theconfirmAsyncmodal helper.minAppVersion1.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.fetch → window.fetch, missed activeDocument.createTextNode in StatsGraph, second .obsidian/ literal swapped for ${this.app.vault.configDir}/, text-decoration → border-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
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.
minAppVersion1.8.7 → 1.13.0 (coverssetDestructiveat the four call sites).nativeFetch:globalThis.fetch→window.fetch(silences the new "avoid globalThis" rule while still bypassing the bare-fetch rule for the streaming AI paths).document.createTextNode→activeDocument.createTextNodeinStatsGraph(legend labels for both progress-chart variants).- Second
.obsidian/literal in aSettingsTabdoc-link description swapped for${this.app.vault.configDir}/. text-decoration: underline dotted→border-bottom: 1px dotted currentColorinstyles.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
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 compatibility —
setTimeout/document/requestAnimationFramenow resolve throughwindow/activeDocumentso the plugin keeps working inside Obsidian popped-out windows. vault.delete→FileManager.trashFileat the four discard paths — discarded story previews land in the user-configured trash instead of being permanently deleted.confirm()/prompt()→ small Modal helpers atsrc/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:
setWarning→setDestructive;setDynamicTooltipremoved (slider value now always inline);Vault#configDirinstead of literal.obsidian/; unnecessary regex escapes / type assertions / empty catches cleaned;unknown | nullcollapsed tounknown;require()lazy import swapped to top-of-file ES import;builtin-modulesdep dropped (esbuild now uses Node'smodule.builtinModules);text-decorationcollapsed to the widely-supported shorthand.
Typing pass:
- Every explicit
anyin production code replaced withunknownplus a structural cast — newMaybeChatJsonshape inAiProviderServicecovers OpenAI chat, OpenAI Responses, and Ollama native envelopes. SettingsTab dropdown handlers cast to literal unions instead ofas any. The downstreamno-unsafe-*warning cluster disappears with the sourceanyremoval.
Streaming preservation:
- AiProviderService keeps native
fetch(requestUrl has no streaming + a ~120s internal ceiling). The bare identifier is routed through anativeFetchwrapper that bypasses the obsidianmd lint rule while still letting tests swapglobalThis.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
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
minAppVersion1.7.2 → 1.8.7 so the typedapp.loadLocalStorage/app.saveLocalStoragecalls match their@sincefloor (ruleobsidianmd/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
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 inAiProviderService+StoryGenerator(ruleno-console). - Replace
(app as any).settingcasts with a typed module augmentation (src/types/obsidian-internals.d.ts). - Rewrite
onunloadas a synchronousvoidmethod with an async IIFE; dropdetachLeavesOfTypeso user leaf placement survives plugin disable/enable (ruleobsidianmd/detach-leaves-in-onunload). - Swap 16 HTML headings in the settings tab for
new Setting(...).setHeading()(ruleobsidianmd/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-conditioneslint-disable comments. - Bump
minAppVersion1.5.0 → 1.7.2 to cover the typedapp.loadLocalStorage/app.saveLocalStorage/app.settingcalls.
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
- 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
- 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
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-buildruns build + tests;--tag Xcross-checks the manifest version.- AGENTS.md updated with the new release workflow.
No plugin behavior change. Existing data + settings untouched.