#!/usr/bin/env bash # gstack-routing-config — read shared routing config for cross-runtime skill routing # Usage: gstack-routing-config [check|read] # # check: exits 0 if routing config exists, 1 if not # read: outputs routing rules as structured text # # Reads from ~/.gstack/routing.yaml (shared between gstack + OpenClaw). # Falls back to CLAUDE.md/AGENTS.md "## Skill routing" section. set -euo pipefail GSTACK_HOME="${GSTACK_HOME:-$HOME/.gstack}" ROUTING_FILE="$GSTACK_HOME/routing.yaml" CMD="${1:-check}" case "$CMD" in check) if [ -f "$ROUTING_FILE" ]; then echo "ROUTING_CONFIG: $ROUTING_FILE" exit 0 fi # Fallback: check CLAUDE.md or AGENTS.md for f in CLAUDE.md AGENTS.md; do if [ -f "$f" ] && grep -q "## Skill routing" "$f" 2>/dev/null; then echo "ROUTING_CONFIG: $f (embedded)" exit 0 fi done echo "NO_ROUTING_CONFIG" exit 1 ;; read) if [ -f "$ROUTING_FILE" ]; then cat "$ROUTING_FILE" exit 0 fi # Fallback: extract routing section from CLAUDE.md or AGENTS.md for f in CLAUDE.md AGENTS.md; do if [ -f "$f" ] && grep -q "## Skill routing" "$f" 2>/dev/null; then # Extract from "## Skill routing" to next "## " heading or EOF bun -e " const text = await Bun.file('$f').text(); const start = text.indexOf('## Skill routing'); if (start === -1) process.exit(1); const rest = text.slice(start); const end = rest.indexOf('\n## ', 1); console.log(end > 0 ? rest.slice(0, end).trim() : rest.trim()); " 2>/dev/null || true exit 0 fi done echo "NO_ROUTING_CONFIG" exit 1 ;; *) echo "Usage: gstack-routing-config [check|read]" >&2 exit 1 ;; esac