# Claude Instructions for SecuBox OpenWrt ## Session Startup — Follow the Roadmap **Before starting any work, always read the project planning files to understand current priorities and context:** 1. `.claude/TODO.md` — Open tasks and backlog, ordered by priority 2. `.claude/WIP.md` — Active threads, next-up items, and blockers 3. `.claude/HISTORY.md` — Completed milestones with dates (gap analysis reference) 4. `.claude/context.md` — Module map, stack overview, and templates 5. `package/secubox/PUNK-EXPOSURE.md` — Architectural spec for exposure features 6. `.claude/FAQ-TROUBLESHOOTING.md` — **Consult before debugging** — resolved issues and known fixes for LXC cgroups, networking, HAProxy, mitmproxy, DNS **When the user says "continue" or "next"**, consult WIP.md "Next Up" and TODO.md "Open" to pick the next task. When completing work, update these files to keep them current. New features and fixes must be appended to HISTORY.md with the date. ## OpenWrt Shell Scripting Guidelines ### Process Detection - **Use `pgrep crowdsec` instead of `pgrep -x crowdsec`** - The `-x` flag requires an exact process name match which doesn't work reliably on OpenWrt/BusyBox - Same applies to other daemons: use `pgrep ` without `-x` ### Command Availability - `timeout` command is NOT available on OpenWrt by default - use alternatives or check with `command -v timeout` - `ss` command may not be available - use `netstat` or `/proc/net/tcp` as fallbacks - `sqlite3` may not be installed - provide fallback methods (e.g., delete database file instead of running SQL) ### JSON Parsing - **Use `jsonfilter` instead of `jq`** - jsonfilter is native to OpenWrt (part of libubox), jq is often not installed - Syntax examples: ```bash # Get a field value jsonfilter -i /path/to/file.json -e '@.field_name' # Get nested field jsonfilter -i /path/to/file.json -e '@.parent.child' # Get array length (count elements) jsonfilter -i /path/to/file.json -e '@[*]' | wc -l # Get array element jsonfilter -i /path/to/file.json -e '@[0]' ``` - Always check for empty results: `[ -z "$result" ] && result=0` ### Port Detection When checking if a port is listening, use this order of fallbacks: 1. `/proc/net/tcp` (always available) - ports are in hex (e.g., 8080 = 1F90) 2. `netstat -tln` (usually available) 3. `ss -tln` (may not be available) ### Logging - OpenWrt uses `logread` instead of traditional log files - Use `logread -l N` to get last N lines - CrowdSec writes to `/var/log/crowdsec.log` ## Build & Sync Workflow ### CRITICAL: Sync Local Feed Before Building - **ALWAYS sync the local-feed before building packages from edited source trees** - The build system uses `secubox-tools/local-feed/` NOT `package/secubox/` directly - If you edit files in `package/secubox//`, those changes won't be built unless synced **Before building after edits:** ```bash # Option 1: Sync specific package to local-feed rsync -av --delete package/secubox// secubox-tools/local-feed// # Option 2: Sync all SecuBox packages for pkg in package/secubox/*/; do name=$(basename "$pkg") rsync -av --delete "$pkg" "secubox-tools/local-feed/$name/" done # Then build ./secubox-tools/local-build.sh build ``` **Quick deploy without rebuild (for RPCD/shell scripts):** ```bash # Copy script directly to router for testing scp package/secubox//root/usr/libexec/rpcd/