Add Copilot CLI repository instructions
This commit is contained in:
@@ -0,0 +1,90 @@
|
|||||||
|
# tiptoi-sync
|
||||||
|
|
||||||
|
Android app (Capacitor + SolidJS) for searching, downloading, and syncing tiptoi
|
||||||
|
books onto a tiptoi pen. All book search/download and pen file access happens
|
||||||
|
**natively on-device** — there is no backend server in this repo despite what
|
||||||
|
`README.md`'s architecture diagram describes (that README is stale/aspirational
|
||||||
|
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).
|
||||||
|
- `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`):
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
Equivalent scripts also exist directly in `client/package.json` (`bun --cwd
|
||||||
|
client run <script>` or `cd client && bun run <script>`).
|
||||||
|
|
||||||
|
There are no unit/integration tests or linters configured in this repo — only
|
||||||
|
TypeScript's compiler (`tsc -b`, run as part of `build`) enforces correctness
|
||||||
|
on the client. Validate client changes with `bun run build` from the repo
|
||||||
|
root, or `cd client && bunx tsc -b --noEmit` for a faster type-only check.
|
||||||
|
|
||||||
|
### Building the Android APK
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./build-apk.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Wraps a multi-stage `Dockerfile.android` build (Bun + Android SDK + Gradle)
|
||||||
|
using Podman or Docker, with `--no-cache` to avoid stale layers. No local
|
||||||
|
Android SDK/Gradle install required. Result: `apk-output/tiptoi-sync.apk`.
|
||||||
|
|
||||||
|
### Live-reload against Vite dev server on a device
|
||||||
|
|
||||||
|
```bash
|
||||||
|
DEV_URL=http://<host-ip>:5173 bun run cap:android
|
||||||
|
```
|
||||||
|
|
||||||
|
`client/capacitor.config.ts` reads `DEV_URL` and switches Capacitor's webview
|
||||||
|
to load from the dev server (with `cleartext: true`) instead of the bundled
|
||||||
|
`dist/` output. `DevPlugin.kt`/`DevPlugin.ts` support activating/deactivating
|
||||||
|
this from within the running app (see `DevMenu.tsx`, triggered by 5 taps on
|
||||||
|
the app title within 2 seconds — see `App.tsx`).
|
||||||
|
|
||||||
|
## Key conventions
|
||||||
|
|
||||||
|
- **UI copy is German.** Keep user-facing strings, comments in `api.ts`, and
|
||||||
|
section-divider comments (e.g. `// ── Suche ──...`) in German to match the
|
||||||
|
existing style.
|
||||||
|
- **Native plugin contract**: TypeScript interfaces in `src/native/*.ts` must
|
||||||
|
stay in sync with `@PluginMethod`/`@CapacitorPlugin` definitions in the
|
||||||
|
corresponding Kotlin files — there's no code generation, it's manually kept
|
||||||
|
in sync.
|
||||||
|
- **All book search scraping logic lives in `api.ts`** (regex-based HTML
|
||||||
|
parsing of Ravensburger's site, HTML entity decoding). If Ravensburger
|
||||||
|
changes their markup, this is the place to fix it.
|
||||||
|
- Filenames for downloaded books derive from the last path segment of the GME
|
||||||
|
URL (decoded, `.gme` stripped); covers reuse the same base name with the
|
||||||
|
cover's own extension.
|
||||||
|
- `syncAll` in `api.ts` is the single source of truth for "what needs
|
||||||
|
copying to the pen": it diffs local downloads against `listPenFiles`.
|
||||||
Reference in New Issue
Block a user