# Mobile Progress Last updated: 2026-05-03 This file is the resumable working log for Tolaria mobile. The strategy and roadmap live in [MOBILE_STRATEGY.md](./MOBILE_STRATEGY.md); this file records the current execution state. ## Current State - Branch: `codex/mobile` - Active phase: Phase 2 - Mobile Shell - Active slice: Include mobile tests in root test runner and commit gate - 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](./adr/0109-universal-mobile-app-with-expo-react-native.md) for Expo React Native production mobile. - Superseded [ADR-0005](./adr/0005-tauri-ios-for-ipad.md), the earlier Tauri iOS prototype ADR. - Created `@tolaria/markdown` as the first shared workspace package. - Moved `compactMarkdown` into `packages/markdown` and 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.mjs` so `pnpm test` runs desktop and shared-package tests, while targeted test arguments remain targeted. - Updated the pre-commit branch guard to allow local commits on `codex/mobile` for this isolated mobile worktree. - Split `src/utils/wikilinks.ts` into shared `@tolaria/markdown` modules 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/mobile` as an Expo React Native workspace package. - Added root mobile scripts: `mobile:start`, `mobile:ios`, `mobile:test`, and `mobile: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` / `readNote` later. - Updated `scripts/run-tests.mjs` so full `pnpm test` runs desktop, mobile, and shared package tests, while targeted `apps/mobile/...` and `packages/markdown/...` paths route to the correct workspace Vitest config. - Updated `.husky/pre-commit` to use `pnpm test -- --silent` so local commits include the new mobile test suite. ## Next Action Continue Phase 2 with the next mobile shell slice: 1. Resolve the local CoreSimulator hang so `pnpm mobile:ios` can launch the app in an iPad simulator. 2. Add native gesture support for phone/tablet panel transitions once the simulator path is usable. 3. Start the storage/auth abstraction skeleton after the shell has a reliable simulator loop. ## Verification Log - `tool_search` exposed Codacy MCP tools after Codex restart. - `codacy_get_repository_with_analysis` succeeded for `refactoringhq/tolaria`. - Current branch verified as `codex/mobile`. - CodeScene before extraction: `src/utils/compact-markdown.ts` scored `10`. - CodeScene after extraction: `packages/markdown/src/compactMarkdown.ts` scored `10`; `packages/markdown/src/compactMarkdown.test.ts` scored `10`; tiny export/config files returned no scorable code and no findings. - `pnpm --filter @tolaria/markdown test` passed: 29 tests. - `pnpm --filter @tolaria/markdown typecheck` passed. - `pnpm test -- src/utils/compact-markdown.test.ts` passed and ran only that desktop test file: 29 tests. - `pnpm test` passed and ran the full desktop suite plus package tests: 309 desktop test files / 3639 desktop tests, then 29 package tests. - `pnpm lint` passed with one pre-existing warning in `src/components/tolariaBlockNoteSideMenu.tsx`. - `npx tsc --noEmit` passed. - `pnpm build` passed. - CodeScene before wikilink extraction: `src/utils/wikilinks.ts` scored `9.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 test` passed after wikilink extraction: 40 tests. - `pnpm test -- src/utils/wikilinks.test.ts src/utils/noteTitle.test.ts` passed: 91 desktop tests. - `pnpm --filter @tolaria/markdown typecheck` passed after wikilink extraction. - `pnpm lint`, `npx tsc --noEmit`, and `pnpm build` passed after wikilink extraction. - CodeScene before note-title extraction: `src/utils/noteTitle.ts` scored `9.68`. - CodeScene after note-title extraction: `packages/markdown/src/noteTitle.ts` and `packages/markdown/src/noteTitle.test.ts` scored `10`; the desktop compatibility export returned no scorable code and no findings. - `pnpm --filter @tolaria/markdown test` passed after note-title extraction: 56 tests. - `pnpm test -- src/utils/noteTitle.test.ts` passed: 14 desktop tests. - `pnpm --filter @tolaria/markdown typecheck` passed after note-title extraction. - `pnpm --filter @tolaria/mobile typecheck` passed. - `pnpm --filter @tolaria/mobile test` passed: 1 file / 2 tests. - `pnpm --filter @tolaria/mobile exec expo install --check` passed after pinning Expo-compatible dependency versions. - `pnpm --filter @tolaria/mobile exec expo config --type public` passed and shows iOS bundle identifier `com.tolaria.mobile.dev`, Android package `com.tolaria.mobile.dev`, and `supportsTablet: true`. - `pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed and produced the iOS bundle. - `pnpm lint` passed with one pre-existing warning in `src/components/tolariaBlockNoteSideMenu.tsx`. - `npx tsc --noEmit` passed. - `pnpm test` passed 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 scored `10`; 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 is blocked locally: Xcode is installed (`Xcode 26.3`), but `xcrun simctl list ...` hangs indefinitely even after opening `/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app`. - `pnpm --filter @tolaria/mobile test` passed after compact navigation extraction: 2 files / 6 tests. - `pnpm --filter @tolaria/mobile typecheck` passed after compact navigation extraction. - CodeScene after compact navigation extraction: `apps/mobile/src/compactNavigation.ts`, `apps/mobile/src/compactNavigation.test.ts`, and the touched `apps/mobile/src/MobileApp.tsx` scored `10`. - `pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after compact navigation extraction. - `pnpm --filter @tolaria/mobile test` passed after note projection extraction: 3 files / 8 tests. - `pnpm --filter @tolaria/mobile typecheck` passed after note projection extraction. - CodeScene after note projection extraction: `apps/mobile/src/mobileNoteProjection.ts` and `apps/mobile/src/mobileNoteProjection.test.ts` scored `10`; `apps/mobile/src/demoData.ts` returned no scorable code and no findings. - `pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after note projection extraction. - `pnpm --filter @tolaria/mobile test` passed after mobile vault repository extraction: 4 files / 11 tests. - `pnpm --filter @tolaria/mobile typecheck` passed after mobile vault repository extraction. - CodeScene after mobile vault repository extraction: `apps/mobile/src/mobileVaultRepository.ts` and `apps/mobile/src/mobileVaultRepository.test.ts` scored `10`; `apps/mobile/src/demoData.ts` still returned no scorable code and no findings. - `pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile vault repository extraction. - `pnpm test -- apps/mobile/src/mobileVaultRepository.test.ts` passed and ran only the mobile repository test file. - `pnpm test -- packages/markdown/src/noteTitle.test.ts` passed and ran only the shared Markdown note-title test file. - `pnpm test -- --silent` passed 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.mjs` scored `10`; `.husky/pre-commit` is unsupported by CodeScene file analysis because it has no supported extension. ## 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 to `main`. - Codacy analyzes committed/pushed repository state; local edits still need local lint/test/CodeScene discipline before remote checks exist.