{"owner":"taigrr","repo":"spank","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# AGENTS.md\n\n> Guidelines for AI agents working in this repository.\n\n## Project Overview\n\n**spank** is a macOS CLI tool that detects physical hits/slaps on Apple Silicon MacBooks via the accelerometer and plays audio responses. Single-file Go application with embedded MP3 assets.\n\n- **Platform**: macOS on Apple Silicon (M2+) only\n- **Runtime requirement**: `sudo` (for IOKit HID accelerometer access)\n- **Architecture**: Single `main.go` file with embedded audio assets\n\n## Commands\n\n### Build & Run\n\n```bash\n# Build\ngo build -o spank .\n\n# Run (requires sudo)\nsudo ./spank\nsudo ./spank --sexy      # escalating responses mode\nsudo ./spank --halo      # Halo death sounds mode\nsudo ./spank --custom /path/to/mp3s  # custom audio directory\n```\n\n### Install\n\n```bash\ngo install github.com/taigrr/spank@latest\n```\n\n### Release\n\nReleases are automated via GitHub Actions + GoReleaser Pro when a `v*` tag is pushed:\n\n```bash\ngit tag v1.0.0\ngit push origin v1.0.0\n```\n\n## Code Organization\n\n```\nspank/\n├── main.go              # All application code (single file)\n├── audio/\n│   ├── pain/            # Default \"ow!\" responses (10 MP3s)\n│   ├── sexy/            # Escalating responses (60 MP3s)\n│   └── halo/            # Halo death sounds (9 MP3s)\n├── go.mod\n├── .goreleaser.yaml     # Release configuration\n└── .github/workflows/   # CI/CD\n```\n\n## Key Dependencies\n\n| Package | Purpose |\n|---------|---------|\n| `github.com/taigrr/apple-silicon-accelerometer` | Reads accelerometer via IOKit HID |\n| `github.com/gopxl/beep/v2` | Audio playback (MP3 decoding, speaker output) |\n| `github.com/spf13/cobra` | CLI framework |\n| `github.com/charmbracelet/fang` | CLI config/execution wrapper |\n\n## Code Patterns\n\n### Embedded Assets\n\nAudio files are embedded at compile time using `//go:embed`:\n\n```go\n//go:embed audio/pain/*.mp3\nvar painAudio embed.FS\n```\n\n### Play Modes\n\nTwo playback strategies in `playMode`:\n- `modeRandom`: Random file selection (pain, halo, custom modes)\n- `modeEscalation`: Intensity increases with slap frequency (sexy mode)\n\n### Slap Detection Flow\n\n1. `sensor.Run()` reads accelerometer in background goroutine\n2. Data shared via `shm.RingBuffer` (POSIX shared memory)\n3. `detector.New()` processes samples with vibration detection algorithms\n4. Events trigger audio playback with 750ms cooldown\n\n### Concurrency\n\n- `speakerMu sync.Mutex` protects speaker initialization\n- `slapTracker.mu sync.Mutex` protects slap scoring state\n- Audio playback runs in goroutines (`go playAudio(...)`)\n\n## Constants\n\nKey tuning parameters in `main.go`:\n\n| Constant | Value | Purpose |\n|----------|-------|---------|\n| `decayHalfLife` | 30s | How fast escalation fades |\n| `slapCooldown` | 750ms | Minimum time between audio plays |\n| `sensorPollInterval` | 10ms | Accelerometer polling rate |\n| `maxSampleBatch` | 200 | Max samples processed per tick |\n\n## Gotchas\n\n1. **Root required**: The app must run with `sudo` for IOKit HID access. The `run()` function checks `os.Geteuid() != 0`.\n\n2. **Apple Silicon only**: Only builds for `darwin/arm64`. Intel Macs are not supported.\n\n3. **Private dependency**: `github.com/taigrr/apple-silicon-accelerometer` requires `GOPRIVATE` setting and GitHub PAT for CI.\n\n4. **Single file**: All code is in `main.go`. When adding features, follow the existing pattern of types and functions in the same file.\n\n5. **Mutually exclusive modes**: `--sexy`, `--halo`, and `--custom` flags cannot be combined.\n\n6. **CGO disabled**: Builds use `CGO_ENABLED=0` despite targeting macOS.\n\n## Adding Audio\n\nTo add a new sound pack:\n\n1. Create directory under `audio/`\n2. Add MP3 files (numbered for escalation mode, any names for random)\n3. Add `//go:embed audio/newpack/*.mp3` variable\n4. Add flag and case in `run()` switch statement\n5. Create `soundPack` with appropriate `playMode`\n\n## Version\n\nVersion is injected via ldflags at build time:\n\n```go\nvar version = \"dev\"\n```\n\nGoReleaser sets `-X main.version={{.Version}}` during release builds.\n"},"files":{"AGENTS.md":"# AGENTS.md\n\n> Guidelines for AI agents working in this repository.\n\n## Project Overview\n\n**spank** is a macOS CLI tool that detects physical hits/slaps on Apple Silicon MacBooks via the accelerometer and plays audio responses. Single-file Go application with embedded MP3 assets.\n\n- **Platform**: macOS on Apple Silicon (M2+) only\n- **Runtime requirement**: `sudo` (for IOKit HID accelerometer access)\n- **Architecture**: Single `main.go` file with embedded audio assets\n\n## Commands\n\n### Build & Run\n\n```bash\n# Build\ngo build -o spank .\n\n# Run (requires sudo)\nsudo ./spank\nsudo ./spank --sexy      # escalating responses mode\nsudo ./spank --halo      # Halo death sounds mode\nsudo ./spank --custom /path/to/mp3s  # custom audio directory\n```\n\n### Install\n\n```bash\ngo install github.com/taigrr/spank@latest\n```\n\n### Release\n\nReleases are automated via GitHub Actions + GoReleaser Pro when a `v*` tag is pushed:\n\n```bash\ngit tag v1.0.0\ngit push origin v1.0.0\n```\n\n## Code Organization\n\n```\nspank/\n├── main.go              # All application code (single file)\n├── audio/\n│   ├── pain/            # Default \"ow!\" responses (10 MP3s)\n│   ├── sexy/            # Escalating responses (60 MP3s)\n│   └── halo/            # Halo death sounds (9 MP3s)\n├── go.mod\n├── .goreleaser.yaml     # Release configuration\n└── .github/workflows/   # CI/CD\n```\n\n## Key Dependencies\n\n| Package | Purpose |\n|---------|---------|\n| `github.com/taigrr/apple-silicon-accelerometer` | Reads accelerometer via IOKit HID |\n| `github.com/gopxl/beep/v2` | Audio playback (MP3 decoding, speaker output) |\n| `github.com/spf13/cobra` | CLI framework |\n| `github.com/charmbracelet/fang` | CLI config/execution wrapper |\n\n## Code Patterns\n\n### Embedded Assets\n\nAudio files are embedded at compile time using `//go:embed`:\n\n```go\n//go:embed audio/pain/*.mp3\nvar painAudio embed.FS\n```\n\n### Play Modes\n\nTwo playback strategies in `playMode`:\n- `modeRandom`: Random file selection (pain, halo, custom modes)\n- `modeEscalation`: Intensity increases with slap frequency (sexy mode)\n\n### Slap Detection Flow\n\n1. `sensor.Run()` reads accelerometer in background goroutine\n2. Data shared via `shm.RingBuffer` (POSIX shared memory)\n3. `detector.New()` processes samples with vibration detection algorithms\n4. Events trigger audio playback with 750ms cooldown\n\n### Concurrency\n\n- `speakerMu sync.Mutex` protects speaker initialization\n- `slapTracker.mu sync.Mutex` protects slap scoring state\n- Audio playback runs in goroutines (`go playAudio(...)`)\n\n## Constants\n\nKey tuning parameters in `main.go`:\n\n| Constant | Value | Purpose |\n|----------|-------|---------|\n| `decayHalfLife` | 30s | How fast escalation fades |\n| `slapCooldown` | 750ms | Minimum time between audio plays |\n| `sensorPollInterval` | 10ms | Accelerometer polling rate |\n| `maxSampleBatch` | 200 | Max samples processed per tick |\n\n## Gotchas\n\n1. **Root required**: The app must run with `sudo` for IOKit HID access. The `run()` function checks `os.Geteuid() != 0`.\n\n2. **Apple Silicon only**: Only builds for `darwin/arm64`. Intel Macs are not supported.\n\n3. **Private dependency**: `github.com/taigrr/apple-silicon-accelerometer` requires `GOPRIVATE` setting and GitHub PAT for CI.\n\n4. **Single file**: All code is in `main.go`. When adding features, follow the existing pattern of types and functions in the same file.\n\n5. **Mutually exclusive modes**: `--sexy`, `--halo`, and `--custom` flags cannot be combined.\n\n6. **CGO disabled**: Builds use `CGO_ENABLED=0` despite targeting macOS.\n\n## Adding Audio\n\nTo add a new sound pack:\n\n1. Create directory under `audio/`\n2. Add MP3 files (numbered for escalation mode, any names for random)\n3. Add `//go:embed audio/newpack/*.mp3` variable\n4. Add flag and case in `run()` switch statement\n5. Create `soundPack` with appropriate `playMode`\n\n## Version\n\nVersion is injected via ldflags at build time:\n\n```go\nvar version = \"dev\"\n```\n\nGoReleaser sets `-X main.version={{.Version}}` during release builds.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\n> Guidelines for AI agents working in this repository.\n\n## Project Overview\n\n**spank** is a macOS CLI tool that detects physical hits/slaps on Apple Silicon MacBooks via the accelerometer and plays audio responses. Single-file Go application with embedded MP3 assets.\n\n- **Platform**: macOS on Apple Silicon (M2+) only\n- **Runtime requirement**: `sudo` (for IOKit HID accelerometer access)\n- **Architecture**: Single `main.go` file with embedded audio assets\n\n## Commands\n\n### Build & Run\n\n```bash\n# Build\ngo build -o spank .\n\n# Run (requires sudo)\nsudo ./spank\nsudo ./spank --sexy      # escalating responses mode\nsudo ./spank --halo      # Halo death sounds mode\nsudo ./spank --custom /path/to/mp3s  # custom audio directory\n```\n\n### Install\n\n```bash\ngo install github.com/taigrr/spank@latest\n```\n\n### Release\n\nReleases are automated via GitHub Actions + GoReleaser Pro when a `v*` tag is pushed:\n\n```bash\ngit tag v1.0.0\ngit push origin v1.0.0\n```\n\n## Code Organization\n\n```\nspank/\n├── main.go              # All application code (single file)\n├── audio/\n│   ├── pain/            # Default \"ow!\" responses (10 MP3s)\n│   ├── sexy/            # Escalating responses (60 MP3s)\n│   └── halo/            # Halo death sounds (9 MP3s)\n├── go.mod\n├── .goreleaser.yaml     # Release configuration\n└── .github/workflows/   # CI/CD\n```\n\n## Key Dependencies\n\n| Package | Purpose |\n|---------|---------|\n| `github.com/taigrr/apple-silicon-accelerometer` | Reads accelerometer via IOKit HID |\n| `github.com/gopxl/beep/v2` | Audio playback (MP3 decoding, speaker output) |\n| `github.com/spf13/cobra` | CLI framework |\n| `github.com/charmbracelet/fang` | CLI config/execution wrapper |\n\n## Code Patterns\n\n### Embedded Assets\n\nAudio files are embedded at compile time using `//go:embed`:\n\n```go\n//go:embed audio/pain/*.mp3\nvar painAudio embed.FS\n```\n\n### Play Modes\n\nTwo playback strategies in `playMode`:\n- `modeRandom`: Random file selection (pain, halo, custom modes)\n- `modeEscalation`: Intensity increases with slap frequency (sexy mode)\n\n### Slap Detection Flow\n\n1. `sensor.Run()` reads accelerometer in background goroutine\n2. Data shared via `shm.RingBuffer` (POSIX shared memory)\n3. `detector.New()` processes samples with vibration detection algorithms\n4. Events trigger audio playback with 750ms cooldown\n\n### Concurrency\n\n- `speakerMu sync.Mutex` protects speaker initialization\n- `slapTracker.mu sync.Mutex` protects slap scoring state\n- Audio playback runs in goroutines (`go playAudio(...)`)\n\n## Constants\n\nKey tuning parameters in `main.go`:\n\n| Constant | Value | Purpose |\n|----------|-------|---------|\n| `decayHalfLife` | 30s | How fast escalation fades |\n| `slapCooldown` | 750ms | Minimum time between audio plays |\n| `sensorPollInterval` | 10ms | Accelerometer polling rate |\n| `maxSampleBatch` | 200 | Max samples processed per tick |\n\n## Gotchas\n\n1. **Root required**: The app must run with `sudo` for IOKit HID access. The `run()` function checks `os.Geteuid() != 0`.\n\n2. **Apple Silicon only**: Only builds for `darwin/arm64`. Intel Macs are not supported.\n\n3. **Private dependency**: `github.com/taigrr/apple-silicon-accelerometer` requires `GOPRIVATE` setting and GitHub PAT for CI.\n\n4. **Single file**: All code is in `main.go`. When adding features, follow the existing pattern of types and functions in the same file.\n\n5. **Mutually exclusive modes**: `--sexy`, `--halo`, and `--custom` flags cannot be combined.\n\n6. **CGO disabled**: Builds use `CGO_ENABLED=0` despite targeting macOS.\n\n## Adding Audio\n\nTo add a new sound pack:\n\n1. Create directory under `audio/`\n2. Add MP3 files (numbered for escalation mode, any names for random)\n3. Add `//go:embed audio/newpack/*.mp3` variable\n4. Add flag and case in `run()` switch statement\n5. Create `soundPack` with appropriate `playMode`\n\n## Version\n\nVersion is injected via ldflags at build time:\n\n```go\nvar version = \"dev\"\n```\n\nGoReleaser sets `-X main.version={{.Version}}` during release builds.\n","category":"root","tokens":994}]}