From 8ef7b9ce8c70ed303adc6e8c61cee1eef78011fe Mon Sep 17 00:00:00 2001 From: arnef Date: Thu, 13 Aug 2026 21:52:32 +0200 Subject: [PATCH] Flatten repo: move client/ contents to repo root The project is no longer a monorepo/workspace - there is only a single app package. Remove the redundant client/ nesting: all source, the Capacitor Android project, config files and package.json/tsconfig now live directly at the repo root. - Merge client/package.json into root package.json (drop the workspaces field and the now-unnecessary bun --cwd client wrappers). - Merge client/bun.lock (the actual dependency lockfile) into the root, replacing the stale workspace-only root lockfile. - Move src/, public/, android/, index.html, vite.config.ts, capacitor.config.ts, tsconfig.{app,node}.json to the repo root. - Update Dockerfile.android to build from the repo root instead of cd'ing into client/. - Update .github/workflows/ci.yml type-check step to run bun run build directly instead of bun --cwd client run build. - Update README.md and .github/copilot-instructions.md to drop references to the client/ subdirectory. - Drop the stale server/downloads/ entry from .gitignore (leftover from an old server-based architecture that no longer exists). --- .github/copilot-instructions.md | 59 +- .github/workflows/ci.yml | 4 +- .gitignore | 3 - Dockerfile.android | 12 +- README.md | 33 +- {client/android => android}/.gitignore | 0 {client/android => android}/app/.gitignore | 0 {client/android => android}/app/build.gradle | 0 .../app/capacitor.build.gradle | 0 .../app/proguard-rules.pro | 0 .../myapp/ExampleInstrumentedTest.java | 0 .../app/src/main/AndroidManifest.xml | 0 .../main/java/com/tiptoisync/app/DevPlugin.kt | 0 .../java/com/tiptoisync/app/MainActivity.kt | 0 .../java/com/tiptoisync/app/TiptoiPlugin.kt | 0 .../main/res/drawable-land-hdpi/splash.png | Bin .../main/res/drawable-land-mdpi/splash.png | Bin .../main/res/drawable-land-xhdpi/splash.png | Bin .../main/res/drawable-land-xxhdpi/splash.png | Bin .../main/res/drawable-land-xxxhdpi/splash.png | Bin .../main/res/drawable-port-hdpi/splash.png | Bin .../main/res/drawable-port-mdpi/splash.png | Bin .../main/res/drawable-port-xhdpi/splash.png | Bin .../main/res/drawable-port-xxhdpi/splash.png | Bin .../main/res/drawable-port-xxxhdpi/splash.png | Bin .../app/src/main/res/drawable/splash.png | Bin .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../mipmap-hdpi/ic_launcher_foreground.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../mipmap-mdpi/ic_launcher_foreground.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../mipmap-xhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../res/values/ic_launcher_background.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/styles.xml | 0 .../app/src/main/res/xml/file_paths.xml | 0 .../getcapacitor/myapp/ExampleUnitTest.java | 0 .../app/tiptoi-debug.keystore | Bin {client/android => android}/build.gradle | 0 .../capacitor.settings.gradle | 0 {client/android => android}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {client/android => android}/gradlew | 0 {client/android => android}/gradlew.bat | 0 {client/android => android}/settings.gradle | 0 {client/android => android}/variables.gradle | 0 bun.lock | 36 +- ...capacitor.config.ts => capacitor.config.ts | 0 client/README.md | 28 - client/bun.lock | 850 ------------------ client/package.json | 26 - client/tsconfig.json | 7 - client/index.html => index.html | 0 package.json | 28 +- {client/public => public}/favicon.svg | 0 {client/public => public}/icons.svg | 0 {client/src => src}/App.css | 0 {client/src => src}/App.tsx | 0 {client/src => src}/api.ts | 0 {client/src => src}/assets/hero.png | Bin {client/src => src}/assets/solid.svg | 0 {client/src => src}/assets/vite.svg | 0 {client/src => src}/barcode-detector.d.ts | 0 {client/src => src}/components/DevMenu.tsx | 0 {client/src => src}/components/QrScanner.tsx | 0 {client/src => src}/index.css | 0 {client/src => src}/index.tsx | 0 {client/src => src}/native/DevPlugin.ts | 0 {client/src => src}/native/TiptoiPlugin.ts | 0 {client/src => src}/pages/DownloadsPage.tsx | 0 {client/src => src}/pages/ScanPage.tsx | 0 client/tsconfig.app.json => tsconfig.app.json | 0 tsconfig.json | 33 +- .../tsconfig.node.json => tsconfig.node.json | 0 client/vite.config.ts => vite.config.ts | 0 88 files changed, 80 insertions(+), 1039 deletions(-) rename {client/android => android}/.gitignore (100%) rename {client/android => android}/app/.gitignore (100%) rename {client/android => android}/app/build.gradle (100%) rename {client/android => android}/app/capacitor.build.gradle (100%) rename {client/android => android}/app/proguard-rules.pro (100%) rename {client/android => android}/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java (100%) rename {client/android => android}/app/src/main/AndroidManifest.xml (100%) rename {client/android => android}/app/src/main/java/com/tiptoisync/app/DevPlugin.kt (100%) rename {client/android => android}/app/src/main/java/com/tiptoisync/app/MainActivity.kt (100%) rename {client/android => android}/app/src/main/java/com/tiptoisync/app/TiptoiPlugin.kt (100%) rename {client/android => android}/app/src/main/res/drawable-land-hdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-land-mdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-land-xhdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-land-xxhdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-land-xxxhdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-port-hdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-port-mdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-port-xhdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-port-xxhdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable-port-xxxhdpi/splash.png (100%) rename {client/android => android}/app/src/main/res/drawable/splash.png (100%) rename {client/android => android}/app/src/main/res/layout/activity_main.xml (100%) rename {client/android => android}/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {client/android => android}/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {client/android => android}/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {client/android => android}/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png (100%) rename {client/android => android}/app/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename {client/android => android}/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {client/android => android}/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png (100%) rename {client/android => android}/app/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png (100%) rename {client/android => android}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename {client/android => android}/app/src/main/res/values/ic_launcher_background.xml (100%) rename {client/android => android}/app/src/main/res/values/strings.xml (100%) rename {client/android => android}/app/src/main/res/values/styles.xml (100%) rename {client/android => android}/app/src/main/res/xml/file_paths.xml (100%) rename {client/android => android}/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java (100%) rename {client/android => android}/app/tiptoi-debug.keystore (100%) rename {client/android => android}/build.gradle (100%) rename {client/android => android}/capacitor.settings.gradle (100%) rename {client/android => android}/gradle.properties (100%) rename {client/android => android}/gradle/wrapper/gradle-wrapper.jar (100%) rename {client/android => android}/gradle/wrapper/gradle-wrapper.properties (100%) rename {client/android => android}/gradlew (100%) rename {client/android => android}/gradlew.bat (100%) rename {client/android => android}/settings.gradle (100%) rename {client/android => android}/variables.gradle (100%) rename client/capacitor.config.ts => capacitor.config.ts (100%) delete mode 100644 client/README.md delete mode 100644 client/bun.lock delete mode 100644 client/package.json delete mode 100644 client/tsconfig.json rename client/index.html => index.html (100%) rename {client/public => public}/favicon.svg (100%) rename {client/public => public}/icons.svg (100%) rename {client/src => src}/App.css (100%) rename {client/src => src}/App.tsx (100%) rename {client/src => src}/api.ts (100%) rename {client/src => src}/assets/hero.png (100%) rename {client/src => src}/assets/solid.svg (100%) rename {client/src => src}/assets/vite.svg (100%) rename {client/src => src}/barcode-detector.d.ts (100%) rename {client/src => src}/components/DevMenu.tsx (100%) rename {client/src => src}/components/QrScanner.tsx (100%) rename {client/src => src}/index.css (100%) rename {client/src => src}/index.tsx (100%) rename {client/src => src}/native/DevPlugin.ts (100%) rename {client/src => src}/native/TiptoiPlugin.ts (100%) rename {client/src => src}/pages/DownloadsPage.tsx (100%) rename {client/src => src}/pages/ScanPage.tsx (100%) rename client/tsconfig.app.json => tsconfig.app.json (100%) rename client/tsconfig.node.json => tsconfig.node.json (100%) rename client/vite.config.ts => vite.config.ts (100%) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 7438162..2acd411 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -8,46 +8,45 @@ for a self-hosted server variant; the current implementation is Android-only). ## Repository layout -- `client/` — SolidJS + Vite PWA/webview UI (workspace root's actual app code). - - `src/api.ts` — all "business logic": scraping Ravensburger's search API/HTML - for `.gme` download links, orchestrating download + sync, calling the - native plugin. - - `src/native/TiptoiPlugin.ts` + `src/native/DevPlugin.ts` — TypeScript - interfaces for Capacitor native plugins (`registerPlugin`). Any change to - the native Kotlin plugin's method signatures must be mirrored here. - - `src/pages/` — `ScanPage.tsx` (barcode/text search) and - `DownloadsPage.tsx` (library + pen sync UI). - - `android/` — Capacitor Android project, **checked into the repo** (not - generated on demand). `android/app/src/main/java/com/tiptoisync/app/` - contains the actual native implementation: - - `TiptoiPlugin.kt` — SAF (Storage Access Framework) directory picker for - the pen, listing/copying/deleting `.gme` files on the pen, downloading - GME/cover files into app-private storage via `HttpURLConnection`. - - `DevPlugin.kt` — enables Capacitor live-reload against a Vite dev server - (see `DEV_URL` below). +This is a single SolidJS + Vite + Capacitor project (no monorepo/workspace) — +all app code lives directly at the repo root. + +- `src/api.ts` — all "business logic": scraping Ravensburger's search API/HTML + for `.gme` download links, orchestrating download + sync, calling the + native plugin. +- `src/native/TiptoiPlugin.ts` + `src/native/DevPlugin.ts` — TypeScript + interfaces for Capacitor native plugins (`registerPlugin`). Any change to + the native Kotlin plugin's method signatures must be mirrored here. +- `src/pages/` — `ScanPage.tsx` (barcode/text search) and + `DownloadsPage.tsx` (library + pen sync UI). +- `android/` — Capacitor Android project, **checked into the repo** (not + generated on demand). `android/app/src/main/java/com/tiptoisync/app/` + contains the actual native implementation: + - `TiptoiPlugin.kt` — SAF (Storage Access Framework) directory picker for + the pen, listing/copying/deleting `.gme` files on the pen, downloading + GME/cover files into app-private storage via `HttpURLConnection`. + - `DevPlugin.kt` — enables Capacitor live-reload against a Vite dev server + (see `DEV_URL` below). - `Dockerfile.android`, `build-apk.sh` — reproducible APK build via Docker/Podman (no local Android SDK needed). Output APK lands in `apk-output/tiptoi-sync.apk`. ## Build & dev commands -Run from repo root (workspace uses `bun`): +Run from repo root (uses `bun`): ```bash -bun install # installs client workspace deps -bun run dev # starts Vite dev server (client) with --host -bun run build # tsc -b && vite build for client -bun run cap:sync # copies web build into android/ project -bun run cap:android # builds & runs on connected device/emulator +bun install # installs deps +bun run dev # starts Vite dev server with --host +bun run build # tsc -b && vite build +bun run cap:sync # copies web build into android/ project +bun run cap:android # builds & runs on connected device/emulator ``` -Equivalent scripts also exist directly in `client/package.json` (`bun --cwd -client run