pacer/AGENTS.md
Jeena a5b3f46eae Set up Android project with Kotlin and Jetpack Compose
Initial project structure with manifest configured for foreground
audio service, AudioTrack-based playback, and background operation.
Includes Gradle wrapper, dependency catalog, placeholder icons,
and build instructions for Arch Linux.
2026-03-09 06:51:42 +00:00

94 lines
3.7 KiB
Markdown

# AGENTS.md — Agent Working Guide for Pacer
## Purpose
This file explains how AI agents should work with the Pacer project. Follow these rules
consistently across sessions, as different agents may work on different themes or user stories.
## Agent Environment
- Runs inside a Docker container with `sudo` rights
- Install any required tools via `sudo pacman -S <package>` or `paru -S <package>` (AUR)
- No need to ask the user to install dependencies — just install them as needed
## Project Structure
```
Pacer/
├── AGENTS.md ← this file
├── BACKLOG.md ← all user stories and acceptance criteria
├── README.md ← build instructions for humans
├── gradlew ← always use this to build, never system gradle
├── gradle/
│ ├── libs.versions.toml ← single source of truth for all dependency versions
│ └── wrapper/
├── settings.gradle.kts
├── build.gradle.kts ← root build file (apply false only)
└── app/
├── build.gradle.kts ← module build file
└── src/
├── main/
│ ├── AndroidManifest.xml
│ ├── kotlin/net/jeena/pacer/ ← all Kotlin source files
│ └── res/
├── test/kotlin/net/jeena/pacer/ ← unit tests
└── androidTest/kotlin/net/jeena/pacer/ ← instrumented tests
```
## Package Name
All Kotlin source files use the package prefix `net.jeena.pacer`.
## Naming Conventions
- Activities: `*Activity.kt` (e.g., `MainActivity.kt`)
- Services: `*Service.kt` (e.g., `PacerService.kt`)
- Composables: `*Screen.kt` for full screens, `*Component.kt` for reusable UI
- ViewModels: `*ViewModel.kt`
## Code Rules (Never Violate)
- Kotlin only — no Java files
- All UI via Jetpack Compose — no XML layouts
- **No audio focus requests anywhere** — app must play alongside AntennaPod without interruption
- Use `AudioTrack` directly for audio — not `MediaPlayer` or `ExoPlayer`
- `minSdk = 24` — use version checks for APIs above this
- Single-activity architecture — do not add new Activities for new screens
- All dependency versions in `gradle/libs.versions.toml` — never hardcode versions
## How to Use the BACKLOG
Stories are identified as `US-XX` in BACKLOG.md, grouped by Theme.
### Workflow Per User Story
1. Read the acceptance criteria for the target story in BACKLOG.md.
2. For TDD stories (US-03, US-04, US-13, US-14): write the failing test first.
3. Implement the minimum code to satisfy acceptance criteria.
4. Verify: `./gradlew lint` passes, `./gradlew test` passes.
### TDD Stories
For US-03, US-04, US-13:
- Commit failing test first: `test(US-XX): add failing test for <feature>`
- Then implement and commit: `feat(US-XX): implement <feature>`
### Commit Message Convention
```
<type>(US-XX): <short description>
Types: feat, fix, test, refactor, docs, chore
Example: feat(US-03): generate 880 Hz sine wave with AudioTrack
```
## Build Commands
```bash
./gradlew assembleDebug # build debug APK
./gradlew test # run unit tests
./gradlew connectedAndroidTest # run instrumented tests (requires device)
./gradlew lint # run lint checks
./gradlew installDebug # install on connected device
./gradlew clean assembleDebug # clean build
```
Output APK: `app/build/outputs/apk/debug/app-debug.apk`
## Key Architecture Notes
- Background audio uses `HandlerThread` for the scheduling loop (battery-efficient)
- `WAKE_LOCK` + foreground service keeps audio alive through Doze mode
- `foregroundServiceType="mediaPlayback"` is required on Android 14+ (already in manifest)
- Do not add new dependencies without a user story requiring them