Files
blackroad/bin/br-code-assistant
Alexa Amundson 78fbe80f2a Initial monorepo — everything BlackRoad in one place
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
2026-03-14 17:08:41 -05:00

420 lines
13 KiB
Bash
Executable File

#!/usr/bin/env bash
# ============================================================================
# BLACKROAD OS, INC. - PROPRIETARY AND CONFIDENTIAL
# Copyright (c) 2025-2026 BlackRoad OS, Inc. All Rights Reserved.
# ============================================================================
# BlackRoad Local Coding Assistant
# Ollama-powered coding environment integrated with BlackRoad infrastructure
set -eo pipefail
source "$HOME/.blackroad/config/nodes.sh" 2>/dev/null || true
VERSION="1.0.0"
OLLAMA_MODEL="${BR_CODE_MODEL:-qwen2.5-coder:7b}"
# Find Ollama (fleet discovery)
_find_ollama() {
if curl -sf --connect-timeout 1 "http://localhost:11434/api/tags" &>/dev/null; then
echo "http://localhost:11434"; return 0
fi
for node in cecilia lucidia alice; do
local ip="${NODE_IP[$node]:-}"
[[ -z "$ip" ]] && continue
if curl -sf --connect-timeout 2 "http://${ip}:11434/api/tags" &>/dev/null; then
echo "http://${ip}:11434"; return 0
fi
done
echo "http://localhost:11434"
}
OLLAMA_API=$(_find_ollama)
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Header
clear
cat <<'HEADER'
╔════════════════════════════════════════════════════════╗
║ 🦙 BlackRoad Local Coding Assistant v1.0.0 ║
║ Powered by Ollama + qwen2.5-coder ║
╚════════════════════════════════════════════════════════╝
HEADER
# Check if Ollama is running
check_ollama() {
if ! curl -s "$OLLAMA_API/api/tags" > /dev/null 2>&1; then
echo -e "${RED}${NC} Ollama is not running"
echo -e "${YELLOW}Start it with:${NC} ollama serve &"
exit 1
fi
echo -e "${GREEN}${NC} Ollama is running"
}
# Check if model is available
check_model() {
if ! ollama list 2>/dev/null | grep -q "$OLLAMA_MODEL"; then
echo -e "${YELLOW}${NC} Model $OLLAMA_MODEL not found"
read -p "Pull it now? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo -e "${CYAN}Pulling $OLLAMA_MODEL...${NC}"
ollama pull "$OLLAMA_MODEL"
else
exit 1
fi
fi
echo -e "${GREEN}${NC} Model $OLLAMA_MODEL is ready"
}
# Log to memory system if available
log_to_memory() {
local action="$1"
local details="$2"
if [ -f "$HOME/memory-system.sh" ]; then
"$HOME/memory-system.sh" log "$action" "br-code-assistant" "$details" "ai,coding,ollama" 2>/dev/null || true
fi
}
# Search codebase for existing solutions
search_codebase() {
local query="$1"
if [ -f "$HOME/blackroad-search-unified.py" ]; then
echo -e "${CYAN}Searching codebase for: $query${NC}"
python3 "$HOME/blackroad-search-unified.py" "$query" 2>/dev/null | head -20 || true
fi
}
# Main menu
show_menu() {
echo ""
echo -e "${BLUE}📋 Commands:${NC}"
echo " 1. 💬 Chat Mode - Interactive coding session"
echo " 2. 🔧 Task Mode - Execute specific coding task"
echo " 3. 🔍 Analyze - Analyze files/directories"
echo " 4. 🧪 Review - Code review mode"
echo " 5. 📚 BlackRoad OS Search - Search existing solutions"
echo " 6. 🤖 Aider Mode - Agentic pair programming (if installed)"
echo " 7. ⚙️ Settings - Configure model/options"
echo " 0. ← Exit"
echo ""
}
# Interactive chat mode
chat_mode() {
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 💬 CHAT MODE - Interactive Coding Session ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Type your coding question or task. Type 'exit' to return."
echo ""
log_to_memory "start_chat" "model=$OLLAMA_MODEL"
# System prompt for coding assistant
local SYSTEM_PROMPT='You are a local AI coding assistant running on Ollama.
You have full terminal access and can:
- read and write project files
- generate, modify, and explain code
- run tests and debugging instructions
- follow multi-step task instructions
Your goal is to help the user with real programming tasks.
CONSTRAINTS:
1. Do not ask for cloud APIs — run everything locally using Ollama CLI.
2. Only operate within the current project directory.
3. If tests exist, run them and report outcomes.
4. For refactors, explain before making changes.
5. If instructions are ambiguous, ask a clarifying question.
6. Safety first — avoid destructive actions unless explicitly confirmed.
COMMAND RULES:
- To create or modify files, output a diff patch.
- To run shell commands, wrap the command in backticks: `command`
- To show code examples, wrap them in proper language tags (```python, ```js, etc.)
Current project: '"$(pwd)"'
'
# Start interactive session
echo "$SYSTEM_PROMPT" | ollama run "$OLLAMA_MODEL" 2>/dev/null || echo -e "${RED}Failed to start chat${NC}"
}
# Task execution mode
task_mode() {
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 🔧 TASK MODE - Execute Coding Task ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
read -p "Describe your coding task: " TASK
if [ -z "$TASK" ]; then
echo -e "${RED}No task provided${NC}"
return
fi
echo -e "${CYAN}Searching blackroad os first...${NC}"
search_codebase "$TASK"
echo ""
echo -e "${CYAN}Executing task with $OLLAMA_MODEL...${NC}"
echo ""
local PROMPT="SYSTEM: You are a local coding assistant. Current directory: $(pwd)
USER TASK: $TASK
Provide:
1. Step-by-step plan
2. Code changes (as diffs if modifying existing files)
3. Commands to run
4. Testing instructions"
echo "$PROMPT" | ollama run "$OLLAMA_MODEL"
log_to_memory "execute_task" "task=$TASK"
}
# Analyze files/directories
analyze_mode() {
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 🔍 ANALYZE MODE - Code Analysis ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
read -p "Path to analyze (file or directory): " TARGET
if [ ! -e "$TARGET" ]; then
echo -e "${RED}Path does not exist: $TARGET${NC}"
return
fi
echo -e "${CYAN}Analyzing $TARGET...${NC}"
echo ""
local CONTENT=""
if [ -f "$TARGET" ]; then
CONTENT=$(cat "$TARGET")
else
CONTENT=$(find "$TARGET" -type f -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.go" 2>/dev/null | head -20 | xargs cat 2>/dev/null || echo "No code files found")
fi
local PROMPT="SYSTEM: You are a code analysis assistant.
TASK: Analyze the following code and provide:
1. Architecture overview
2. Key functions/components
3. Potential issues or improvements
4. Testing suggestions
CODE:
$CONTENT"
echo "$PROMPT" | ollama run "$OLLAMA_MODEL"
log_to_memory "analyze" "target=$TARGET"
}
# Code review mode
review_mode() {
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 🧪 REVIEW MODE - Code Review ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
read -p "File to review: " FILE
if [ ! -f "$FILE" ]; then
echo -e "${RED}File does not exist: $FILE${NC}"
return
fi
echo -e "${CYAN}Reviewing $FILE...${NC}"
echo ""
local CONTENT=$(cat "$FILE")
local PROMPT="SYSTEM: You are a code review assistant focused on quality.
TASK: Review the following code and identify:
1. Bugs or logic errors
2. Security vulnerabilities
3. Performance issues
4. Best practice violations
5. Suggestions for improvement
Be concise and actionable.
CODE:
$CONTENT"
echo "$PROMPT" | ollama run "$OLLAMA_MODEL"
log_to_memory "review" "file=$FILE"
}
# BlackRoad OS search
codebase_search_mode() {
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 📚 CODEBASE SEARCH - Find Existing Solutions ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
read -p "Search query: " QUERY
if [ -z "$QUERY" ]; then
echo -e "${RED}No query provided${NC}"
return
fi
search_codebase "$QUERY"
read -p "Press Enter to continue..."
}
# Aider mode (if installed)
aider_mode() {
if ! command -v aider &> /dev/null; then
echo -e "${YELLOW}${NC} Aider is not installed"
echo ""
echo "Install with: pip install aider-chat"
echo ""
read -p "Install now? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo -e "${CYAN}Installing aider-chat...${NC}"
pip3 install aider-chat
else
return
fi
fi
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 🤖 AIDER MODE - Agentic Pair Programming ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Starting Aider with Ollama model: $OLLAMA_MODEL"
echo ""
log_to_memory "start_aider" "model=$OLLAMA_MODEL"
# Configure Aider to use Ollama
export OLLAMA_API_BASE="$OLLAMA_API"
aider --model "ollama/$OLLAMA_MODEL"
}
# Settings
settings_mode() {
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ ⚙️ SETTINGS ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Current model: $OLLAMA_MODEL"
echo ""
echo "Available models:"
ollama list
echo ""
read -p "Change model? (leave blank to keep current): " NEW_MODEL
if [ -n "$NEW_MODEL" ]; then
export BR_CODE_MODEL="$NEW_MODEL"
echo -e "${GREEN}${NC} Model changed to $NEW_MODEL (for this session)"
echo "To make permanent, add to ~/.zshrc:"
echo " export BR_CODE_MODEL=\"$NEW_MODEL\""
fi
read -p "Press Enter to continue..."
}
# Main loop
main() {
check_ollama
check_model
while true; do
show_menu
read -p "Select option: " choice
case $choice in
1) chat_mode ;;
2) task_mode ;;
3) analyze_mode ;;
4) review_mode ;;
5) codebase_search_mode ;;
6) aider_mode ;;
7) settings_mode ;;
0)
echo -e "${GREEN}Goodbye!${NC}"
log_to_memory "exit" "session_end"
exit 0
;;
*)
echo -e "${RED}Invalid option${NC}"
sleep 1
;;
esac
done
}
# Check for direct invocation with arguments
if [ $# -gt 0 ]; then
case "$1" in
chat)
check_ollama
check_model
chat_mode
;;
task)
check_ollama
check_model
shift
TASK="$*"
task_mode
;;
analyze)
check_ollama
check_model
TARGET="$2"
analyze_mode
;;
review)
check_ollama
check_model
FILE="$2"
review_mode
;;
search)
shift
QUERY="$*"
search_codebase "$QUERY"
;;
aider)
check_ollama
check_model
aider_mode
;;
--help|-h)
echo "BlackRoad Local Coding Assistant"
echo ""
echo "Usage:"
echo " br-code-assistant Interactive menu"
echo " br-code-assistant chat Start chat mode"
echo " br-code-assistant task <description>"
echo " br-code-assistant analyze <path>"
echo " br-code-assistant review <file>"
echo " br-code-assistant search <query>"
echo " br-code-assistant aider Start Aider"
exit 0
;;
*)
echo -e "${RED}Unknown command: $1${NC}"
echo "Run 'br-code-assistant --help' for usage"
exit 1
;;
esac
else
main
fi