From 0bd31837836fa9342508d789af908ff7e52d98ca Mon Sep 17 00:00:00 2001 From: Jacobinwwey Date: Thu, 9 Apr 2026 02:20:32 -0500 Subject: [PATCH] docs: add multiphase language-support plan with robustness baselines --- .../2026-04-09-language-support/README.md | 19 + .../build-before.txt | 478 ++++++++++++++++++ .../environment-before.txt | 11 + .../targeted-tests-before.txt | 293 +++++++++++ ...age-support-first-principles-multiphase.md | 359 +++++++++++++ 5 files changed, 1160 insertions(+) create mode 100644 docs/superpowers/baselines/2026-04-09-language-support/README.md create mode 100644 docs/superpowers/baselines/2026-04-09-language-support/build-before.txt create mode 100644 docs/superpowers/baselines/2026-04-09-language-support/environment-before.txt create mode 100644 docs/superpowers/baselines/2026-04-09-language-support/targeted-tests-before.txt create mode 100644 docs/superpowers/plans/2026-04-09-language-support-first-principles-multiphase.md diff --git a/docs/superpowers/baselines/2026-04-09-language-support/README.md b/docs/superpowers/baselines/2026-04-09-language-support/README.md new file mode 100644 index 00000000..a48465c8 --- /dev/null +++ b/docs/superpowers/baselines/2026-04-09-language-support/README.md @@ -0,0 +1,19 @@ +# 2026-04-09 Language Support Baseline + +This folder stores immutable **before-change** evidence for the language-support multiphase plan. + +## Files + +- `environment-before.txt`: Runtime and CLI environment snapshot (`node`, `npm`, `obsidian`, `obsidian-cli`). +- `build-before.txt`: Pre-change `npm run build` output. +- `targeted-tests-before.txt`: Pre-change targeted regression test output. + +## Current Baseline Interpretation + +- Targeted tests are PASS on this baseline. +- Build is FAIL on this baseline due to TypeScript `TS6059` triggered by cloned reference code under `ref/notebook-navigator` being included by `tsconfig` glob patterns. +- This build issue is treated as a known baseline constraint and must be resolved in planned Task 9 Step 1 (exclude `ref/**` from TypeScript compile scope if reference folder remains in repo). + +## Usage Rule + +For each implementation task, add matching `taskN-before.txt` and `taskN-after.txt` logs under this folder and perform a direct compare before merging. diff --git a/docs/superpowers/baselines/2026-04-09-language-support/build-before.txt b/docs/superpowers/baselines/2026-04-09-language-support/build-before.txt new file mode 100644 index 00000000..094cfce4 --- /dev/null +++ b/docs/superpowers/baselines/2026-04-09-language-support/build-before.txt @@ -0,0 +1,478 @@ + +> notemd@1.7.14 build +> tsc -noEmit -skipLibCheck && node esbuild.config.mjs production + +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/icon-assets/scripts/update-icon-packs.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/components/calendar/index.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/components/calendar/useCalendarFeatureImages.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/components/calendar/useCalendarHoverTooltip.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/components/calendar/useCalendarNoteActions.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/components/navigationPane/NavigationPaneItemRenderer.types.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/constants/surfaceColorMappings.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useCacheRebuildNotice.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useIndexedDBReady.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useInitializeContentProviderRegistry.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useMetadataCacheQueue.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/usePropertyTreeSync.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useStorageCacheRebuild.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useStorageContentQueue.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useStorageFileQueries.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useStorageSettingsSync.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useStorageVaultSync.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/context/storage/useTagTreeSync.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/navigationPane/useNavigationPaneData.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/navigationPane/useNavigationPaneShortcuts.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useAutoDismissFade.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useContextMenu.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useDragNavigationPaneActivation.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useFileItemPillDecorationState.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useFolderDecorationState.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useListActions.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useListPaneData.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useListPaneKeyboard.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useListPaneScroll.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useListPaneSearch.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useListPaneTitle.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useMeasuredElementHeight.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useNavigationPaneKeyboard.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useNavigationPaneScroll.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useNavigatorEventHandlers.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useNavigatorScale.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useResizablePane.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useSelectedFolderFileVersion.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useSwipeGesture.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useTagNavigation.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useUpdateNotice.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/hooks/useVaultProfileMenu.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/modals/InfoModal.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/modals/PropertyNodeSuggestModal.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/suggest/SearchDateInputSuggest.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/suggest/SearchTagInputSuggest.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/utils/androidFontScale.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/utils/paneLayout.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/utils/searchHighlight.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/utils/svgFilters.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/api/MenusAPI.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/api/MetadataAPI.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/api/NavigationAPI.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/api/NotebookNavigatorAPI.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/api/PublicApiDefinitionConsistency.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/api/SelectionAPI.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/components/calendarYearPanel.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/components/fileItem/useFileItemContentState.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/components/fileItem/useFileItemPills.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/context/CacheRebuildNoticeStorage.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/context/SelectionHistoryState.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/context/SelectionInitialState.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/context/StorageQueueFilters.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/contextMenu/NavigationMenuExtensionPlacement.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/filterSearchProperties.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/hooks/listPaneData/listItems.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/hooks/useLocalDayKey.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/hooks/useNavigationActions.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/hooks/useNavigationNoteCounts.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/hooks/useNavigationPaneTreeInteractions.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/hooks/useNavigationPaneTreeSections.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/modals/TagSuggestModal.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/propertyTreeBuilder.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/BaseContentProviderRace.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/BaseMetadataService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/CommandQueueService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/FeatureImageContentProvider.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/FileDeletionService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/FileMetadataService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/FileSystemService.deleteAttachments.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/FileThumbnailsForcedRegeneration.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/FolderMetadataService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/ImageDimensions.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/MarkdownPipelineClearContent.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/MarkdownPipelineCustomPropertyFrontmatter.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/MarkdownPipelineFeatureImageErrors.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/MarkdownPipelineTasks.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/MarkdownPipelineWordCount.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/NavigationSeparatorService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/OmnisearchService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/PluginPreferencesController.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/PluginSettingsController.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/PropertyMetadataService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/PropertyOperations.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/PropertyTreeService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/RecentStorageService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/ReleaseCheckService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/RetryLaterContentProviders.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/TagMetadataService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/TagOperations.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/TagTreeService.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/pdfPreflight.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/propertyOperations/PropertyFileMutations.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/tagOperations/TagFileMutations.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/tagOperations/TagWorkflows.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/services/thumbnailRuntimeUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/settings/deleteAttachmentsSetting.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/settings/momentFormats.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/settings/syncedSettingsPropertyMigration.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/settings/transfer.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/FeatureImageBlobCache.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/FeatureImageBlobStore.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/FeatureImageMoveInFlight.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/GetFilesNeedingContent.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/PreviewTextCache.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/PreviewTextMoveInFlight.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/fileData.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/fileOperationsLifecycle.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/recordFileChangesClobbering.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/storage/recordFileChangesRenameMerge.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/stubs/obsidian.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/styles/listPaneMeasurementsCssSync.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/autoRevealUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/calendarCustomNotePatterns.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/calendarNotesLocalePolicy.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/calendarUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/codeRangeUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/dateUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/emojiUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/fileFilters.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/fileFinder.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/fileIconUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/fileItemPillDecoration.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/fileNameUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/fileTypeUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/filterSearch.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/folderNoteName.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/iconizeFormat.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/indentGuides.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/listGrouping.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/listPaneMeasurements.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/metadataExtractor.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/navigationRainbow.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/noteCountFormatting.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/omnisearchHighlight.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/pathUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/previewTextUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/recordUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/shortcuts.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/sortUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/tagPrefixMatcher.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/tagTree.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/tagUtils.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/treeFlattener.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/uxIcons.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/vaultProfiles.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/tests/utils/workspaceActiveFileEvents.test.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' +error TS6059: File '/home/jacob/obsidian-NotEMD/ref/notebook-navigator/vitest.config.ts' is not under 'rootDir' '/home/jacob/obsidian-NotEMD/src'. 'rootDir' is expected to contain all source files. + The file is in the program because: + Matched by include pattern '**/*.ts' in '/home/jacob/obsidian-NotEMD/tsconfig.json' diff --git a/docs/superpowers/baselines/2026-04-09-language-support/environment-before.txt b/docs/superpowers/baselines/2026-04-09-language-support/environment-before.txt new file mode 100644 index 00000000..b4c5a307 --- /dev/null +++ b/docs/superpowers/baselines/2026-04-09-language-support/environment-before.txt @@ -0,0 +1,11 @@ +=== DATE === +2026-04-09T02:16:09-05:00 + +=== NODE/NPM === +v24.14.1 +11.11.0 + +=== OBSIDIAN CLI === +Ignored: Error: ENOENT: no such file or directory, open '/root/.config/obsidian/obsidian.json' +2026-04-09 07:16:10 Loaded main app package /opt/obsidian-desktop/1.12.7/resources/obsidian.asar + diff --git a/docs/superpowers/baselines/2026-04-09-language-support/targeted-tests-before.txt b/docs/superpowers/baselines/2026-04-09-language-support/targeted-tests-before.txt new file mode 100644 index 00000000..0dbfea4c --- /dev/null +++ b/docs/superpowers/baselines/2026-04-09-language-support/targeted-tests-before.txt @@ -0,0 +1,293 @@ + +> notemd@1.7.14 test +> jest --runInBand src/tests/workflowButtons.test.ts src/tests/sidebarDomButtonClicks.test.ts src/tests/llmUtilsProviderSupport.test.ts src/tests/providerDiagnostics.test.ts + +PASS src/tests/llmUtilsProviderSupport.test.ts + ● Console + + console.warn + OpenAI API Call: Attempt 1 failed: OpenAI API request failed: net::ERR_CONNECTION_CLOSED + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + OpenAI API Call: Attempt 1 failed: OpenAI API request failed: net::ERR_CONNECTION_CLOSED + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + OpenAI API Call: Attempt 2 failed: OpenAI API request failed: net::ERR_CONNECTION_CLOSED + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + Anthropic API Call: Attempt 1 failed: Anthropic API request failed: net::ERR_CONNECTION_CLOSED + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + Google API Call: Attempt 1 failed: Google API request failed: net::ERR_CONNECTION_CLOSED + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + Azure OpenAI API Call: Attempt 1 failed: Azure OpenAI API request failed: net::ERR_CONNECTION_CLOSED + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + Ollama API Call: Attempt 1 failed: Ollama API request failed: net::ERR_CONNECTION_CLOSED + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + OpenAI API Call: Attempt 1 failed: OpenAI API error: 400 - Bad request + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + OpenAI API Call: Attempt 1 failed: OpenAI API request failed: socket hang up + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.error + OpenAI API Call: All configured attempts failed. + + 2407 | } + 2408 | + > 2409 | console.error(`${provider.name} API Call: All configured attempts failed.`); + | ^ + 2410 | throw lastError || new Error(`${provider.name} API call failed after multiple retries.`); + 2411 | } + 2412 | + + at src/llmUtils.ts:2409:13 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + OpenAI API Call: Attempt 1 failed: OpenAI API request failed: The operation was aborted. + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.error + OpenAI API Call: All configured attempts failed. + + 2407 | } + 2408 | + > 2409 | console.error(`${provider.name} API Call: All configured attempts failed.`); + | ^ + 2410 | throw lastError || new Error(`${provider.name} API call failed after multiple retries.`); + 2411 | } + 2412 | + + at src/llmUtils.ts:2409:13 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + OpenAI API Call: Attempt 1 failed: OpenAI API request failed: socket hang up + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.error + OpenAI API Call: All configured attempts failed. + + 2407 | } + 2408 | + > 2409 | console.error(`${provider.name} API Call: All configured attempts failed.`); + | ^ + 2410 | throw lastError || new Error(`${provider.name} API call failed after multiple retries.`); + 2411 | } + 2412 | + + at src/llmUtils.ts:2409:13 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + Anthropic API Call: Attempt 1 failed: Anthropic API request failed: socket hang up + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.error + Anthropic API Call: All configured attempts failed. + + 2407 | } + 2408 | + > 2409 | console.error(`${provider.name} API Call: All configured attempts failed.`); + | ^ + 2410 | throw lastError || new Error(`${provider.name} API call failed after multiple retries.`); + 2411 | } + 2412 | + + at src/llmUtils.ts:2409:13 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.warn + Ollama API Call: Attempt 1 failed: Ollama API request failed: socket hang up + + 2349 | lastError = error instanceof Error ? error : new Error(errorMessage); // Store Error object if possible + 2350 | progressReporter.log(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + > 2351 | console.warn(`${provider.name} API Call: Attempt ${attempt} failed: ${errorMessage}`); + | ^ + 2352 | + 2353 | // Handle cancellation specifically + 2354 | if ((error instanceof Error && error.name === 'AbortError') || errorMessage.includes("cancelled by user")) { + + at src/llmUtils.ts:2351:21 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + + console.error + Ollama API Call: All configured attempts failed. + + 2407 | } + 2408 | + > 2409 | console.error(`${provider.name} API Call: All configured attempts failed.`); + | ^ + 2410 | throw lastError || new Error(`${provider.name} API call failed after multiple retries.`); + 2411 | } + 2412 | + + at src/llmUtils.ts:2409:13 + at Generator.throw () + at rejected (node_modules/tslib/tslib.js:116:69) + +PASS src/tests/sidebarDomButtonClicks.test.ts + ● Console + + console.log + Potential duplicates in Active.txt: [ 'duplicate' ] + + at NotemdSidebarView. (src/ui/NotemdSidebarView.ts:566:29) + +PASS src/tests/providerDiagnostics.test.ts +PASS src/tests/workflowButtons.test.ts + +Test Suites: 4 passed, 4 total +Tests: 80 passed, 80 total +Snapshots: 0 total +Time: 0.835 s +Ran all test suites matching /src\/tests\/workflowButtons.test.ts|src\/tests\/sidebarDomButtonClicks.test.ts|src\/tests\/llmUtilsProviderSupport.test.ts|src\/tests\/providerDiagnostics.test.ts/i. diff --git a/docs/superpowers/plans/2026-04-09-language-support-first-principles-multiphase.md b/docs/superpowers/plans/2026-04-09-language-support-first-principles-multiphase.md new file mode 100644 index 00000000..84d1feb7 --- /dev/null +++ b/docs/superpowers/plans/2026-04-09-language-support-first-principles-multiphase.md @@ -0,0 +1,359 @@ +# Notemd Language Support First-Principles Multiphase Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** 在不破坏现有功能鲁棒性的前提下,分阶段把 Notemd 从“任务输出语言配置”升级为“UI i18n + 统一语言策略 + 可回归验证”的完整语言支持体系。 + +**Architecture:** 采用“语言域建模 -> i18n 基础设施 -> UI 文案迁移 -> 任务语言策略收敛 -> 回归门禁”五层架构。UI Locale 与 Task Output Language 明确分离,所有任务语言决策统一收口到策略层,所有改动按阶段执行并强制执行前后同口径比对。 + +**Tech Stack:** TypeScript, Obsidian Plugin API, Jest, ESLint, npm scripts, Obsidian CLI (`obsidian`/`obsidian-cli`) + +--- + +## Phase Boundaries And Robustness Rule (Must Follow) + +- 每个阶段都必须执行:`修改前基线 -> 最小改动 -> 修改后回归 -> 基线对比 -> 提交`。 +- 每个阶段至少保留两份日志:`*-before.txt` 与 `*-after.txt`,放到 `docs/superpowers/baselines/-language-support/`。 +- 如果阶段回归失败,禁止进入下一阶段;先在当前阶段内修复并重新比对。 +- 对同一功能使用同一测试入口做前后对比,避免“换口径通过”。 + +--- + +### Task 0: Freeze Baseline Snapshot (Current Reality) + +**Files:** +- Create/Update: `docs/superpowers/baselines/2026-04-09-language-support/environment-before.txt` +- Create/Update: `docs/superpowers/baselines/2026-04-09-language-support/build-before.txt` +- Create/Update: `docs/superpowers/baselines/2026-04-09-language-support/targeted-tests-before.txt` + +- [ ] **Step 1: Capture environment baseline** +Run: +```bash +cd /home/jacob/obsidian-NotEMD +obsidian help +obsidian-cli help +node -v +npm -v +``` +Expected: 命令可执行(允许 Obsidian CLI 输出本地配置告警)。 + +- [ ] **Step 2: Capture build baseline** +Run: +```bash +cd /home/jacob/obsidian-NotEMD +npm run build +``` +Expected: 当前基线允许失败,但必须记录失败原因(当前已知:`ref/notebook-navigator` 被 `tsconfig` include 扫入导致 `TS6059`)。 + +- [ ] **Step 3: Capture targeted functional baseline** +Run: +```bash +cd /home/jacob/obsidian-NotEMD +npm test -- --runInBand src/tests/workflowButtons.test.ts src/tests/sidebarDomButtonClicks.test.ts src/tests/llmUtilsProviderSupport.test.ts src/tests/providerDiagnostics.test.ts +``` +Expected: PASS;作为语言支持改造期间的关键行为基线。 + +--- + +### Task 1: Introduce Language Domain Model (Single Source Of Truth) + +**Files:** +- Create: `src/i18n/languageContext.ts` +- Create: `src/i18n/taskLanguagePolicy.ts` +- Modify: `src/types.ts` +- Modify: `src/constants.ts` +- Test: `src/tests/languagePolicy.test.ts` + +- [ ] **Step 1: Write failing tests for policy rules** +覆盖:全局语言、按任务语言、禁用自动翻译、Translate 任务例外、Mermaid 特殊策略。 + +- [ ] **Step 2: Run tests to verify failure** +Run: +```bash +npm test -- --runInBand src/tests/languagePolicy.test.ts +``` +Expected: FAIL(策略层尚未实现)。 + +- [ ] **Step 3: Implement minimal policy layer** +实现统一入口:`resolveTaskLanguage(taskKey, settings)` 与 `resolveUiLocale(settings, obsidianLocale)`。 + +- [ ] **Step 4: Re-run tests** +Run: +```bash +npm test -- --runInBand src/tests/languagePolicy.test.ts +``` +Expected: PASS。 + +- [ ] **Step 5: Before/after comparison** +Run: +```bash +npm test -- --runInBand src/tests/languagePolicy.test.ts > docs/superpowers/baselines/2026-04-09-language-support/task1-after.txt 2>&1 +``` +Compare: +```bash +grep -E "PASS|FAIL" docs/superpowers/baselines/2026-04-09-language-support/task1-after.txt +``` + +--- + +### Task 2: Build UI i18n Infrastructure (Catalog + Fallback) + +**Files:** +- Create: `src/i18n/index.ts` +- Create: `src/i18n/locales/en.ts` +- Create: `src/i18n/locales/zh_cn.ts` +- Create: `src/i18n/locales/zh_tw.ts` +- Modify: `src/main.ts` +- Test: `src/tests/i18nFallback.test.ts` + +- [ ] **Step 1: Write failing tests for fallback chain** +覆盖:`zh-CN -> zh -> en`、缺失 key 回退、变量插值、缓存稳定性。 + +- [ ] **Step 2: Verify failure** +Run: +```bash +npm test -- --runInBand src/tests/i18nFallback.test.ts +``` +Expected: FAIL。 + +- [ ] **Step 3: Implement i18n core** +参考:`ref/notebook-navigator/src/i18n/index.ts` 的 `LANGUAGE_MAP + deep-merge fallback` 模式,但保持 Notemd 自身简洁边界。 + +- [ ] **Step 4: Re-run tests** +Run: +```bash +npm test -- --runInBand src/tests/i18nFallback.test.ts +``` +Expected: PASS。 + +- [ ] **Step 5: Compare with pre-change baseline** +保存并对比本任务前后日志,确认 i18n 引入没有影响既有 provider/mermaid/workflow 测试。 + +--- + +### Task 3: Migrate Settings UI Strings To i18n (High Impact Surface) + +**Files:** +- Modify: `src/ui/NotemdSettingTab.ts` +- Modify: `src/i18n/locales/en.ts` +- Modify: `src/i18n/locales/zh_cn.ts` +- Test: `src/tests/providerDiagnostics.test.ts` +- Test: `src/tests/sidebarDomButtonClicks.test.ts` + +- [ ] **Step 1: Capture before snapshot (settings-related tests)** +Run: +```bash +npm test -- --runInBand src/tests/providerDiagnostics.test.ts src/tests/sidebarDomButtonClicks.test.ts > docs/superpowers/baselines/2026-04-09-language-support/task3-before.txt 2>&1 +``` + +- [ ] **Step 2: Replace hardcoded UI labels with `strings` access** +范围:Language settings、Developer diagnostics、Workflow builder、Provider config notices。 + +- [ ] **Step 3: Run same tests after change** +Run: +```bash +npm test -- --runInBand src/tests/providerDiagnostics.test.ts src/tests/sidebarDomButtonClicks.test.ts > docs/superpowers/baselines/2026-04-09-language-support/task3-after.txt 2>&1 +``` +Expected: PASS。 + +- [ ] **Step 4: Diff compare** +Run: +```bash +diff -u docs/superpowers/baselines/2026-04-09-language-support/task3-before.txt docs/superpowers/baselines/2026-04-09-language-support/task3-after.txt | sed -n '1,200p' +``` +Expected: 只接受文案相关差异,不接受行为失败差异。 + +--- + +### Task 4: Migrate Sidebar And Notice Strings (Runtime UX Surface) + +**Files:** +- Modify: `src/ui/NotemdSidebarView.ts` +- Modify: `src/ui/ErrorModal.ts` +- Modify: `src/main.ts` +- Modify: `src/i18n/locales/en.ts` +- Modify: `src/i18n/locales/zh_cn.ts` +- Test: `src/tests/sidebarDomButtonClicks.test.ts` +- Test: `src/tests/sidebarButtonTriggerChains.test.ts` + +- [ ] **Step 1: Record runtime UI baseline tests** +Run: +```bash +npm test -- --runInBand src/tests/sidebarDomButtonClicks.test.ts src/tests/sidebarButtonTriggerChains.test.ts > docs/superpowers/baselines/2026-04-09-language-support/task4-before.txt 2>&1 +``` + +- [ ] **Step 2: Migrate runtime-facing strings** +包括:hero 标题、按钮文本、取消提示、log 操作提示、错误模态按钮文案。 + +- [ ] **Step 3: Re-run same tests** +Run: +```bash +npm test -- --runInBand src/tests/sidebarDomButtonClicks.test.ts src/tests/sidebarButtonTriggerChains.test.ts > docs/superpowers/baselines/2026-04-09-language-support/task4-after.txt 2>&1 +``` +Expected: PASS。 + +- [ ] **Step 4: Compare and gate** +只要出现 FAIL 或 open-handle 恶化,必须回滚到本阶段内修复。 + +--- + +### Task 5: Unify Task Language Decision In Prompt And Processing Paths + +**Files:** +- Modify: `src/promptUtils.ts` +- Modify: `src/fileUtils.ts` +- Modify: `src/searchUtils.ts` +- Modify: `src/main.ts` +- Modify: `src/i18n/taskLanguagePolicy.ts` +- Test: `src/tests/languagePolicy.test.ts` +- Test: `src/tests/processFile.test.ts` +- Test: `src/tests/workflowButtons.test.ts` + +- [ ] **Step 1: Capture before behavior tests** +Run: +```bash +npm test -- --runInBand src/tests/languagePolicy.test.ts src/tests/processFile.test.ts src/tests/workflowButtons.test.ts > docs/superpowers/baselines/2026-04-09-language-support/task5-before.txt 2>&1 +``` + +- [ ] **Step 2: Remove scattered language decisions** +将 `fileUtils/searchUtils/promptUtils` 内分散逻辑收敛到 `taskLanguagePolicy`。 + +- [ ] **Step 3: Add explicit assertions for previously implicit behavior** +确保 `disableAutoTranslation`、task-specific language、translate task 例外逻辑可测。 + +- [ ] **Step 4: Run same test set after change** +Run: +```bash +npm test -- --runInBand src/tests/languagePolicy.test.ts src/tests/processFile.test.ts src/tests/workflowButtons.test.ts > docs/superpowers/baselines/2026-04-09-language-support/task5-after.txt 2>&1 +``` +Expected: PASS。 + +- [ ] **Step 5: Compare before/after** +仅允许预期日志文本差异;禁止功能路径变化导致断言减少。 + +--- + +### Task 6: Add Locale Formatting And RTL Safety + +**Files:** +- Modify: `styles.css` +- Create: `src/i18n/localeFormat.ts` +- Modify: `src/ui/NotemdSidebarView.ts` +- Test: `src/tests/sidebarDomButtonClicks.test.ts` + +- [ ] **Step 1: Add RTL and text-direction safe rules** +引入最小必要规则,避免破坏现有 panel 布局。 + +- [ ] **Step 2: Add formatting helper tests** +新增日期/时间格式 fallback 基础测试。 + +- [ ] **Step 3: Validate sidebar layout tests** +Run: +```bash +npm test -- --runInBand src/tests/sidebarDomButtonClicks.test.ts +``` +Expected: PASS(尤其是 docked footer / log 区域可见性相关断言)。 + +--- + +### Task 7: Build Regression Harness For Before/After Comparisons + +**Files:** +- Create: `scripts/regression/language-support-baseline.sh` +- Create: `scripts/regression/language-support-compare.sh` +- Modify: `package.json` +- Create: `docs/superpowers/baselines/README.md` +- Test: `src/tests/llmUtilsProviderSupport.test.ts` + +- [ ] **Step 1: Script baseline capture command** +把关键命令统一封装,确保团队可重复执行。 + +- [ ] **Step 2: Script compare gate** +自动检查 PASS/FAIL 统计和关键错误关键字(`TS6059`, `ERR_CONNECTION_CLOSED`, `socket hang up` 仅允许在 mock 日志中出现)。 + +- [ ] **Step 3: Verify scripts locally** +Run: +```bash +npm run test -- --runInBand src/tests/llmUtilsProviderSupport.test.ts +bash scripts/regression/language-support-baseline.sh +bash scripts/regression/language-support-compare.sh +``` +Expected: compare script 返回 0 才允许继续。 + +--- + +### Task 8: Documentation And Release Process Sync + +**Files:** +- Modify: `README.md` +- Modify: `README_zh.md` +- Modify: `docs/superpowers/plans/2026-04-09-language-support-first-principles-multiphase.md` + +- [ ] **Step 1: Document language support architecture** +包含 UI Locale vs Task Output Language 的定义与使用方式。 + +- [ ] **Step 2: Document regression workflow** +明确每个阶段必须保存 before/after logs。 + +- [ ] **Step 3: Release note requirement sync** +确保发布说明继续保持中英双语独立段落要求。 + +--- + +### Task 9: Final Verification Gate (No Halfway Delivery) + +**Files:** +- Verify: modified files in `src/`, `styles.css`, `README.md`, `README_zh.md`, `scripts/regression/`, `docs/superpowers/` + +- [ ] **Step 1: Restore build sanity for cloned `ref/` directory** +若保留 `ref/notebook-navigator` 在仓库中,需在 `tsconfig.json` 排除 `ref/**`,确保构建不受参考仓库影响。 + +- [ ] **Step 2: Run build** +Run: +```bash +npm run build +``` +Expected: PASS。 + +- [ ] **Step 3: Run targeted regression matrix** +Run: +```bash +npm test -- --runInBand src/tests/workflowButtons.test.ts src/tests/sidebarDomButtonClicks.test.ts src/tests/llmUtilsProviderSupport.test.ts src/tests/providerDiagnostics.test.ts src/tests/languagePolicy.test.ts src/tests/i18nFallback.test.ts +``` +Expected: PASS。 + +- [ ] **Step 4: Run full tests** +Run: +```bash +npm test -- --runInBand +``` +Expected: PASS(若存在已知 open-handle warning,需记录并确保未恶化)。 + +- [ ] **Step 5: Obsidian CLI sanity check** +Run: +```bash +obsidian help +obsidian-cli help +``` +Expected: 命令可执行。 + +- [ ] **Step 6: Diff quality check** +Run: +```bash +git diff --check +``` +Expected: PASS。 + +- [ ] **Step 7: Commit by phase** +每个阶段独立提交,禁止跨阶段混杂提交。 + +- [ ] **Step 8: Release handoff** +版本发布前必须附带:测试摘要、before/after 对比结论、风险余项。 + +--- + +## Execution Notes For Engineers + +- 参考实现:`/home/jacob/obsidian-NotEMD/ref/notebook-navigator/src/i18n/index.ts`。 +- 但 Notemd 不做全量照抄;只迁移“可维护的最小核心”(map + fallback + centralized strings + tests)。 +- 每个阶段都要先跑“阶段前”测试并保存日志,任何“先改再补日志”的流程视为不合规。