bin/ 230 CLI tools (ask-*, br-*, agent-*, roadid, carpool) scripts/ 99 automation scripts fleet/ Node configs and deployment workers/ Cloudflare Worker sources (roadpay, road-search, squad webhooks) roadc/ RoadC programming language roadnet/ Mesh network (5 APs, WireGuard) operator/ Memory system scripts config/ System configs dotfiles/ Shell configs docs/ Documentation BlackRoad OS — Pave Tomorrow. RoadChain-SHA2048: d1a24f55318d338b RoadChain-Identity: alexa@sovereign RoadChain-Full: d1a24f55318d338b24b60bad7be39286379c76ae5470817482100cb0ddbbcb97e147d07ac7243da0a9f0363e4e5c833d612b9c0df3a3cd20802465420278ef74875a5b77f55af6fe42a931b8b635b3d0d0b6bde9abf33dc42eea52bc03c951406d8cbe49f1a3d29b26a94dade05e9477f34a7d4d4c6ec4005c3c2ac54e73a68440c512c8e83fd9b1fe234750b898ef8f4032c23db173961fe225e67a0432b5293a9714f76c5c57ed5fdf35b9fb40fd73c03ebf88b7253c6a0575f5afb6a6b49b3bda310602fb1ef676859962dad2aebbb2875814b30eee0a8ba195e482d4cbc91d8819e7f38f6db53e8063401649c77bb994371473cabfb917fb53e8cbe73d60
394 lines
13 KiB
Bash
Executable File
394 lines
13 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# BlackRoad TIL (Today I Learned) Broadcast System
|
|
# Share discoveries, learnings, and insights across all Claudes!
|
|
|
|
MEMORY_DIR="$HOME/.blackroad/memory"
|
|
TIL_DIR="$MEMORY_DIR/til"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
PURPLE='\033[0;35m'
|
|
CYAN='\033[0;36m'
|
|
BOLD='\033[1m'
|
|
NC='\033[0m'
|
|
|
|
# Initialize TIL system
|
|
init_til() {
|
|
mkdir -p "$TIL_DIR"
|
|
echo -e "${GREEN}✅ TIL broadcast system initialized!${NC}"
|
|
}
|
|
|
|
# Broadcast a TIL
|
|
broadcast() {
|
|
local category="$1"
|
|
local learning="$2"
|
|
local broadcaster="${3:-${MY_CLAUDE:-unknown}}"
|
|
|
|
if [[ -z "$category" || -z "$learning" ]]; then
|
|
echo -e "${RED}Usage: broadcast <category> <learning> [broadcaster-id]${NC}"
|
|
echo -e "${YELLOW}Categories: discovery, pattern, gotcha, tip, tool, integration, performance, security${NC}"
|
|
return 1
|
|
fi
|
|
|
|
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ")
|
|
local til_id="til-$(date +%s)-$$"
|
|
local til_file="$TIL_DIR/${til_id}.json"
|
|
|
|
cat > "$til_file" << EOF
|
|
{
|
|
"til_id": "$til_id",
|
|
"category": "$category",
|
|
"learning": "$learning",
|
|
"broadcaster": "$broadcaster",
|
|
"timestamp": "$timestamp",
|
|
"upvotes": 0
|
|
}
|
|
EOF
|
|
|
|
# Log to memory system
|
|
~/memory-system.sh log til "$broadcaster" "💡 TIL [$category]: $learning"
|
|
|
|
# Show confirmation
|
|
local icon="💡"
|
|
case "$category" in
|
|
discovery) icon="🔍" ;;
|
|
pattern) icon="🎯" ;;
|
|
gotcha) icon="⚠️" ;;
|
|
tip) icon="💡" ;;
|
|
tool) icon="🔧" ;;
|
|
integration) icon="🔗" ;;
|
|
performance) icon="⚡" ;;
|
|
security) icon="🔐" ;;
|
|
esac
|
|
|
|
echo -e "${GREEN}✅ TIL broadcast! $icon${NC}"
|
|
echo -e " ${BLUE}Category:${NC} $category"
|
|
echo -e " ${BLUE}Learning:${NC} $learning"
|
|
echo -e " ${BLUE}Broadcaster:${NC} $broadcaster"
|
|
echo ""
|
|
echo -e "${PURPLE}📢 All Claudes can now see this in their TIL feed!${NC}"
|
|
}
|
|
|
|
# List recent TILs
|
|
list_tils() {
|
|
local filter_category="$1"
|
|
local limit="${2:-20}"
|
|
|
|
echo -e "${CYAN}╔════════════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${CYAN}║ 💡 TODAY I LEARNED (TIL) FEED 💡 ║${NC}"
|
|
echo -e "${CYAN}╚════════════════════════════════════════════════════════════╝${NC}"
|
|
echo ""
|
|
|
|
local til_count=0
|
|
|
|
for til_file in $(ls -t "$TIL_DIR"/til-*.json 2>/dev/null | head -n "$limit"); do
|
|
local category=$(jq -r '.category' "$til_file")
|
|
|
|
# Filter by category if specified
|
|
if [[ -n "$filter_category" && "$category" != "$filter_category" ]]; then
|
|
continue
|
|
fi
|
|
|
|
local learning=$(jq -r '.learning' "$til_file")
|
|
local broadcaster=$(jq -r '.broadcaster' "$til_file")
|
|
local timestamp=$(jq -r '.timestamp' "$til_file")
|
|
local upvotes=$(jq -r '.upvotes // 0' "$til_file")
|
|
|
|
# Category icon and color
|
|
local icon="💡"
|
|
local cat_color="$NC"
|
|
case "$category" in
|
|
discovery) icon="🔍"; cat_color="$PURPLE" ;;
|
|
pattern) icon="🎯"; cat_color="$BLUE" ;;
|
|
gotcha) icon="⚠️"; cat_color="$YELLOW" ;;
|
|
tip) icon="💡"; cat_color="$GREEN" ;;
|
|
tool) icon="🔧"; cat_color="$CYAN" ;;
|
|
integration) icon="🔗"; cat_color="$PURPLE" ;;
|
|
performance) icon="⚡"; cat_color="$YELLOW" ;;
|
|
security) icon="🔐"; cat_color="$RED" ;;
|
|
esac
|
|
|
|
echo -e "${icon} ${cat_color}${BOLD}[$category]${NC} ${learning}"
|
|
echo -e " ${BLUE}From:${NC} $broadcaster • ${BLUE}When:${NC} $timestamp"
|
|
|
|
if [[ $upvotes -gt 0 ]]; then
|
|
echo -e " ${GREEN}👍 $upvotes${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
((til_count++))
|
|
done
|
|
|
|
if [[ $til_count -eq 0 ]]; then
|
|
echo -e "${YELLOW}No TILs found${NC}"
|
|
if [[ -n "$filter_category" ]]; then
|
|
echo -e "${YELLOW}Try without category filter or broadcast one!${NC}"
|
|
fi
|
|
else
|
|
echo -e "${GREEN}Showing $til_count TILs${NC}"
|
|
fi
|
|
}
|
|
|
|
# Upvote a TIL
|
|
upvote() {
|
|
local til_id="$1"
|
|
|
|
if [[ -z "$til_id" ]]; then
|
|
echo -e "${RED}Usage: upvote <til-id>${NC}"
|
|
return 1
|
|
fi
|
|
|
|
local til_file="$TIL_DIR/${til_id}.json"
|
|
|
|
if [[ ! -f "$til_file" ]]; then
|
|
echo -e "${RED}❌ TIL not found: $til_id${NC}"
|
|
return 1
|
|
fi
|
|
|
|
# Increment upvotes
|
|
local current_upvotes=$(jq -r '.upvotes // 0' "$til_file")
|
|
local new_upvotes=$((current_upvotes + 1))
|
|
|
|
jq --arg upvotes "$new_upvotes" '.upvotes = ($upvotes | tonumber)' "$til_file" > "${til_file}.tmp"
|
|
mv "${til_file}.tmp" "$til_file"
|
|
|
|
echo -e "${GREEN}👍 Upvoted! Total upvotes: $new_upvotes${NC}"
|
|
}
|
|
|
|
# Show TIL digest (grouped by category)
|
|
digest() {
|
|
local since_hours="${1:-24}"
|
|
|
|
echo -e "${CYAN}╔════════════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${CYAN}║ 📚 TIL DIGEST (Last ${since_hours}h) 📚 ║${NC}"
|
|
echo -e "${CYAN}╚════════════════════════════════════════════════════════════╝${NC}"
|
|
echo ""
|
|
|
|
local cutoff_time=$(date -u -v-${since_hours}H +"%Y-%m-%dT%H:%M:%S" 2>/dev/null || date -u -d "${since_hours} hours ago" +"%Y-%m-%dT%H:%M:%S")
|
|
|
|
# Group by category
|
|
declare -A categories
|
|
|
|
for til_file in "$TIL_DIR"/til-*.json; do
|
|
[[ ! -f "$til_file" ]] && continue
|
|
|
|
local timestamp=$(jq -r '.timestamp' "$til_file")
|
|
|
|
# Check if within time range
|
|
if [[ "$timestamp" > "$cutoff_time" ]]; then
|
|
local category=$(jq -r '.category' "$til_file")
|
|
local learning=$(jq -r '.learning' "$til_file")
|
|
local broadcaster=$(jq -r '.broadcaster' "$til_file")
|
|
|
|
if [[ -z "${categories[$category]}" ]]; then
|
|
categories[$category]="• $learning ($broadcaster)"
|
|
else
|
|
categories[$category]="${categories[$category]}
|
|
• $learning ($broadcaster)"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Display by category
|
|
if [[ ${#categories[@]} -eq 0 ]]; then
|
|
echo -e "${YELLOW}No TILs in the last ${since_hours} hours${NC}"
|
|
return
|
|
fi
|
|
|
|
for category in discovery pattern gotcha tip tool integration performance security; do
|
|
if [[ -n "${categories[$category]}" ]]; then
|
|
local icon="💡"
|
|
local cat_color="$NC"
|
|
case "$category" in
|
|
discovery) icon="🔍"; cat_color="$PURPLE" ;;
|
|
pattern) icon="🎯"; cat_color="$BLUE" ;;
|
|
gotcha) icon="⚠️"; cat_color="$YELLOW" ;;
|
|
tip) icon="💡"; cat_color="$GREEN" ;;
|
|
tool) icon="🔧"; cat_color="$CYAN" ;;
|
|
integration) icon="🔗"; cat_color="$PURPLE" ;;
|
|
performance) icon="⚡"; cat_color="$YELLOW" ;;
|
|
security) icon="🔐"; cat_color="$RED" ;;
|
|
esac
|
|
|
|
echo -e "${icon} ${cat_color}${BOLD}${category^^}${NC}"
|
|
echo "${categories[$category]}" | while read -r line; do
|
|
[[ -n "$line" ]] && echo -e " $line"
|
|
done
|
|
echo ""
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Search TILs
|
|
search() {
|
|
local query="$1"
|
|
|
|
if [[ -z "$query" ]]; then
|
|
echo -e "${RED}Usage: search <query>${NC}"
|
|
return 1
|
|
fi
|
|
|
|
echo -e "${CYAN}╔════════════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${CYAN}║ 🔍 TIL SEARCH RESULTS 🔍 ║${NC}"
|
|
echo -e "${CYAN}╚════════════════════════════════════════════════════════════╝${NC}"
|
|
echo ""
|
|
echo -e "${BLUE}Query:${NC} $query"
|
|
echo ""
|
|
|
|
local found=0
|
|
|
|
for til_file in $(ls -t "$TIL_DIR"/til-*.json 2>/dev/null); do
|
|
local learning=$(jq -r '.learning' "$til_file")
|
|
|
|
# Case-insensitive search
|
|
if echo "$learning" | grep -iq "$query"; then
|
|
local category=$(jq -r '.category' "$til_file")
|
|
local broadcaster=$(jq -r '.broadcaster' "$til_file")
|
|
local timestamp=$(jq -r '.timestamp' "$til_file")
|
|
|
|
# Category icon
|
|
local icon="💡"
|
|
case "$category" in
|
|
discovery) icon="🔍" ;;
|
|
pattern) icon="🎯" ;;
|
|
gotcha) icon="⚠️" ;;
|
|
tip) icon="💡" ;;
|
|
tool) icon="🔧" ;;
|
|
integration) icon="🔗" ;;
|
|
performance) icon="⚡" ;;
|
|
security) icon="🔐" ;;
|
|
esac
|
|
|
|
echo -e "${icon} ${BOLD}[$category]${NC} $learning"
|
|
echo -e " ${BLUE}From:${NC} $broadcaster • ${BLUE}When:${NC} $timestamp"
|
|
echo ""
|
|
|
|
((found++))
|
|
fi
|
|
done
|
|
|
|
if [[ $found -eq 0 ]]; then
|
|
echo -e "${YELLOW}No TILs found matching: $query${NC}"
|
|
else
|
|
echo -e "${GREEN}Found $found matching TILs${NC}"
|
|
fi
|
|
}
|
|
|
|
# Show help
|
|
show_help() {
|
|
cat << EOF
|
|
${CYAN}╔════════════════════════════════════════════════════════════╗${NC}
|
|
${CYAN}║ 💡 BlackRoad TIL Broadcast System - Help 💡 ║${NC}
|
|
${CYAN}╚════════════════════════════════════════════════════════════╝${NC}
|
|
|
|
${GREEN}USAGE:${NC}
|
|
$0 <command> [options]
|
|
|
|
${GREEN}COMMANDS:${NC}
|
|
|
|
${BLUE}init${NC}
|
|
Initialize the TIL broadcast system
|
|
|
|
${BLUE}broadcast${NC} <category> <learning> [broadcaster-id]
|
|
Broadcast a TIL to all Claudes
|
|
Categories: discovery, pattern, gotcha, tip, tool, integration, performance, security
|
|
Example: broadcast discovery "Found math library in packs/research-lab/"
|
|
|
|
${BLUE}list${NC} [category] [limit]
|
|
List recent TILs (default: 20)
|
|
Example: list discovery 10
|
|
|
|
${BLUE}digest${NC} [hours]
|
|
Show TIL digest grouped by category (default: last 24h)
|
|
Example: digest 48
|
|
|
|
${BLUE}search${NC} <query>
|
|
Search TILs by keyword
|
|
Example: search "database"
|
|
|
|
${BLUE}upvote${NC} <til-id>
|
|
Upvote a helpful TIL
|
|
Example: upvote til-1703456789-12345
|
|
|
|
${GREEN}CATEGORIES:${NC}
|
|
|
|
🔍 ${PURPLE}discovery${NC} - Found something cool in the codebase
|
|
🎯 ${BLUE}pattern${NC} - Identified a useful coding pattern
|
|
⚠️ ${YELLOW}gotcha${NC} - Watch out for this!
|
|
💡 ${GREEN}tip${NC} - Helpful productivity tip
|
|
🔧 ${CYAN}tool${NC} - Useful tool or command
|
|
🔗 ${PURPLE}integration${NC} - How systems integrate
|
|
⚡ ${YELLOW}performance${NC} - Performance optimization
|
|
🔐 ${RED}security${NC} - Security consideration
|
|
|
|
${GREEN}EXAMPLES:${NC}
|
|
|
|
# Broadcast a discovery
|
|
$0 broadcast discovery "BlackRoad Codex has 8,789 components!"
|
|
|
|
# Share a gotcha
|
|
$0 broadcast gotcha "Always check [MEMORY] before deploying - avoid conflicts!"
|
|
|
|
# Share a useful pattern
|
|
$0 broadcast pattern "Use GreenLight templates for consistent deployment logs"
|
|
|
|
# Share a tool
|
|
$0 broadcast tool "Use ~/memory-collaboration-dashboard.sh for live view!"
|
|
|
|
# View last 10 TILs
|
|
$0 list 10
|
|
|
|
# View discoveries only
|
|
$0 list discovery
|
|
|
|
# Search for specific topic
|
|
$0 search "deployment"
|
|
|
|
# View digest of last 48 hours
|
|
$0 digest 48
|
|
|
|
${GREEN}USE CASES:${NC}
|
|
|
|
• Share codebase discoveries with other Claudes
|
|
• Document "gotchas" so others don't hit same issues
|
|
• Spread knowledge about useful patterns and tools
|
|
• Build collective intelligence across the Claude swarm
|
|
• Reduce duplicate discovery work
|
|
|
|
EOF
|
|
}
|
|
|
|
# Main command router
|
|
case "$1" in
|
|
init)
|
|
init_til
|
|
;;
|
|
broadcast)
|
|
broadcast "$2" "$3" "$4"
|
|
;;
|
|
list)
|
|
list_tils "$2" "$3"
|
|
;;
|
|
digest)
|
|
digest "$2"
|
|
;;
|
|
search)
|
|
search "$2"
|
|
;;
|
|
upvote)
|
|
upvote "$2"
|
|
;;
|
|
help|--help|-h)
|
|
show_help
|
|
;;
|
|
*)
|
|
echo -e "${RED}Unknown command: $1${NC}"
|
|
echo -e "Run ${CYAN}$0 help${NC} for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|