Files
blackroad/bin/br-palette
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

275 lines
9.4 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
br-palette
Interactive TUI palette viewer with arrow key navigation and live semantic preview.
Enhanced with BR shape grammar integration.
"""
import sys
import tty
import termios
RESET = "\x1b[0m"
CLEAR = "\x1b[2J\x1b[H"
BOLD = "\x1b[1m"
DIM = "\x1b[2m"
# Zone definitions from BR_COLOR_SPEC.md
ZONES = {
"OS_LAYER": (0, 15, "Core system primitives", ""),
"PERCEPTION": (16, 51, "Input, sensors, listeners", ""),
"EXECUTION": (52, 87, "Actions, mutations, writes", ""),
"MEMORY": (88, 123, "State, cache, persistence", ""),
"AUTONOMY": (124, 159, "Agents, decision, delegation", ""),
"TENSION": (160, 195, "Warnings, drift, uncertainty", ""),
"PARADOX": (196, 231, "Errors, contradiction, halt", ""),
"META": (232, 255, "Null, silence, void, escape", ""),
}
# Extended token definitions
TOKENS = {
0: "NULL", 1: "ERROR", 2: "SUCCESS", 3: "WARN", 4: "INFO", 5: "DEBUG",
6: "SYSCALL", 7: "NEUTRAL",
16: "RAW_SENSOR", 28: "VALID_INPUT", 40: "STREAM_LIVE",
64: "EXEC_HIGH", 76: "EXEC_ATOMIC", 202: "EXEC_FORCE",
88: "MEM_VOLATILE", 100: "MEM_PERSIST", 118: "MEM_ARCHIVE",
130: "AGENT_THINK", 136: "AGENT_EXEC", 154: "AGENT_META",
166: "WARN_MEMORY", 178: "WARN_DRIFT", 190: "WARN_DEGRADE",
196: "ERROR_FATAL", 208: "ERROR_DATA", 226: "ERROR_CASCADE",
232: "META_NULL", 244: "META_ESCAPE", 255: "META_BRIGHT",
}
# Canonical BR shape mapping
ZONE_SHAPES = {
range(0, 16): "", range(16, 52): "", range(52, 88): "",
range(88, 124): "", range(124, 160): "", range(160, 196): "",
range(196, 232): "", range(232, 256): "",
}
# Special semantic glyphs
SPECIAL_SHAPES = {
0: "", 1: "", 2: "", 3: "", 4: "",
196: "", 202: "", 226: "", 232: "", 255: "",
}
def get_zone_info(color):
"""Get zone name, description, and default shape for a color."""
for zone_name, (start, end, desc, shape) in ZONES.items():
if start <= color <= end:
return zone_name, desc, shape
return "UNKNOWN", "", "?"
def get_shape(color):
"""Get semantic shape glyph for a color."""
if color in SPECIAL_SHAPES:
return SPECIAL_SHAPES[color]
for color_range, shape in ZONE_SHAPES.items():
if color in color_range:
return shape
return "?"
def get_key():
"""Get single keypress."""
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(fd)
ch = sys.stdin.read(1)
if ch == '\x1b': # Escape sequence
ch2 = sys.stdin.read(1)
if ch2 == '[':
ch3 = sys.stdin.read(1)
return f'[{ch3}'
return ch
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
def render_palette(current_color, mode="full"):
"""Render full palette with current selection highlighted."""
print(CLEAR)
# Header with mode indicator
print("" * 78)
print(f"{BOLD}BR COLOR PALETTE{RESET}{DIM}Visual Programming Language{RESET}")
print("" * 78)
print("Controls: ↑↓←→ Navigate | Z: Zone | F: Full | S: Shape | Q: Quit | ?: Help")
print("" * 78)
if mode == "zone":
# Show only current zone
zone_name, _, _ = get_zone_info(current_color)
for zn, (start, end, desc, zone_shape) in ZONES.items():
if zn == zone_name:
print(f"\n{BOLD}{zone_name}{RESET} ({start}{end}): {desc}")
print(f"Zone shape: {zone_shape}\n")
for i in range(start, end + 1):
render_color_cell(i, current_color)
if (i - start + 1) % 6 == 0:
print()
print()
break
elif mode == "shape":
# Show all zones with shapes prominently
for zone_name, (start, end, desc, zone_shape) in ZONES.items():
in_zone = start <= current_color <= end
marker = "" if in_zone else " "
print(f"\n{marker}{BOLD if in_zone else ''}{zone_name:12}{RESET} {zone_shape} {desc}")
else:
# Full view
for zone_name, (start, end, desc, zone_shape) in ZONES.items():
in_zone = start <= current_color <= end
zone_display = f"{BOLD}{zone_name}{RESET}" if in_zone else zone_name
print(f"\n{zone_display} ({start}{end}): {desc} {DIM}[{zone_shape}]{RESET}")
print()
for i in range(start, end + 1):
render_color_cell(i, current_color)
if (i - start + 1) % 6 == 0:
print()
print()
# Enhanced current color detail panel
render_detail_panel(current_color)
def render_color_cell(color, current_color):
"""Render a single color cell."""
bg = f"\x1b[48;5;{color}m"
fg_color = 255 if color < 128 else 0
fg = f"\x1b[38;5;{fg_color}m"
# Highlight current selection
if color == current_color:
marker = ""
highlight = BOLD
else:
marker = " "
highlight = ""
shape = get_shape(color)
print(f"{marker}{highlight}{bg}{fg} {shape:^3} {RESET}", end=" ")
def render_detail_panel(current_color):
"""Render detailed semantic panel for current color."""
print("\n" + "" * 78)
zone, desc, zone_shape = get_zone_info(current_color)
token = TOKENS.get(current_color, f"COLOR_{current_color}")
shape = get_shape(current_color)
# Large color swatch
bg = f"\x1b[48;5;{current_color}m"
fg_color = 255 if current_color < 128 else 0
fg = f"\x1b[38;5;{fg_color}m"
print(f"{BOLD}CURRENT SELECTION{RESET}")
print(f"\n {bg}{fg} {shape} {current_color:>3} {RESET}\n")
# Semantic details
print(f" Color: {current_color}")
print(f" Token: {BOLD}{token}{RESET}")
print(f" Shape: {shape} {DIM}(zone default: {zone_shape}){RESET}")
print(f" Zone: {zone}")
print(f" Desc: {desc}")
# Show related colors if special
if current_color in SPECIAL_SHAPES:
print(f" {DIM}Special operator glyph{RESET}")
# Context examples
print(f"\n{DIM}Use in sequence: br-shape ... {current_color} ...{RESET}")
print("" * 78)
def show_help():
"""Show help screen."""
print(CLEAR)
print("" * 78)
print(f"{BOLD}BR COLOR PALETTE — HELP{RESET}")
print("" * 78)
print()
print(f"{BOLD}NAVIGATION{RESET}")
print(" ↑/↓ Move up/down by 6 (grid row)")
print(" ←/→ Move left/right by 1")
print(" PgUp/PgDn Move by 36 (large jump)")
print(" Home Jump to start (color 0)")
print(" End Jump to end (color 255)")
print()
print(f"{BOLD}VIEW MODES{RESET}")
print(" f Full palette view (default)")
print(" z Zone-only view (current zone)")
print(" s Shape reference view (all zones)")
print()
print(f"{BOLD}COMMANDS{RESET}")
print(" q Quit")
print(" ? Show this help")
print(" Enter Show detailed info")
print()
print(f"{BOLD}BR SHAPE GRAMMAR{RESET}")
print(" █ OS_LAYER Core system primitives")
print(" ▓ PERCEPTION Input, sensors, listeners")
print(" ▶ EXECUTION Actions, mutations, writes")
print(" ● MEMORY State, cache, persistence")
print(" ◆ AUTONOMY Agents, decision, delegation")
print(" ▲ TENSION Warnings, drift, uncertainty")
print(" ✖ PARADOX Errors, contradiction, halt")
print(" ◌ META Null, silence, void, escape")
print()
print(f"{DIM}Special glyphs: ∅ ✗ ✓ ⚠ ⚡ ★ ◉{RESET}")
print()
print("Press any key to return...")
print("" * 78)
get_key()
def main():
current = 0
mode = "full" # full, zone, shape
print("\x1b[?25l") # Hide cursor
try:
while True:
render_palette(current, mode=mode)
key = get_key()
if key == 'q' or key == 'Q':
break
elif key == '?':
show_help()
elif key == 'f' or key == 'F':
mode = "full"
elif key == 'z' or key == 'Z':
mode = "zone"
elif key == 's' or key == 'S':
mode = "shape"
elif key == '[A': # Up
current = max(0, current - 6)
elif key == '[B': # Down
current = min(255, current + 6)
elif key == '[C': # Right
current = min(255, current + 1)
elif key == '[D': # Left
current = max(0, current - 1)
elif key == '[5': # Page Up
current = max(0, current - 36)
elif key == '[6': # Page Down
current = min(255, current + 36)
elif key == '[H': # Home
current = 0
elif key == '[F': # End
current = 255
elif key == '\n': # Enter - show detail
pass # Already showing detail in panel
except KeyboardInterrupt:
pass
finally:
print(CLEAR)
print("\x1b[?25h") # Show cursor
print(f"{BOLD}BR Palette closed.{RESET}\n")
print(f"{DIM}Use 'br-shape <color>' for CLI queries{RESET}\n")
if __name__ == "__main__":
main()