project-viewerlisted
Install: claude install-skill AirMile/claude-config
# Viewer
Start, stop, or check the local backlog/dashboard server. Serves all project backlogs and dashboards at `http://localhost:9876`.
## Trigger
`/project-viewer` — optional argument: `stop`
## Platform
Detect platform:
- **Windows**: `$PSVersionTable` bestaat → PowerShell
- **macOS**: bash
Projects root (first match wins):
1. Env var `CLAUDE_PROJECTS_ROOT`
2. `<config_repo>/.claude/paths.local.yaml` → veld `projects_root` (geschreven door `/core-bootstrap`)
3. **Windows fallback**: `C:\Projects`
4. **macOS fallback**: `$HOME/projects`
`config_repo` = parent van de gederefereerde symlink/junction `~/.claude/skills`.
Server-script pad: `~/.claude/skills/shared/references/serve-backlog.js`
## Process
### PHASE 0: Check current status
**Windows (PowerShell):**
```powershell
try { Invoke-WebRequest -Uri http://localhost:9876/ -UseBasicParsing -TimeoutSec 2 | Out-Null; "RUNNING" } catch { "STOPPED" }
```
**macOS (bash):**
```bash
curl -s http://localhost:9876/ > /dev/null 2>&1 && echo RUNNING || echo STOPPED
```
Store result as `SERVER_RUNNING`.
### PHASE 1: Execute action
Resolve `$root` first (altijd, ook als server al draait):
_Windows:_
```powershell
function Resolve-ProjectsRoot {
if ($env:CLAUDE_PROJECTS_ROOT) { return $env:CLAUDE_PROJECTS_ROOT }
$skillsLink = Get-Item "$env:USERPROFILE\.claude\skills" -ErrorAction SilentlyContinue
if ($skillsLink -and $skillsLink.Target) {
$repo = Split-Path -Parent $skillsLink.Target
$yaml = Join-Path