Build, run, test, and debug GrooveTech apps (Orchestrator, Pfizer, GMP, Media Server). Use gj commands - never construct xcodebuild commands manually.
Scanned 2/12/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
name: gj-tool
description: Build, run, test, and debug GrooveTech apps (Orchestrator, Pfizer, GMP, Media Server). Use gj commands - never construct xcodebuild commands manually.
allowed-tools: Bash, Read, Grep, Glob
---
# gj Tool Skill
**This skill is for GrooveTech Xcode projects. Use `gj` for all build/run/test operations.**
## Quick Reference
```bash
# Build & Run
gj run <app> # Build + run + stream logs
gj run --device <app> # Build + run on physical AVP device
gj run --ext <app> # Run with extension/AVPStreamKit logs
gj run --clean <app> # Clean build then run
gj build <app> # Build only (no launch)
gj launch <app> # Launch only (skip build)
# Logs & Debugging
gj logs <app> "pattern" # Search logs (use as assertions)
gj crash <app> # View latest crash log (.ips) - first 80 lines
gj crash <app> --full # Show complete crash log with full backtrace
gj crash <app> --list # List all crash logs
gj crash <app> --open # Open crash in Console.app
gj diagnose <app> # **USE THIS FIRST** - diagnose ANY crash/termination
gj diagnose <app> <log> # Diagnose specific log file
# UI Automation (Simulator only; NOT ms. Tap automation reliable on iOS simulator only.)
gj ui screenshot <app> # Capture screenshot
gj ui describe <app> # Dump accessibility tree
gj ui tap-button <app> "label" # Tap by accessibility label (iOS simulator only)
gj ui tap <app> x y # Tap at coordinates (iOS simulator only)
gj ui home <app> # Press Digital Crown (visionOS)
# Testing
gj test P0 # E2E connection tests
gj test --list # List available tests
# Management
gj stop <app> # Stop log streaming
gj clear <app> # Clear logs and screenshots
gj status # Show simulators, devices, streams
gj devices # List connected AVP devices
# Utilities
gj tui [app] # Interactive log viewer (TUI)
gj sessions [path] # CASS TUI for agent history
```
**Apps:** `orchestrator` (o), `pfizer` (p), `gmp` (g), `ms` (s), `all` (a)
---
## ⚠️ Known Limitations
### visionOS Tap Automation is Broken
`gj ui tap` and `gj ui tap-button` **do not work** on visionOS apps (Pfizer, GMP). The visionOS simulator reports incorrect accessibility frames (all elements at position 0,0).
**Working on visionOS:**
- `gj ui screenshot <app>` ✓
- `gj ui home <app>` ✓
- `gj run <app>` ✓
- `gj logs <app>` ✓
**Not working on visionOS:**
- `gj ui tap <app> x y` ✗
- `gj ui tap-button <app> "label"` ✗
**Workaround:** Manual testing in Simulator.app, or rely on log assertions.
See: `gj-tool/KNOWN_ISSUES.md` for full details.
### macOS Media Server UI Automation (Not Supported)
`gj ui ... ms` is **not supported** (UI commands are simulator-only). To trigger CloudSync, use the Media Server UI manually, then verify with `gj logs ms "CloudSync"`.
### Device Logging: OSLog Not Captured
When running on **physical devices** via `gj run --device <app>`, only `print()` statements appear in device logs. **OSLog entries are NOT captured** (they go to the unified logging system, not stdout).
**Workaround:** Add `print()` alongside OSLog for device-visible diagnostics:
```swift
log.info("Download speed: \(speed)MB/s")
print("📊 Download speed: \(speed)MB/s") // Visible via gj logs
```
**Simulator runs** capture both OSLog and print() normally.
---
## Testing Philosophy
**Prefer quick validation over full E2E tests during iteration.**
```
Need to verify something?
├── Quick check? → gj logs <app> "pattern"
├── Visual check? → gj ui screenshot <app>
├── Test interaction? → gj ui tap-button + gj logs (Orchestrator only)
├── Full validation? → gj test P0
└── Pre-commit? → gj test all
```
### Using Logs as Assertions
```bash
# ASSERT: Connection established (output should exist)
gj logs orchestrator "tcp_connection_established"
# ASSERT: No errors (output should be empty)
gj logs orchestrator "error"
```
### Debugging Crashes & Unexpected Terminations
**ALWAYS start with `gj diagnose`** - it queries system logs and identifies the crash type even when the app log ends abruptly.
```bash
# FIRST: Run diagnose to get crash evidence from system logs
gj diagnose <app> # Diagnoses most recent log
gj diagnose <app> <log> # Diagnose specific log file
# What diagnose shows:
# - CRASH CONFIRMED (AMFI/corpse evidence from system logs)
# - Crash type: fatal 309 = EXC_RESOURCE, EXC_BREAKPOINT, etc.
# - Rate-limit warnings (no .ips when too many crashes)
# - Errors before crash from app log
# - Related .ips crash reports
# If diagnose shows EXC_BREAKPOINT and there's an .ips file:
gj crash <app> --full # Full backtrace from .ips
# Search runtime logs for errors
gj logs <app> "error"
gj logs <app> "fatal"
```
**Common crash types:**
- `EXC_BREAKPOINT` → Code assertion/trap, .ips file has backtrace
- `EXC_RESOURCE (fatal 309)` → System killed for resource limits, often rate-limited (no .ips)
---
## Full Documentation
| Doc | Location | Contents |
|-----|----------|----------|
| **Comprehensive agent guide** | `gj-tool/docs/AGENT-INSTRUCTIONS.md` | Testing philosophy, accessibility labels, workflows |
| **Quick reference** | `~/.agent-config/docs/gj-tool.md` | Command reference |
| **UI automation** | `~/.agent-config/docs/ui-automation.md` | AXe integration, finding labels |
| **Known issues** | `gj-tool/KNOWN_ISSUES.md` | visionOS limitations |
**For detailed accessibility labels and testing workflows, read `docs/AGENT-INSTRUCTIONS.md` in the gj-tool repo.**
---
## If gj Not Found
```bash
cd "/Users/dalecarman/Groove Jones Dropbox/Dale Carman/Projects/dev/gj-tool"
./install.sh
gj version # Expected: 1.5.0
```
No comments yet. Be the first to comment!