Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions bin/adapters/claude.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash
# Claude adapter for squads
# Wraps the official Claude CLI

set -euo pipefail

MODEL="${1:-sonnet}"
PROMPT_FILE="${2:-}"
ADD_DIRS="${3:-}"

# Map short names to full model IDs
map_model() {
case "$1" in
opus) echo "opus" ;;
sonnet) echo "sonnet" ;;
haiku) echo "haiku" ;;
*) echo "$1" ;;
esac
}

MAPPED_MODEL=$(map_model "$MODEL")

# Build command
CMD="claude --print --model $MAPPED_MODEL"

# Add directories if specified
if [[ -n "$ADD_DIRS" ]]; then
IFS=',' read -ra DIRS <<< "$ADD_DIRS"
for dir in "${DIRS[@]}"; do
CMD="$CMD --add-dir $dir"
done
fi

# Execute with prompt from file or stdin
if [[ -n "$PROMPT_FILE" && -f "$PROMPT_FILE" ]]; then
$CMD < "$PROMPT_FILE"
else
$CMD
fi
60 changes: 60 additions & 0 deletions bin/agent-feedback
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/bin/bash
#
# agent-feedback - Submit feedback to an agent
#
# Usage:
# agent-feedback <squad> <agent> "feedback message"
# agent-feedback <squad> <agent> --read # Read current feedback
#

set -e

AGENTS_SQUADS_HOME="${AGENTS_SQUADS_HOME:-$HOME/agents-squads}"
MEMORY_DIR="$AGENTS_SQUADS_HOME/hq/.agents/memory"

if [ $# -lt 2 ]; then
echo "Usage: agent-feedback <squad> <agent> \"feedback message\""
echo " agent-feedback <squad> <agent> --read"
exit 1
fi

SQUAD="$1"
AGENT="$2"
FEEDBACK="${3:-}"

FEEDBACK_FILE="$MEMORY_DIR/$SQUAD/$AGENT/feedback.md"

# Ensure directory exists
mkdir -p "$(dirname "$FEEDBACK_FILE")"

# Create file if it doesn't exist
if [ ! -f "$FEEDBACK_FILE" ]; then
cat > "$FEEDBACK_FILE" << 'EOF'
# Agent Feedback

> Feedback from manager to improve agent behavior

## Feedback Log

EOF
fi

case "$FEEDBACK" in
--read|-r)
cat "$FEEDBACK_FILE"
;;
"")
echo "Error: Provide feedback message or --read flag"
exit 1
;;
*)
# Append feedback with timestamp
TIMESTAMP=$(date +"%Y-%m-%d %H:%M")
echo "" >> "$FEEDBACK_FILE"
echo "### $TIMESTAMP" >> "$FEEDBACK_FILE"
echo "" >> "$FEEDBACK_FILE"
echo "$FEEDBACK" >> "$FEEDBACK_FILE"
echo "" >> "$FEEDBACK_FILE"
echo "Feedback added for $SQUAD/$AGENT"
;;
esac
58 changes: 58 additions & 0 deletions bin/agent-output
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/bin/bash
#
# agent-output - Get output from an agent
#
# Usage:
# agent-output <squad> <agent> # Show latest output
# agent-output <squad> <agent> --list # List all outputs
# agent-output <squad> <agent> --tail # Follow latest output
#

set -e

AGENTS_SQUADS_HOME="${AGENTS_SQUADS_HOME:-$HOME/agents-squads}"
OUTPUT_DIR="$AGENTS_SQUADS_HOME/hq/.agents/outputs"

if [ $# -lt 2 ]; then
echo "Usage: agent-output <squad> <agent> [--list|--tail]"
echo ""
echo "Examples:"
echo " agent-output intelligence intel-lead"
echo " agent-output website web-lead --list"
echo " agent-output website design-eval --tail"
exit 1
fi

SQUAD="$1"
AGENT="$2"
FLAG="${3:-}"

# Find outputs
PATTERN="${SQUAD}-${AGENT}-*.md"
OUTPUTS=$(find "$OUTPUT_DIR" -name "$PATTERN" 2>/dev/null | sort -r)

if [ -z "$OUTPUTS" ]; then
echo "No outputs found for $SQUAD/$AGENT"
exit 1
fi

LATEST=$(echo "$OUTPUTS" | head -1)

case "$FLAG" in
--list|-l)
echo "Outputs for $SQUAD/$AGENT:"
echo "$OUTPUTS" | while read -r file; do
NAME=$(basename "$file")
TIME=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$file")
SIZE=$(wc -l < "$file" | tr -d ' ')
echo " $NAME ($TIME, ${SIZE} lines)"
done
;;
--tail|-t)
echo "Following: $LATEST"
tail -f "$LATEST"
;;
*)
cat "$LATEST"
;;
esac
109 changes: 109 additions & 0 deletions bin/agent-status
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
#!/bin/bash
#
# agent-status - Check status of agents
#
# Usage:
# agent-status # Show all recent activity
# agent-status <squad> # Show activity for a squad
# agent-status <squad> <agent> # Show activity for specific agent
#

set -e

AGENTS_SQUADS_HOME="${AGENTS_SQUADS_HOME:-$HOME/agents-squads}"
HQ_DIR="$AGENTS_SQUADS_HOME/hq"
OUTPUT_DIR="$HQ_DIR/.agents/outputs"
MEMORY_DIR="$HQ_DIR/.agents/memory"

# Colors
BLUE='\033[0;34m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

SQUAD="${1:-}"
AGENT="${2:-}"

echo -e "${BLUE}=== Agent Status ===${NC}"
echo ""

# Check for running agents (by PID files)
echo -e "${YELLOW}Running Agents:${NC}"
RUNNING=0
for pidfile in "$OUTPUT_DIR"/.*.pid; do
[ -f "$pidfile" ] || continue
PID=$(cat "$pidfile")
NAME=$(basename "$pidfile" .pid | sed 's/^\.//')
if ps -p "$PID" > /dev/null 2>&1; then
echo " - $NAME (PID: $PID)"
RUNNING=1
else
rm -f "$pidfile"
fi
done
[ $RUNNING -eq 0 ] && echo " (none)"
echo ""

# Recent outputs
echo -e "${YELLOW}Recent Outputs (last 24h):${NC}"
if [ -n "$SQUAD" ] && [ -n "$AGENT" ]; then
PATTERN="$OUTPUT_DIR/${SQUAD}-${AGENT}-*.md"
elif [ -n "$SQUAD" ]; then
PATTERN="$OUTPUT_DIR/${SQUAD}-*.md"
else
PATTERN="$OUTPUT_DIR/*.md"
fi

find $OUTPUT_DIR -name "*.md" -mtime -1 2>/dev/null | while read -r file; do
if [[ "$file" == $PATTERN ]] || [ -z "$SQUAD" ]; then
NAME=$(basename "$file" .md)
TIME=$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$file")
SIZE=$(wc -l < "$file" | tr -d ' ')
echo " - $NAME ($TIME, ${SIZE} lines)"
fi
done | head -10

if [ ! "$(find $OUTPUT_DIR -name "*.md" -mtime -1 2>/dev/null | head -1)" ]; then
echo " (none)"
fi
echo ""

# Memory state
echo -e "${YELLOW}Agent Memory:${NC}"
if [ -n "$SQUAD" ] && [ -n "$AGENT" ]; then
MEMPATH="$MEMORY_DIR/$SQUAD/$AGENT"
if [ -d "$MEMPATH" ]; then
echo " $SQUAD/$AGENT:"
for f in "$MEMPATH"/*.md; do
[ -f "$f" ] || continue
NAME=$(basename "$f")
TIME=$(stat -f "%Sm" -t "%m-%d %H:%M" "$f")
echo " - $NAME (updated $TIME)"
done
else
echo " (no memory for $SQUAD/$AGENT)"
fi
elif [ -n "$SQUAD" ]; then
if [ -d "$MEMORY_DIR/$SQUAD" ]; then
for agent_dir in "$MEMORY_DIR/$SQUAD"/*/; do
[ -d "$agent_dir" ] || continue
AGENT_NAME=$(basename "$agent_dir")
echo " $SQUAD/$AGENT_NAME:"
for f in "$agent_dir"*.md; do
[ -f "$f" ] || continue
NAME=$(basename "$f")
echo " - $NAME"
done
done
fi
else
for squad_dir in "$MEMORY_DIR"/*/; do
[ -d "$squad_dir" ] || continue
SQUAD_NAME=$(basename "$squad_dir")
for agent_dir in "$squad_dir"*/; do
[ -d "$agent_dir" ] || continue
AGENT_NAME=$(basename "$agent_dir")
echo " $SQUAD_NAME/$AGENT_NAME"
done
done
fi
25 changes: 25 additions & 0 deletions bin/db-connect
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash
# Connect to Cloud SQL database (no proxy needed)
#
# Usage: db-connect [psql args...]
# Example: db-connect -c "SELECT * FROM tenants"
# db-connect # interactive shell

set -e

DB_HOST="34.121.219.0"
DB_USER="squads"
DB_NAME="squads"
PROJECT="agents-squads-prod"

# Fetch password from Secret Manager
DB_PASS=$(gcloud secrets versions access latest --secret=database-password --project=$PROJECT 2>/dev/null)

if [ -z "$DB_PASS" ]; then
echo "Error: Could not fetch database password from Secret Manager"
echo "Make sure you have 'gcloud auth login' credentials"
exit 1
fi

# Connect with any additional args passed
PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" "$@"
Loading
Loading