20 KiB
20 KiB
Mobile Progress
Last updated: 2026-05-04
This file is the resumable working log for Tolaria mobile. The strategy and roadmap live in MOBILE_STRATEGY.md; this file records the current execution state.
Current State
- Branch:
codex/mobile - Active phase: Phase 2 - Mobile Shell
- Active slice: Seed app-local mobile demo vault
- Push policy: commit locally; do not push unless explicitly requested
- Validation target: iPad/iOS simulator first
Completed
- Created high-fidelity iPhone mobile mockups in
design/mobile-mockups/. - Documented the production mobile strategy in
docs/MOBILE_STRATEGY.md. - Installed and authenticated Codacy MCP for this Codex environment.
- Confirmed Codacy MCP can access
refactoringhq/tolaria. - Recorded GitHub OAuth App as the first mobile GitHub auth path.
- Created ADR-0109 for Expo React Native production mobile.
- Superseded ADR-0005, the earlier Tauri iOS prototype ADR.
- Created
@tolaria/markdownas the first shared workspace package. - Moved
compactMarkdownintopackages/markdownand kept the existing desktop import path as a compatibility export. - Added package-local Vitest and TypeScript scripts for the shared Markdown package.
- Added
scripts/run-tests.mjssopnpm testruns desktop and shared-package tests, while targeted test arguments remain targeted. - Updated the pre-commit branch guard to allow local commits on
codex/mobilefor this isolated mobile worktree. - Split
src/utils/wikilinks.tsinto shared@tolaria/markdownmodules for frontmatter, wikilink block transforms, outgoing links, backlink context, snippets, and word counts. - Moved note-title derivation helpers into
@tolaria/markdown, leaving the existing desktop import path as a compatibility export. - Added
apps/mobileas an Expo React Native workspace package. - Added root mobile scripts:
mobile:start,mobile:ios,mobile:test, andmobile:typecheck. - Configured Expo for a universal light-mode app with a development bundle identifier (
com.tolaria.mobile.dev) and iPad support enabled. - Added the first iPad-first/phone-ready shell using fixture notes, shared Markdown title/snippet helpers, Phosphor React Native icons, and responsive panels for sidebar, note list, editor, and properties.
- Split mobile styles into small panel-specific StyleSheet modules so new mobile code starts at CodeScene
10.0. - Pinned Expo runtime dependencies to the versions expected by Expo 55 after the initial generated versions failed iOS bundle export (
react-native@0.83.6,react@19.2.0, matching safe-area/svg versions). - Extracted compact phone navigation into a pure tested state machine so future swipe gestures can dispatch explicit events instead of mutating panels ad hoc.
- Extracted mobile note projection into a pure module that turns raw vault-like note records into the list/editor shape used by the mobile shell.
- Added a minimal mobile vault repository contract plus fixture implementation so app-local vault storage and git sync can plug in behind
listNotes/readNotelater. - Updated
scripts/run-tests.mjsso fullpnpm testruns desktop, mobile, and shared package tests, while targetedapps/mobile/...andpackages/markdown/...paths route to the correct workspace Vitest config. - Updated
.husky/pre-committo usepnpm test -- --silentso local commits include the new mobile test suite. - Added
react-native-gesture-handlerat Expo's SDK-compatible version. - Wrapped the mobile root in
GestureHandlerRootView. - Added a tested compact gesture mapper and
SwipeSurfacewrapper so phone panels can transition through swipe gestures while keeping panel behavior in the reducer. - Re-tested the iPad simulator path; the app now launches in Expo Go on
iPad Pro 13-inch (M4). - Added a pure mobile Git remote parser that codifies the auth choice: GitHub remotes use the GitHub OAuth App path, arbitrary Git remotes use the SSH-key path.
- Added a pure mobile vault configuration model that keeps vault storage app-local, distinguishes local-only vs remote-backed sync, and derives the required Git auth path from the parsed remote.
- Extracted the mobile editor surface behind
MobileEditorAdapterwith a tested document projection so TenTap can replace the placeholder surface without changing shell navigation. - Installed TenTap and Expo-compatible
react-native-webview, then wired TenTap intoMobileEditorAdapterwith tested HTML generation from the mobile editor document projection. - Created ADR-0110 for the TenTap mobile editor spike and its acceptance gates.
- Added a TenTap draft callback boundary that captures editor HTML but explicitly marks it non-persistable until Markdown serialization exists, preventing HTML from becoming canonical vault content by accident.
- Added the first supported TenTap HTML-to-Markdown serializer for H1, paragraph, and unordered-list output; unsupported HTML remains blocked from persistence.
- Added a mobile vault storage driver contract plus memory implementation, and connected the mobile vault repository to app-local markdown files behind that storage interface.
- Added Expo FileSystem as the first app-local mobile vault storage implementation behind the storage driver contract.
- Created ADR-0111 to record the mobile filesystem dependency and app-local vault storage path.
- Added a mobile vault seeding boundary that writes starter Markdown files only when the app-local vault is empty.
- Wired the mobile shell to load its starter notes through the native Expo FileSystem storage driver and stored repository path, with fixture notes retained as the fallback while storage initializes.
Next Action
Continue Phase 2 with the next mobile shell slice:
- Dismiss or suppress Expo Go's first-run tools modal during simulator QA so screenshots capture the app without the overlay.
- Expand the serializer for additional TenTap output needed by real notes: links, emphasis, code, headings, ordered lists, and task lists.
- Expand the serializer for additional TenTap output needed by real notes: links, emphasis, code, headings, ordered lists, and task lists.
Verification Log
tool_searchexposed Codacy MCP tools after Codex restart.codacy_get_repository_with_analysissucceeded forrefactoringhq/tolaria.- Current branch verified as
codex/mobile. - CodeScene before extraction:
src/utils/compact-markdown.tsscored10. - CodeScene after extraction:
packages/markdown/src/compactMarkdown.tsscored10;packages/markdown/src/compactMarkdown.test.tsscored10; tiny export/config files returned no scorable code and no findings. pnpm --filter @tolaria/markdown testpassed: 29 tests.pnpm --filter @tolaria/markdown typecheckpassed.pnpm test -- src/utils/compact-markdown.test.tspassed and ran only that desktop test file: 29 tests.pnpm testpassed and ran the full desktop suite plus package tests: 309 desktop test files / 3639 desktop tests, then 29 package tests.pnpm lintpassed with one pre-existing warning insrc/components/tolariaBlockNoteSideMenu.tsx.npx tsc --noEmitpassed.pnpm buildpassed.- CodeScene before wikilink extraction:
src/utils/wikilinks.tsscored9.09. - CodeScene after wikilink extraction: new shared wikilink/frontmatter/content files scored
10; small export surfaces returned no scorable code and no findings. pnpm --filter @tolaria/markdown testpassed after wikilink extraction: 40 tests.pnpm test -- src/utils/wikilinks.test.ts src/utils/noteTitle.test.tspassed: 91 desktop tests.pnpm --filter @tolaria/markdown typecheckpassed after wikilink extraction.pnpm lint,npx tsc --noEmit, andpnpm buildpassed after wikilink extraction.- CodeScene before note-title extraction:
src/utils/noteTitle.tsscored9.68. - CodeScene after note-title extraction:
packages/markdown/src/noteTitle.tsandpackages/markdown/src/noteTitle.test.tsscored10; the desktop compatibility export returned no scorable code and no findings. pnpm --filter @tolaria/markdown testpassed after note-title extraction: 56 tests.pnpm test -- src/utils/noteTitle.test.tspassed: 14 desktop tests.pnpm --filter @tolaria/markdown typecheckpassed after note-title extraction.pnpm --filter @tolaria/mobile typecheckpassed.pnpm --filter @tolaria/mobile testpassed: 1 file / 2 tests.pnpm --filter @tolaria/mobile exec expo install --checkpassed after pinning Expo-compatible dependency versions.pnpm --filter @tolaria/mobile exec expo config --type publicpassed and shows iOS bundle identifiercom.tolaria.mobile.dev, Android packagecom.tolaria.mobile.dev, andsupportsTablet: true.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed and produced the iOS bundle.pnpm lintpassed with one pre-existing warning insrc/components/tolariaBlockNoteSideMenu.tsx.npx tsc --noEmitpassed.pnpm testpassed after the mobile scaffold: 309 desktop test files / 3639 desktop tests plus 56 shared package tests.- CodeScene mobile shell scores:
apps/mobile/App.tsx,apps/mobile/src/MobileApp.tsx,apps/mobile/src/NamedIcon.tsx,apps/mobile/src/demoData.ts,apps/mobile/src/demoData.test.ts, and all scorable style modules scored10; tiny config/export/theme files returned no scorable code. - CodeScene pre-commit safeguard passed for the current change set.
- Codacy MCP can read repository analysis and security items for
refactoringhq/tolaria; local Codacy CLI analysis is currently blocked because the Codacy CLI binary is not installed in this environment. - iOS simulator validation was initially blocked locally: Xcode is installed (
Xcode 26.3), butxcrun simctl list ...hung indefinitely even after opening/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app. pnpm --filter @tolaria/mobile testpassed after compact navigation extraction: 2 files / 6 tests.pnpm --filter @tolaria/mobile typecheckpassed after compact navigation extraction.- CodeScene after compact navigation extraction:
apps/mobile/src/compactNavigation.ts,apps/mobile/src/compactNavigation.test.ts, and the touchedapps/mobile/src/MobileApp.tsxscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after compact navigation extraction.pnpm --filter @tolaria/mobile testpassed after note projection extraction: 3 files / 8 tests.pnpm --filter @tolaria/mobile typecheckpassed after note projection extraction.- CodeScene after note projection extraction:
apps/mobile/src/mobileNoteProjection.tsandapps/mobile/src/mobileNoteProjection.test.tsscored10;apps/mobile/src/demoData.tsreturned no scorable code and no findings. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after note projection extraction.pnpm --filter @tolaria/mobile testpassed after mobile vault repository extraction: 4 files / 11 tests.pnpm --filter @tolaria/mobile typecheckpassed after mobile vault repository extraction.- CodeScene after mobile vault repository extraction:
apps/mobile/src/mobileVaultRepository.tsandapps/mobile/src/mobileVaultRepository.test.tsscored10;apps/mobile/src/demoData.tsstill returned no scorable code and no findings. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after mobile vault repository extraction.pnpm test -- apps/mobile/src/mobileVaultRepository.test.tspassed and ran only the mobile repository test file.pnpm test -- packages/markdown/src/noteTitle.test.tspassed and ran only the shared Markdown note-title test file.pnpm test -- --silentpassed after runner/hook updates: 309 desktop files / 3639 desktop tests, 4 mobile files / 11 mobile tests, 3 shared Markdown files / 56 shared tests.- CodeScene after test-runner update:
scripts/run-tests.mjsscored10;.husky/pre-commitis unsupported by CodeScene file analysis because it has no supported extension. xcrun simctl list devices availablenow responds with available iPhone/iPad devices.xcrun simctl boot 40724AA3-A793-41D8-9C66-79745DA28DE4bootediPad Pro 13-inch (M4).pnpm --filter @tolaria/mobile exec expo start --iosinstalled/opened Expo Go and launched Tolaria on the booted iPad simulator.- Simulator screenshot captured at
/tmp/tolaria-mobile-ipad.png; the Tolaria shell renders behind Expo Go's first-run tools modal. pnpm --filter @tolaria/mobile testpassed after adding gesture support: 5 files / 15 tests.pnpm --filter @tolaria/mobile typecheckpassed after adding gesture support.- CodeScene after gesture support:
apps/mobile/src/compactGestures.ts,apps/mobile/src/compactGestures.test.ts,apps/mobile/src/SwipeSurface.tsx, touched app/root files, and touched style module scored10;apps/mobile/index.tsreturned no scorable code. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after adding gesture support.- Simulator screenshot after gesture support captured at
/tmp/tolaria-mobile-gestures-ipad.png; no red runtime error overlay appeared. pnpm --filter @tolaria/mobile testpassed after Git remote auth parsing: 6 files / 20 tests.pnpm --filter @tolaria/mobile typecheckpassed after Git remote auth parsing.- CodeScene after Git remote auth parsing:
apps/mobile/src/mobileGitRemote.tsandapps/mobile/src/mobileGitRemote.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after Git remote auth parsing.pnpm --filter @tolaria/mobile test -- src/mobileVaultConfig.test.tspassed after vault config extraction: 7 files / 24 tests.pnpm --filter @tolaria/mobile typecheckpassed after vault config extraction.- CodeScene after vault config extraction:
apps/mobile/src/mobileVaultConfig.tsandapps/mobile/src/mobileVaultConfig.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after vault config extraction.pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.tspassed after editor adapter extraction: 8 files / 27 tests.pnpm --filter @tolaria/mobile typecheckpassed after editor adapter extraction.- CodeScene after editor adapter extraction:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/MobileEditorAdapter.tsx,apps/mobile/src/mobileEditorDocument.ts, andapps/mobile/src/mobileEditorDocument.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after editor adapter extraction.- TenTap package check:
@10play/tentap-editor@1.0.1requiresreact,react-native, andreact-native-webview; Expo installedreact-native-webview@13.16.0. pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.tspassed after TenTap wiring: 8 files / 28 tests.pnpm --filter @tolaria/mobile typecheckpassed after TenTap wiring.- CodeScene after TenTap wiring:
apps/mobile/src/MobileEditorAdapter.tsx,apps/mobile/src/mobileEditorDocument.ts,apps/mobile/src/mobileEditorDocument.test.ts, andapps/mobile/src/styles/editorStyles.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after TenTap wiring; iOS bundle size is now about 11 MB and includes TenTap toolbar assets.pnpm --filter @tolaria/mobile exec expo start --ios --clearlaunched oniPad Pro 13-inch (M4); screenshot captured at/tmp/tolaria-mobile-tentap-ipad.png. The app rendered with the TenTap-backed editor behind Expo Go's first-run Tools modal and no red runtime error overlay appeared.pnpm test -- src/components/SearchPanel.test.tsxpassed after a transient full-hook failure in the unrelated desktop SearchPanel arrow-key test.pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.tspassed after the TenTap draft boundary: 8 files / 29 tests.pnpm --filter @tolaria/mobile typecheckpassed after the TenTap draft boundary.- CodeScene after the TenTap draft boundary:
apps/mobile/src/MobileEditorAdapter.tsx,apps/mobile/src/mobileEditorDocument.ts, andapps/mobile/src/mobileEditorDocument.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after the TenTap draft boundary.pnpm --filter @tolaria/mobile test -- src/mobileEditorDraft.test.ts src/mobileEditorDocument.test.tspassed after supported Markdown serialization: 9 files / 32 tests.pnpm --filter @tolaria/mobile typecheckpassed after supported Markdown serialization.- CodeScene after supported Markdown serialization:
apps/mobile/src/mobileEditorDraft.ts,apps/mobile/src/mobileEditorDraft.test.ts,apps/mobile/src/mobileEditorDocument.ts, andapps/mobile/src/MobileEditorAdapter.tsxscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after supported Markdown serialization.pnpm --filter @tolaria/mobile test -- src/mobileVaultStorage.test.ts src/mobileVaultRepository.test.tspassed after storage boundary extraction: 10 files / 35 tests.pnpm --filter @tolaria/mobile typecheckpassed after storage boundary extraction.- CodeScene after storage boundary extraction:
apps/mobile/src/mobileVaultStorage.ts,apps/mobile/src/mobileVaultStorage.test.ts,apps/mobile/src/mobileVaultRepository.ts, andapps/mobile/src/mobileVaultRepository.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after storage boundary extraction.expo-file-system@55.0.17is now an explicit@tolaria/mobiledependency.pnpm --filter @tolaria/mobile test -- src/mobileExpoVaultStorage.test.tspassed after Expo storage adapter extraction: 11 files / 38 tests.pnpm --filter @tolaria/mobile testpassed after Expo storage adapter extraction: 11 files / 38 tests.pnpm --filter @tolaria/mobile typecheckpassed after Expo storage adapter extraction.- CodeScene after Expo storage adapter extraction:
apps/mobile/src/mobileExpoVaultStorage.ts,apps/mobile/src/mobileExpoVaultStorage.test.ts, andapps/mobile/src/mobileNativeVaultStorage.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after Expo storage adapter extraction.pnpm --filter @tolaria/mobile test -- src/mobileVaultSeed.test.tspassed after app-local demo vault seeding: 12 files / 40 tests.pnpm --filter @tolaria/mobile testpassed after app-local demo vault seeding: 12 files / 40 tests.pnpm --filter @tolaria/mobile typecheckpassed after app-local demo vault seeding.- CodeScene after app-local demo vault seeding:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/mobileDemoVault.ts,apps/mobile/src/mobileExpoVaultStorage.ts,apps/mobile/src/mobileVaultSeed.ts, andapps/mobile/src/mobileVaultSeed.test.tsscored10;apps/mobile/src/demoData.tsreturned no scorable code and no findings. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after app-local demo vault seeding.pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8087launched oniPad Pro 13-inch (M4)after app-local demo vault seeding; screenshot captured at/tmp/tolaria-mobile-seeded-ipad.png. The app rendered via the stored repository path behind Expo Go's first-run Tools modal with no red runtime error overlay.
Risks / Watch Items
- Editor quality remains the largest mobile risk; TenTap must pass the quality gates before becoming accepted.
- Shared package extraction must not destabilize active desktop work.
- Desktop alpha release currently triggers on every push to
main; this branch is safe, but release path filters should be added before mobile work merges tomain. - Codacy analyzes committed/pushed repository state; local edits still need local lint/test/CodeScene discipline before remote checks exist.
- TenTap's package graph currently reports a
react-dompeer warning because its bundled web editor path depends on React DOM 18 while the native app uses React 19; simulator launch and iOS export pass, but this should be tracked during the editor spike.