Skip to content

Monorepo: move the mobile app in, adopt npm workspaces, add packages/core - #108

Draft
JoePittsy wants to merge 31 commits into
developfrom
chore/monorepo
Draft

JoePittsy wants to merge 31 commits into
developfrom
chore/monorepo

Conversation

@JoePittsy

Copy link
Copy Markdown
Member

Moves the Android/iOS app (TrueNorthIT/TrueTunes-Android, with its history) into this repo and turns it into an npm-workspaces monorepo. Phases 1–3 of the plan; sharing the React hooks (phase 4) is deferred.

Base: branched from main (b3230f9), because develop is 3 commits behind main. Those 3 commits (the v1.0.46/1.0.47 bumps and the SMTC packaging merge) show up in this PR's diff too.

Layout

Path What
apps/desktop The Electron app (moved with git mv)
apps/mobile The Expo SDK 57 app, history kept (git log -- apps/mobile/src/...; tag v1.0.0 became android-v1.0.0, not pushed)
packages/core @truetunes/core: the platform-neutral sonos/office/core modules from mobile, TypeScript source, subpath exports. Desktop does not use it yet
server/ Unchanged and not a workspace (its deploy uploads server/node_modules)
  • One root package-lock.json. overrides pin react/react-dom 19.2.3 (SDK 57), @tanstack/react-query 5.104.0 and @types/react 19.2.18; npm ls shows one copy each. Desktop goes from React 19.2.5 to 19.2.3.
  • The new lock was seeded with every direct dependency at the version the old per-app locks resolved, so nothing else was quietly upgraded (transitive dependencies were re-resolved within their ranges).
  • Desktop moves to the mobile tooling (Vitest 5, ESLint 10, jsdom 30, jest-dom 7), in its own commit; ESLint 10's no-useless-assignment removed three dead initial values in main.ts. Prettier ran over the desktop sources in a separate, formatting-only commit.
  • electron is pinned to 41.2.1 exactly: electron-builder can't see the hoisted package from apps/desktop and falls back to the declared version.
  • .env stays at the root (the server deploy reads it); desktop build:main reads it from there.

Workflows

  • desktop.yml (was publish.yml): only runs for apps/desktop/**, packages/**, the root package files and itself (PRs also for server/**, which it lints). A mobile-only commit to main no longer publishes a desktop release. The version bump is npm version patch -w apps/desktop --package-lock-only.
  • mobile-ci.yml / mobile-release.yml: run from apps/mobile and install from the root lock with ELECTRON_SKIP_BINARY_DOWNLOAD=1. The release triggers on android-v* tags (plus workflow_dispatch dry run) and uses gh release create --latest=false, so an APK release never becomes "Latest" and desktop auto-update keeps working.
  • core.yml: core's lint (including a no-restricted-imports ban on react-native, expo* and react-dom), typecheck and tests.
  • All workflows pass actionlint 1.7.7.

Verified locally (Windows, Node 24.17, npm 11.13)

  • Clean npm ci at the root, then npm run lint (0 errors), typecheck and test:run across all workspaces: desktop 782 tests, mobile 454, core 241 (mobile + core = the 695 mobile had before).
  • npx expo-doctor: 21/21. npx expo export -p android and -p ios both bundle.
  • npm run electron:build:win in apps/desktop produces True Tunes Setup 1.0.47.exe; app.asar contains ws, electron-updater and @azure/msal-node, and no React, Expo or Electron.

Not verified

  • The Android Gradle release build with hoisted node_modules (no Android SDK on this machine). Run a Mobile Release dry run (workflow_dispatch) once this is on main, before the first android-v* tag.
  • The macOS desktop build, and both apps on a real device.

Before merging / after

  • Copy the Android signing configuration from TrueTunes-Android into this repo (Settings → Secrets and variables → Actions): secrets ANDROID_KEYSTORE_BASE64, ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS, ANDROID_KEY_PASSWORD, and variable ANDROID_CERT_SHA256. Optionally also the GENIUS_ACCESS_TOKEN and APPINSIGHTS_CONNECTION_STRING secrets, if the mobile repo had different values.
  • Locally: move any renderer/.env to apps/desktop/renderer/.env, delete the old root node_modules, dist, release and renderer/node_modules, and run npm install at the root.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B

Richard Kelsey and others added 30 commits September 29, 2026 21:43
Generated by create-expo 5.0.3.
Sideloaded Android client (Expo SDK 57 / React Native, New Architecture) for the True Tunes
Sonos web-player client. Ports the Sonos client, WebSocket session, queue operations and office
services from the desktop app's main process into platform-neutral, unit-tested modules, and
exposes them through the same window.sonos surface the desktop preload provides so the ported
React Query hooks run unchanged.

Screens: Home, Search, Queue (drag reorder, multi-select, swipe to remove, DJ section), Now
Playing, room picker, album / artist / container / playlist detail, lyrics, leaderboard, profile,
Queuedle, identity picker. Local-build workflow; see README.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Mirrors the desktop repo's setup: .nvmrc (Node 24), Prettier config, ESLint flat config
(typescript-eslint + react-hooks), lint / format / coverage scripts, and a CI workflow that
runs lint, typecheck, expo-doctor and the test suite with test and coverage reports on PRs
into main/develop and pushes to main. Adds CLAUDE.md, .gitattributes (LF) and formats the
tree with Prettier.

Also fixes real type errors the bridge typing had hidden: the Azure/Genius/presence members
are now asserted explicitly per member, the socket and queue-list ref types are corrected,
and three lint errors are fixed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Pushing a version tag (v1.2.3, or v1.2.3-rc.1 for a pre-release) builds a release-signed
APK on GitHub Actions and publishes it as a GitHub Release with a checksum. A manual run is a
dry run that only uploads an artifact.

- plugins/withReleaseSigning.js: Expo config plugin that signs the release variant with our
  keystore when ANDROID_KEYSTORE_PATH is set, and throws if the generated Gradle file stops
  matching the template rather than silently signing with the debug key (unit tested).
- release.yml: derives version and an ever-increasing versionCode from the tag, runs
  typecheck and tests before the long native build, and fails unless the APK's signing
  certificate matches the ANDROID_CERT_SHA256 repository variable.
- docs/RELEASING.md: process, signing key location (1Password), secrets, local signed build,
  and the dev-build vs release-build install caveat.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Debug builds are now uk.co.truenorthit.truetunes.dev ("True Tunes (dev)") while release
builds keep uk.co.truenorthit.truetunes, so a development build and a release build install
side by side instead of failing with INSTALL_FAILED_UPDATE_INCOMPATIBLE (they are signed with
different keys). Implemented as an Expo config plugin that patches the debug build type and adds
a debug-only app_name resource; it throws if the generated Gradle file stops matching the
template. Documents the change in RELEASING.md and CLAUDE.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed release pipeline (version tags) and separate dev package name
Promote develop to main: signed release pipeline and dev package name
Regenerates the Android icons from the desktop app's icon (navy square with the white globe):
a solid navy adaptive-icon background, the globe alone on transparency inside the launcher safe
zone (also used for the themed monochrome icon and the splash), and the full artwork as the
legacy 1024px icon. scripts/generate-icons.py reproduces them from the desktop icon.png; the
source is 512px so the 1024px outputs are upscaled.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Promote develop to main: desktop app icon
The 1.0.46 installer shipped without smtc.node: nothing compiled it in CI
and build.files excluded native/, so the require failed silently and SMTC
was a no-op. Add a build:native step to the Windows build/publish scripts
and ship the addon via files + asarUnpack.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JTQFG7usNZcdYDTqmHr4QR
Ship the Windows media controls addon in the installer
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
iOS 27 asserts at launch unless the app uses scenes. Expo 57 has the runtime (ExpoAppSceneDelegate) but its prebuild template does not use it; withIosSceneDelegate applies the SDK 58 template shape. Delete it on SDK 58.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
feat(ios): add iOS platform and bundle identifier
Imported from TrueNorthIT/TrueTunes-Android at 92f87cd with git filter-repo
--to-subdirectory-filter apps/mobile; its tag v1.0.0 is now android-v1.0.0.
Also drop apps/mobile/relcheck.log, a stray log from a release check.
…e.json

renderer/package.json and its lock only held @vitest/coverage-v8, which the
root devDependencies already provide at the same version.
- publish.yml becomes desktop.yml and ignores apps/mobile/** and the mobile
  workflows, so a mobile-only commit to main no longer publishes a desktop release.
- The mobile CI and release workflows move to mobile-ci.yml and
  mobile-release.yml, run from apps/mobile and only on mobile changes.
- Android releases are tagged android-vX.Y.Z, are created with --latest=false so
  desktop auto-update keeps reading the desktop release, and their notes start at
  the previous android-v tag.
The repo is public now, so RELEASING.md no longer says a GitHub sign-in is
needed to download the APK.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
- git mv the Electron app (src, renderer, native, assets, examples, icons,
  configs, SonosWebPlayerAPI.yaml, package.json) into apps/desktop. server/,
  .github, the docs, .nvmrc and .prettierrc stay at the root.
- The root package.json is now a private workspace root (apps/*, packages/*)
  with one package-lock.json; the per-app locks are gone. Overrides pin react
  and react-dom to 19.2.3 (Expo SDK 57), @tanstack/react-query to 5.104.0 and
  @types/react to 19.2.18, so each resolves to a single copy.
- The new lock was seeded with every direct dependency at the version the old
  per-app locks resolved, so neither app picks up unrelated upgrades.
- electron is pinned to 41.2.1 exactly: electron-builder cannot find the hoisted
  electron package from apps/desktop and falls back to the declared version.
- build:main also reads the root .env (still used by server/scripts/deploy.mjs).
- The root lint keeps linting server/ with the desktop ESLint config, as before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
- desktop.yml installs at the root and runs from apps/desktop. It only runs for
  apps/desktop, packages, the root package files and itself (PRs also for
  server/, which it lints). The version bump is
  npm version patch -w apps/desktop --package-lock-only, and the report, coverage
  and commit paths follow the move.
- The mobile workflows install from the root lock with
  ELECTRON_SKIP_BINARY_DOWNLOAD=1; mobile CI also runs for packages/ and the
  root package files.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
Vitest 5 (with coverage-v8 and ui), ESLint 10 with @eslint/js 10,
typescript-eslint 8.71, eslint-plugin-react-hooks 7.1 (7.0 does not accept
ESLint 10), jsdom 30 and @testing-library/jest-dom 7, at the versions the mobile
app already resolves, so each tool is installed once.

- The renderer test setup imports @testing-library/jest-dom/vitest, which
  extends Vitest's expect explicitly.
- ESLint 10's recommended no-useless-assignment flagged three initial values in
  main.ts that are always overwritten before use; they are removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
Formatting only: prettier --write over apps/desktop/src and
apps/desktop/renderer/src with the shared root .prettierrc. No code changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
- git mv apps/mobile/src/{sonos,office,core} and their tests into
  packages/core (@truetunes/core): private, TypeScript source with no build
  step, exported by subpath (@truetunes/core/sonos/*, office/*, core/*). None of
  them import React Native or Expo.
- Core has its own Vitest config (node environment), typecheck and ESLint
  config; no-restricted-imports makes react-native, expo* and react-dom an
  error there. Its tsconfig includes the mobile app's ambient window.sonos
  contract (src/types/globals.d.ts), which createCore satisfies.
- The mobile app depends on @truetunes/core and imports it by subpath; its
  node test project now only covers the config plugins.
- core.yml runs core's lint, typecheck and tests in CI. The root lint,
  typecheck and test:run scripts already cover every workspace.
- The desktop does not use core yet.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Coverage Report for Core

Status Category Percentage Covered / Total
🔵 Lines 89.68% 982 / 1095
🔵 Statements 88.38% 1119 / 1266
🔵 Functions 75.47% 240 / 318
🔵 Branches 84.56% 548 / 648
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
packages/core/src/core/createCore.ts 73.33% 71.73% 55.84% 73.15% 109, 131, 137-139, 149, 153-154, 165-166, 171, 175-176, 215, 251-253, 260, 262-264, 269-270, 274-277, 279, 281-285, 287, 291-295, 317-339, 374, 389
packages/core/src/core/events.ts 100% 100% 100% 100%
packages/core/src/core/loginUrl.ts 100% 100% 100% 100%
packages/core/src/core/session.ts 100% 100% 81.25% 100%
packages/core/src/office/azureApi.ts 99.21% 95.77% 97.29% 100% 35
packages/core/src/office/config.ts 100% 100% 100% 100%
packages/core/src/office/genius.ts 97.1% 90.74% 77.77% 100% 13, 66
packages/core/src/office/graphPresence.ts 94.73% 80% 83.33% 96.66% 60, 73
packages/core/src/office/officePresence.ts 95.23% 90% 66.66% 100% 15
packages/core/src/office/pubsub.ts 92.98% 84% 91.66% 99% 77, 78, 247, 252, 283, 288, 290, 295
packages/core/src/office/telemetry.ts 94.25% 89.74% 88.23% 96.05% 66, 70, 169-170, 178
packages/core/src/sonos/constants.ts 100% 100% 100% 100%
packages/core/src/sonos/operations.ts 100% 100% 100% 100%
packages/core/src/sonos/protocol.ts 81.63% 74.35% 83.33% 88.09% 7, 9-13, 57, 68, 93
packages/core/src/sonos/queueOps.ts 100% 100% 100% 100%
packages/core/src/sonos/sonosClient.ts 96.8% 90.38% 80% 98.21% 107, 120-121
packages/core/src/sonos/types.ts 100% 100% 100% 100%
packages/core/src/sonos/wsClient.ts 0% 0% 0% 0% 7-99
packages/core/src/sonos/wsSession.ts 93.67% 79.27% 85.48% 95.81% 116, 261, 271, 309, 324, 371-372, 390-391, 410-411, 422, 425, 470, 476
Generated in workflow #2 for commit b85cbc4 by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Coverage Report for Mobile

Status Category Percentage Covered / Total
🔵 Lines 76.29% 930 / 1219
🔵 Statements 75.03% 1073 / 1430
🔵 Functions 66.59% 291 / 437
🔵 Branches 65.57% 899 / 1371
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
apps/mobile/src/logic/AddToQueueContext.tsx 0% 100% 0% 0% 15-19
apps/mobile/src/logic/AddToQueueProvider.tsx 0% 100% 0% 0% 8-12
apps/mobile/src/logic/AutoplayContext.tsx 0% 100% 0% 0% 5-8
apps/mobile/src/logic/RemoteContext.tsx 57.14% 50% 50% 66.66% 10-11, 16
apps/mobile/src/logic/useAddToQueueImpl.ts 93.75% 75% 65% 95.45% 89, 229-238, 253, 283-296
apps/mobile/src/logic/useRemote.ts 0% 0% 0% 0% 16-121
apps/mobile/src/logic/context/AppContext.tsx 100% 100% 100% 100%
apps/mobile/src/logic/context/ToastContext.ts 100% 100% 50% 100%
apps/mobile/src/logic/hooks/useAlbumBrowse.ts 97.14% 59.52% 88.88% 96.87% 131-134
apps/mobile/src/logic/hooks/useArtistBrowse.ts 59.09% 42.1% 63.63% 56.75% 57-74, 85, 111-133
apps/mobile/src/logic/hooks/useAttribution.ts 96.77% 66.66% 100% 100% 48
apps/mobile/src/logic/hooks/useAuth.ts 100% 100% 100% 100%
apps/mobile/src/logic/hooks/useAutoplay.ts 86.2% 78.43% 72.72% 88.31% 37, 43-45, 54, 63, 150, 226, 233-235
apps/mobile/src/logic/hooks/useContainerBrowse.ts 100% 100% 100% 100%
apps/mobile/src/logic/hooks/useDailyGame.ts 87.2% 73.68% 75% 87.5% 20, 78, 158-159, 183-185, 211, 224-236
apps/mobile/src/logic/hooks/useDjDiscoveries.ts 0% 0% 0% 0% 17-80
apps/mobile/src/logic/hooks/useDjSet.ts 75% 89.47% 75% 75% 37
apps/mobile/src/logic/hooks/useDominantColor.ts 97.67% 90.9% 78.57% 100% 6
apps/mobile/src/logic/hooks/useGeniusAlbumYear.ts 0% 0% 0% 0% 7-18
apps/mobile/src/logic/hooks/useGeniusDescription.ts 0% 0% 0% 0% 7-18
apps/mobile/src/logic/hooks/useGroups.ts 100% 100% 100% 100%
apps/mobile/src/logic/hooks/useImage.ts 0% 0% 0% 0% 3
apps/mobile/src/logic/hooks/useLyrics.ts 0% 0% 0% 0% 9-60
apps/mobile/src/logic/hooks/useNowPlaying.ts 89.47% 64.58% 50% 89.47% 50-51
apps/mobile/src/logic/hooks/useOfficePresence.ts 75% 88.88% 66.66% 75% 24
apps/mobile/src/logic/hooks/useOpenItem.ts 100% 80% 100% 100%
apps/mobile/src/logic/hooks/usePlayback.ts 100% 70.45% 100% 100%
apps/mobile/src/logic/hooks/usePlaylistBrowse.ts 95.45% 74.28% 100% 93.75% 17
apps/mobile/src/logic/hooks/usePlaylists.ts 67.92% 45.45% 56.25% 68.75% 21-44, 54-55, 82, 132-135
apps/mobile/src/logic/hooks/usePrefetchNextLyrics.ts 0% 0% 0% 0% 8-16
apps/mobile/src/logic/hooks/useQueue.ts 97.67% 95% 100% 100% 28
apps/mobile/src/logic/hooks/useQueueTrack.ts 89.47% 81.25% 33.33% 89.47% 38, 56
apps/mobile/src/logic/hooks/useRecentlyPlayed.ts 0% 0% 0% 0% 7-84
apps/mobile/src/logic/hooks/useResolveAndOpen.ts 0% 0% 0% 0% 19-68
apps/mobile/src/logic/hooks/useSkinnyMode.ts 37.5% 50% 50% 37.5% 19-23
apps/mobile/src/logic/hooks/useStats.ts 100% 100% 100% 100%
apps/mobile/src/logic/hooks/useTrackDetails.ts 96.29% 59.09% 75% 96% 78-81
apps/mobile/src/logic/hooks/useUserProfile.ts 0% 0% 0% 0% 4-17
apps/mobile/src/logic/hooks/useUserStats.ts 0% 0% 0% 0% 5-43
apps/mobile/src/logic/hooks/useUsers.ts 0% 0% 0% 0% 4-8
apps/mobile/src/logic/lib/avatarImage.ts 0% 0% 0% 0% 18-35
apps/mobile/src/logic/lib/itemHelpers.ts 88.37% 77.6% 78.78% 92.17% 27, 120-122, 192-201, 341, 344
apps/mobile/src/logic/lib/playlistColor.ts 0% 100% 0% 0% 2-8
apps/mobile/src/logic/lib/prefetch.ts 100% 100% 100% 100%
apps/mobile/src/logic/lib/queryPersistence.ts 100% 100% 100% 100%
apps/mobile/src/logic/lib/queueHelpers.ts 100% 100% 100% 100%
apps/mobile/src/logic/lib/queuedleLogic.ts 86.95% 81.03% 94.44% 87.5% 53-54, 74-82
apps/mobile/src/logic/lib/recentSearches.ts 100% 100% 100% 100%
apps/mobile/src/logic/lib/searchRules.ts 100% 100% 100% 100%
apps/mobile/src/logic/lib/socialFormat.ts 100% 100% 100% 100%
apps/mobile/src/logic/lib/sonosApi.ts 100% 100% 100% 100%
apps/mobile/src/logic/lib/ytmSections.ts 80% 56.66% 100% 85.71% 15, 17, 25-27, 35, 53
apps/mobile/src/logic/providers/AudioProvider.ts 100% 100% 100% 100%
apps/mobile/src/logic/providers/index.ts 100% 100% 100% 100%
apps/mobile/src/logic/providers/sonos/SonosProvider.ts 66.66% 77.87% 46.87% 65.62% 94-95, 103-134, 152-168, 184
apps/mobile/src/logic/types/AlbumResponse.d.ts 100% 100% 100% 100%
apps/mobile/src/logic/types/ArtistResponse.d.ts 100% 100% 100% 100%
apps/mobile/src/logic/types/PlaylistResponse.d.ts 100% 100% 100% 100%
apps/mobile/src/logic/types/ServiceSearch.d.ts 100% 100% 100% 100%
apps/mobile/src/logic/types/provider.ts 100% 100% 100% 100%
apps/mobile/src/logic/types/sonos.ts 100% 100% 100% 100%
Generated in workflow #2 for commit b85cbc4 by the Vitest Coverage Report Action

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Coverage Report for Desktop

Status Category Percentage Covered / Total
🔵 Lines 69.46% 2218 / 3193
🔵 Statements 67.47% 2456 / 3640
🔵 Functions 61.69% 678 / 1099
🔵 Branches 62.44% 2308 / 3696
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
apps/desktop/renderer/src/components/common/ExplicitBadge.tsx 100% 100% 100% 100%
apps/desktop/renderer/src/components/queuedle/ScoreDistribution.tsx 100% 90% 100% 100%
apps/desktop/renderer/src/hooks/useGeniusDescription.ts 0% 0% 0% 0% 7-18
apps/desktop/renderer/src/hooks/useNowPlaying.ts 89.47% 64.58% 50% 89.47% 50-51
apps/desktop/renderer/src/hooks/useQueueTrack.ts 89.47% 81.25% 33.33% 89.47% 38, 56
apps/desktop/renderer/src/types/globals.d.ts 100% 100% 100% 100%
Generated in workflow #2 for commit b85cbc4 by the Vitest Coverage Report Action

…ckages/

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMj5XGHLroJb9q68jXkw8B
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants