Commit graph

104 commits

Author SHA1 Message Date
Richard McCorkle
a9e54fc0bd docs: design spec for iOS-player transcript fallback replacement
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 14:01:58 +02:00
Richard McCorkle
4dc4d8589f fix: enlarge mobile example-template viewer so content is visible
The template-viewer content box used only max-height, so on mobile it
collapsed to a blank single line. Add a mobile size override for the
modal and a definite height for the content container inside the
existing max-width:768px media query. Desktop is unchanged.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:48:48 +02:00
Richard McCorkle
80df0c1b33 docs: implementation plan for mobile template-viewer height fix
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:47:33 +02:00
Richard McCorkle
b7db064d48 docs: design spec for mobile template-viewer height fix
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:33:44 +02:00
Richard McCorkle
04e1190e7f Merge info-openrouter-spinner: service info icons, OpenRouter refresh, desktop spinner fix
- Info (i) icons with service URLs on the ScrapeCreators, Supadata,
  and OpenRouter settings.
- fetchOpenRouterModels: refresh the full OpenRouter model list from
  the public API, vendor-grouped dropdown, auto-stored token limits.
- Desktop processing no longer shows a blank popup: the modal closes
  on desktop (status-bar spinner only); mobile keeps the in-modal spinner.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:27:03 +02:00
Richard McCorkle
17dec2f218 fix(ui): close create-note modal on desktop during processing (no blank popup)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 12:23:40 +02:00
Richard McCorkle
f74915e08d feat(llm): add OpenRouter model-list refresh with vendor-grouped dropdown
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 12:18:43 +02:00
Richard McCorkle
74e7d81695 feat(settings): add service-URL info icons for ScrapeCreators, Supadata, OpenRouter 2026-05-18 12:14:07 +02:00
Richard McCorkle
68c7aa7472 docs: implementation plan for info icons, OpenRouter refresh, desktop spinner fix
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 12:12:02 +02:00
Richard McCorkle
d7d2d06198 docs: design spec for service info icons, OpenRouter refresh, desktop spinner fix
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 12:07:53 +02:00
Richard McCorkle
0b6d8efcb9 Merge tier-a-native: migrate UI primitives to native Obsidian components
Tier A of the UI native-component audit, no intended look-and-feel change:
- info icon and icon buttons -> setIcon / ExtraButtonComponent
- text buttons -> ButtonComponent (Process uses setCta)
- create-note modal URL/title inputs -> TextComponent, video-count
  select -> DropdownComponent

Deferred: MarkdownRenderer for README/license modals, FuzzySuggestModal
for the pickers (both visibly change look).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:01:29 +02:00
Richard McCorkle
229d375d42 refactor(ui): convert create-note modal inputs to native components
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 10:47:48 +02:00
Richard McCorkle
b6f240c07a refactor(ui): convert text buttons to ButtonComponent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 10:41:58 +02:00
Richard McCorkle
0d80f094de refactor(ui): convert icon buttons to ExtraButtonComponent
Replace three hand-rolled <button> + createElementNS SVG + mouseenter/mouseleave
hover handlers with ExtraButtonComponent (license eye, readme eye, copy button).
Remove now-dead tubesage-icon-button and tubesage-icon-button-hover CSS rules.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 10:38:42 +02:00
Richard McCorkle
950a087df5 refactor(ui): render settings info icon with native setIcon 2026-05-18 10:28:10 +02:00
Richard McCorkle
c4aa28afad docs: implementation plan for Tier A native-component migration
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 10:21:44 +02:00
Richard McCorkle
f1bd48ab46 docs: design spec for Tier A native-component migration
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 10:16:36 +02:00
Richard McCorkle
58f0e2a480 chore: bump to 1.3.3
Releases the current state as a stable before/after boundary:
- Copy template button restored (mobile users cannot scroll the
  template example), plus a mobile touch-scroll hint.
- Settings info-icon tooltips fixed: native Obsidian setTooltip
  replaces the flaky custom hover tooltip; OpenRouter reliability
  note added to the LLM tooltip.
- Workflow and data-flow mermaid diagrams refreshed to current
  architecture.
- README links made absolute so they resolve on the community site;
  demo video linked.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 10:08:55 +02:00
Richard McCorkle
b6a67fe822 Merge docs-absolute-links: fix community-site README links
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 09:58:43 +02:00
Richard McCorkle
1d8e6cef0c docs: use absolute GitHub URLs in README, add demo video link
Relative links (docs/, LICENSE, MIT-license-tubesage.md) resolve
against community.obsidian.md on the plugin's community page and 404.
Switch them to absolute github.com URLs so they work on both GitHub
and the community site. Add a link to the demo MP4 hosted in the repo.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 09:58:43 +02:00
Richard McCorkle
28ff432533 Merge copy-tooltips-diagrams: restore copy button, native tooltips, refresh diagrams
- Restore the Copy template button (mobile users cannot scroll the
  template example); add a mobile touch-scroll hint.
- Replace the flaky custom info-icon tooltip with Obsidian's native
  setTooltip; add an OpenRouter reliability note to the LLM tooltip.
- Refresh the workflow and data-flow mermaid diagrams to current
  architecture.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 09:44:04 +02:00
Richard McCorkle
b878aae1e0 docs: refresh workflow and data-flow mermaid diagrams
Replace speculative/fictional components with architecture facts
verified from source: secret storage for cloud API keys, collectUnder
scoped folder traversal, LangChainClient dispatch for cloud providers,
OllamaClient for local, obsidianFetch shim for all HTTP, tiktoken
stubbed at build time, and OpenRouter as a supported cloud provider.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 09:41:30 +02:00
Richard McCorkle
6a5461d71c fix: use native setTooltip for settings info icons, add OpenRouter note
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 09:24:21 +02:00
Richard McCorkle
f61c314eb8 feat: restore Copy template button, add mobile touch-scroll hint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 09:17:50 +02:00
Richard McCorkle
9c1d1cdc76 docs: implementation plan for copy button, tooltips, diagram refresh
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 09:15:54 +02:00
Richard McCorkle
050e99a0cd docs: design spec for copy button, info-tooltips, diagram refresh
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 09:12:14 +02:00
Richard McCorkle
53a770b184 chore: bump to 1.3.2
Release of the vault-enumeration and clipboard surface reduction:
the plugin no longer calls getMarkdownFiles / getAllLoadedFiles or
navigator.clipboard, so the Obsidian scorecard's Vault Enumeration and
Clipboard Access flags clear.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 21:34:01 +02:00
Richard McCorkle
a7911399a4 Merge vault-clipboard-surface: remove vault-enumeration and clipboard surface
Replace whole-vault enumeration (getMarkdownFiles/getAllLoadedFiles) with
a scoped collectUnder folder-walk, and remove the Copy template button
(the only navigator.clipboard use), to clear the Obsidian scorecard's
Vault Enumeration and Clipboard Access flags.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 21:29:30 +02:00
Richard McCorkle
3710f47f19 refactor: remove dead copy-button CSS rules
The .tubesage-template-view-copy-container and -copy-text rules were
used only by the Copy template button removed in the previous commit.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 21:26:37 +02:00
Richard McCorkle
d658ae21ef refactor: remove Copy template button (drops navigator.clipboard use)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 21:23:50 +02:00
Richard McCorkle
b1282e8c6d refactor: drop diagnostic vault enumeration in note-not-found branch 2026-05-17 21:20:57 +02:00
Richard McCorkle
fc8e415099 refactor: folder picker walks the root folder subtree 2026-05-17 21:19:05 +02:00
Richard McCorkle
c0523a3b34 refactor: template picker walks the templates folder subtree 2026-05-17 21:11:57 +02:00
Richard McCorkle
10dea4d04e feat: add collectUnder folder-walk helper 2026-05-17 21:08:52 +02:00
Richard McCorkle
16f9438879 docs: implementation plan for reducing vault/clipboard surface
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 21:07:09 +02:00
Richard McCorkle
35c0f935d0 docs: design spec for reducing vault-enumeration and clipboard surface
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 21:01:51 +02:00
Richard McCorkle
96740ebee7 Merge release-1.3.1: network-free tiktoken stub
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 20:33:50 +02:00
Richard McCorkle
f48baea94e chore: stub LangChain tiktoken util, bump to 1.3.1
Replace @langchain/core's tiktoken helper with a network-free stub via
an esbuild onLoad plugin. The upstream module lazy-fetches tokenizer
data from https://tiktoken.pages.dev; TubeSage never counts tokens, so
that path was unreachable, but the URL still sat in the bundle and
showed up as an external domain on the Obsidian plugin scorecard. The
stub removes it from main.js entirely.

- esbuild.config.mjs: add the stub-langchain-tiktoken onLoad plugin
- README.md: drop the tiktoken.pages.dev disclosure (no longer contacted)
- bump manifest.json / package.json / package-lock.json to 1.3.1

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 20:33:50 +02:00
Richard McCorkle
c5a57469b5 Merge cleanup-dead-members: remove fallow-flagged dead class members
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 20:20:38 +02:00
Richard McCorkle
800bbee770 refactor: remove dead class members flagged by fallow
Fallow dead-code analysis flagged 13 issues. Removed the 10 that are
genuinely unreferenced:
- LLMFactory.getBestProvider, LLMFactory.updateSettings
- GeminiClient.isAvailable, OllamaClient.isAvailable
- ProcessingSpinner.setLabel, plus the now-dead callCount field and its
  '#N' suffix in the spinner text (setLabel was callCount's only writer,
  so the counter had been stuck at 0 already)
- YouTubeTranscriptExtractor.fetchTranscriptSegments, combineTranscript,
  clearConfigCache, parseJsonCaptions
- dropped the unused 'export' on the CaptionTrack interface (still used
  locally in the file, just never imported elsewhere)

Kept OllamaClient.validateConnection and createChatCompletion: fallow
flagged them, but transcript-summarizer.ts calls them via a loosely
typed 'client' variable that fallow cannot statically resolve.

Build and lint pass clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 20:20:37 +02:00
Richard McCorkle
65a17f83d5 Merge docs-scan-disclosures: disclose network/vault/clipboard access
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 20:05:15 +02:00
Richard McCorkle
dce932b61d docs: disclose all network requests and vault/clipboard access
The Obsidian plugin scorecard flagged that network requests and
capabilities should be disclosed to users. The Privacy & Security
section claimed the only network requests were to the LLM provider
and YouTube, which omitted tiktoken.pages.dev.

Rewrite the section to accurately disclose:
- tiktoken.pages.dev (tokenizer data, via the js-tiktoken transitive
  dependency of LangChain; not called by TubeSage directly)
- vault file/folder enumeration (folder picker, template discovery)
- clipboard writes (the 'Copy template' button; never reads clipboard)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 20:05:15 +02:00
Richard McCorkle
c9c8a64beb Merge docs-secret-storage: document Obsidian secret storage for API keys
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 08:22:59 +02:00
Richard McCorkle
dff8503def docs: document that cloud API keys use Obsidian secret storage
- Note in LLM provider setup and Privacy & Security that cloud keys
  (OpenAI, Anthropic, Google, OpenRouter) are stored in Obsidian's
  native secret storage, not data.json, and that this is automatic.
- Mention the automatic migration of pre-1.3.0 keys.
- Correct the stale minimum Obsidian version (v1.2.0 -> v1.11.4),
  which secret storage requires.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 08:22:58 +02:00
Richard McCorkle
a21cbc5bc8 Merge lint-zero-errors: npm run lint passes cleanly
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 08:05:55 +02:00
Richard McCorkle
e98eb5d0db fix(lint): clear remaining sentence-case errors
- Correct brand/acronym casing in UI text: 'Youtube' -> 'YouTube'
  (setting name + description), 'oauth' -> 'OAUTH', dropdown label
  'Openai' -> 'OpenAI'. These were genuine misspellings.
- Whitelist the 'OpenRouter' dropdown label via ignoreRegex; it is a
  brand with intentional internal capitals not in the rule's brand
  list, and ignoreWords is bypassed for single-word strings.

npm run lint now passes with 0 errors and 0 warnings.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 08:05:55 +02:00
Richard McCorkle
d1d74e6a5d Merge lint-timer-carveout: resolve prefer-active-doc / prefer-window-timers conflict
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 07:48:22 +02:00
Richard McCorkle
8800b98df4 fix(lint): carve out window timer calls in prefer-active-doc rule
The local prefer-active-doc rule flagged every `window` identifier as
preferring `activeWindow`. obsidianmd 0.3.0's new `prefer-window-timers`
rule requires the opposite for timer calls (`window.setTimeout` etc.),
so the two rules contradicted, leaving 11 unfixable warnings.

Add a `window.<timerMethod>` carve-out to the local rule, mirroring the
same exception in upstream eslint-plugin-obsidianmd's prefer-active-doc.
Lint now reports 0 warnings (4 errors remain: intentional brand-name
casing left per project decision).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 07:48:09 +02:00
Richard McCorkle
7458806dde Merge eslint-upgrade: bump eslint-plugin-obsidianmd to 0.3.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 07:38:31 +02:00
Richard McCorkle
8311ee1fb8 chore: upgrade eslint-plugin-obsidianmd to 0.3.0, fix resulting lint errors
Bump eslint-plugin-obsidianmd 0.2.9 -> 0.3.0 and typescript-eslint
8.58.2 -> 8.59.3. ESLint stays at 9.39.4: obsidianmd 0.3.0 peer-pins
@eslint/js ^9 and @eslint/json 0.14.0, so ESLint 10 is not yet
cleanly supported.

obsidianmd 0.3.0 adds two new rules. Fixes for the errors they raise:
- no-unnecessary-type-assertion: remove 4 redundant type assertions
  (main.ts x3, fetch-shim.ts x1) - all compile-time-only, tsc confirms.
- prefer-window-timers: switch 11 activeWindow timer calls to window
  (main.ts, form-utils.ts, processing-spinner.ts). TubeSage has no
  popout-window feature, so window === activeWindow at every call site.

Note: obsidianmd 0.3.0's prefer-active-doc rule (warning) now flags
window.* as preferring activeWindow, directly contradicting the
error-level prefer-window-timers rule. window.* is kept because it
satisfies the error-level rule; the 11 advisory warnings are an
upstream rule conflict and cannot be resolved without suppression.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 07:38:12 +02:00