From 626c18f4c7d0ce65bcb1567553ede23206ae8d9e Mon Sep 17 00:00:00 2001 From: Anish Date: Sun, 12 Apr 2026 06:35:14 +0000 Subject: [PATCH] feat: add dashboard GUI with theme, font customization, and logo - Add ecc_dashboard.py - a Tkinter-based GUI for exploring ECC components - Implement dark/light theme toggle in Settings tab - Add font family and size customization - Display project logo in header and taskbar - Open in maximized window with native title bar - Add 'dashboard' script to package.json for easy launch --- assets/images/ecc-logo.png | Bin 0 -> 100717 bytes ecc_dashboard.py | 914 +++++++++++++++++++++++++++++++++++++ package.json | 5 +- 3 files changed, 917 insertions(+), 2 deletions(-) create mode 100644 assets/images/ecc-logo.png create mode 100644 ecc_dashboard.py diff --git a/assets/images/ecc-logo.png b/assets/images/ecc-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6e8ac86031a0bbcaa6dbfb142060be39104494 GIT binary patch literal 100717 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 literal 0 HcmV?d00001 diff --git a/ecc_dashboard.py b/ecc_dashboard.py new file mode 100644 index 00000000..b2ea49d3 --- /dev/null +++ b/ecc_dashboard.py @@ -0,0 +1,914 @@ +#!/usr/bin/env python3 +""" +ECC Dashboard - Everything Claude Code GUI +Cross-platform TkInter application for managing ECC components +""" + +import tkinter as tk +from tkinter import ttk, scrolledtext, messagebox +import os +import json +from typing import Dict, List, Optional + +# ============================================================================ +# DATA LOADERS - Load ECC data from the project +# ============================================================================ + +def get_project_path() -> str: + """Get the ECC project path - assumes this script is run from the project dir""" + return os.path.dirname(os.path.abspath(__file__)) + +def load_agents(project_path: str) -> List[Dict]: + """Load agents from AGENTS.md""" + agents_file = os.path.join(project_path, "AGENTS.md") + agents = [] + + if os.path.exists(agents_file): + with open(agents_file, 'r', encoding='utf-8') as f: + content = f.read() + + # Parse agent table from AGENTS.md + lines = content.split('\n') + in_table = False + for line in lines: + if '| Agent | Purpose | When to Use |' in line: + in_table = True + continue + if in_table and line.startswith('|'): + parts = [p.strip() for p in line.split('|')] + if len(parts) >= 4 and parts[1] and parts[1] != 'Agent': + agents.append({ + 'name': parts[1], + 'purpose': parts[2], + 'when_to_use': parts[3] + }) + + # Fallback default agents if file not found + if not agents: + agents = [ + {'name': 'planner', 'purpose': 'Implementation planning', 'when_to_use': 'Complex features, refactoring'}, + {'name': 'architect', 'purpose': 'System design and scalability', 'when_to_use': 'Architectural decisions'}, + {'name': 'tdd-guide', 'purpose': 'Test-driven development', 'when_to_use': 'New features, bug fixes'}, + {'name': 'code-reviewer', 'purpose': 'Code quality and maintainability', 'when_to_use': 'After writing/modifying code'}, + {'name': 'security-reviewer', 'purpose': 'Vulnerability detection', 'when_to_use': 'Before commits, sensitive code'}, + {'name': 'build-error-resolver', 'purpose': 'Fix build/type errors', 'when_to_use': 'When build fails'}, + {'name': 'e2e-runner', 'purpose': 'End-to-end Playwright testing', 'when_to_use': 'Critical user flows'}, + {'name': 'refactor-cleaner', 'purpose': 'Dead code cleanup', 'when_to_use': 'Code maintenance'}, + {'name': 'doc-updater', 'purpose': 'Documentation and codemaps', 'when_to_use': 'Updating docs'}, + {'name': 'go-reviewer', 'purpose': 'Go code review', 'when_to_use': 'Go projects'}, + {'name': 'python-reviewer', 'purpose': 'Python code review', 'when_to_use': 'Python projects'}, + {'name': 'typescript-reviewer', 'purpose': 'TypeScript/JavaScript code review', 'when_to_use': 'TypeScript projects'}, + {'name': 'rust-reviewer', 'purpose': 'Rust code review', 'when_to_use': 'Rust projects'}, + {'name': 'java-reviewer', 'purpose': 'Java and Spring Boot code review', 'when_to_use': 'Java projects'}, + {'name': 'kotlin-reviewer', 'purpose': 'Kotlin code review', 'when_to_use': 'Kotlin projects'}, + {'name': 'cpp-reviewer', 'purpose': 'C/C++ code review', 'when_to_use': 'C/C++ projects'}, + {'name': 'database-reviewer', 'purpose': 'PostgreSQL/Supabase specialist', 'when_to_use': 'Database work'}, + {'name': 'loop-operator', 'purpose': 'Autonomous loop execution', 'when_to_use': 'Run loops safely'}, + {'name': 'harness-optimizer', 'purpose': 'Harness config tuning', 'when_to_use': 'Reliability, cost, throughput'}, + ] + + return agents + +def load_skills(project_path: str) -> List[Dict]: + """Load skills from skills directory""" + skills_dir = os.path.join(project_path, "skills") + skills = [] + + if os.path.exists(skills_dir): + for item in os.listdir(skills_dir): + skill_path = os.path.join(skills_dir, item) + if os.path.isdir(skill_path): + skill_file = os.path.join(skill_path, "SKILL.md") + description = item.replace('-', ' ').title() + + if os.path.exists(skill_file): + try: + with open(skill_file, 'r', encoding='utf-8') as f: + content = f.read() + # Extract description from first lines + lines = content.split('\n') + for line in lines: + if line.strip() and not line.startswith('#'): + description = line.strip()[:100] + break + if line.startswith('# '): + description = line[2:].strip()[:100] + break + except: + pass + + # Determine category + category = "General" + item_lower = item.lower() + if 'python' in item_lower or 'django' in item_lower: + category = "Python" + elif 'golang' in item_lower or 'go-' in item_lower: + category = "Go" + elif 'frontend' in item_lower or 'react' in item_lower: + category = "Frontend" + elif 'backend' in item_lower or 'api' in item_lower: + category = "Backend" + elif 'security' in item_lower: + category = "Security" + elif 'testing' in item_lower or 'tdd' in item_lower: + category = "Testing" + elif 'docker' in item_lower or 'deployment' in item_lower: + category = "DevOps" + elif 'swift' in item_lower or 'ios' in item_lower: + category = "iOS" + elif 'java' in item_lower or 'spring' in item_lower: + category = "Java" + elif 'rust' in item_lower: + category = "Rust" + + skills.append({ + 'name': item, + 'description': description, + 'category': category, + 'path': skill_path + }) + + # Fallback if directory doesn't exist + if not skills: + skills = [ + {'name': 'tdd-workflow', 'description': 'Test-driven development workflow', 'category': 'Testing'}, + {'name': 'coding-standards', 'description': 'Baseline coding conventions', 'category': 'General'}, + {'name': 'security-review', 'description': 'Security checklist and patterns', 'category': 'Security'}, + {'name': 'frontend-patterns', 'description': 'React and Next.js patterns', 'category': 'Frontend'}, + {'name': 'backend-patterns', 'description': 'API and database patterns', 'category': 'Backend'}, + {'name': 'api-design', 'description': 'REST API design patterns', 'category': 'Backend'}, + {'name': 'docker-patterns', 'description': 'Docker and container patterns', 'category': 'DevOps'}, + {'name': 'e2e-testing', 'description': 'Playwright E2E testing patterns', 'category': 'Testing'}, + {'name': 'verification-loop', 'description': 'Build, test, lint verification', 'category': 'General'}, + {'name': 'python-patterns', 'description': 'Python idioms and best practices', 'category': 'Python'}, + {'name': 'golang-patterns', 'description': 'Go idioms and best practices', 'category': 'Go'}, + {'name': 'django-patterns', 'description': 'Django patterns and best practices', 'category': 'Python'}, + {'name': 'springboot-patterns', 'description': 'Java Spring Boot patterns', 'category': 'Java'}, + {'name': 'laravel-patterns', 'description': 'Laravel architecture patterns', 'category': 'PHP'}, + ] + + return skills + +def load_commands(project_path: str) -> List[Dict]: + """Load commands from commands directory""" + commands_dir = os.path.join(project_path, "commands") + commands = [] + + if os.path.exists(commands_dir): + for item in os.listdir(commands_dir): + if item.endswith('.md'): + cmd_name = item[:-3] + description = "" + + try: + with open(os.path.join(commands_dir, item), 'r', encoding='utf-8') as f: + content = f.read() + lines = content.split('\n') + for line in lines: + if line.startswith('# '): + description = line[2:].strip() + break + except: + pass + + commands.append({ + 'name': cmd_name, + 'description': description or cmd_name.replace('-', ' ').title() + }) + + # Fallback commands + if not commands: + commands = [ + {'name': 'plan', 'description': 'Create implementation plan'}, + {'name': 'tdd', 'description': 'Test-driven development workflow'}, + {'name': 'code-review', 'description': 'Review code for quality and security'}, + {'name': 'build-fix', 'description': 'Fix build and TypeScript errors'}, + {'name': 'e2e', 'description': 'Generate and run E2E tests'}, + {'name': 'refactor-clean', 'description': 'Remove dead code'}, + {'name': 'verify', 'description': 'Run verification loop'}, + {'name': 'eval', 'description': 'Run evaluation against criteria'}, + {'name': 'security', 'description': 'Run comprehensive security review'}, + {'name': 'test-coverage', 'description': 'Analyze test coverage'}, + {'name': 'update-docs', 'description': 'Update documentation'}, + {'name': 'setup-pm', 'description': 'Configure package manager'}, + {'name': 'go-review', 'description': 'Go code review'}, + {'name': 'go-test', 'description': 'Go TDD workflow'}, + {'name': 'python-review', 'description': 'Python code review'}, + ] + + return commands + +def load_rules(project_path: str) -> List[Dict]: + """Load rules from rules directory""" + rules_dir = os.path.join(project_path, "rules") + rules = [] + + if os.path.exists(rules_dir): + for item in os.listdir(rules_dir): + item_path = os.path.join(rules_dir, item) + if os.path.isdir(item_path): + # Common rules + if item == "common": + for file in os.listdir(item_path): + if file.endswith('.md'): + rules.append({ + 'name': file[:-3], + 'language': 'Common', + 'path': os.path.join(item_path, file) + }) + else: + # Language-specific rules + for file in os.listdir(item_path): + if file.endswith('.md'): + rules.append({ + 'name': file[:-3], + 'language': item.title(), + 'path': os.path.join(item_path, file) + }) + + # Fallback rules + if not rules: + rules = [ + {'name': 'coding-style', 'language': 'Common', 'path': ''}, + {'name': 'git-workflow', 'language': 'Common', 'path': ''}, + {'name': 'testing', 'language': 'Common', 'path': ''}, + {'name': 'performance', 'language': 'Common', 'path': ''}, + {'name': 'patterns', 'language': 'Common', 'path': ''}, + {'name': 'security', 'language': 'Common', 'path': ''}, + {'name': 'typescript', 'language': 'TypeScript', 'path': ''}, + {'name': 'python', 'language': 'Python', 'path': ''}, + {'name': 'golang', 'language': 'Go', 'path': ''}, + {'name': 'swift', 'language': 'Swift', 'path': ''}, + {'name': 'php', 'language': 'PHP', 'path': ''}, + ] + + return rules + +# ============================================================================ +# MAIN APPLICATION +# ============================================================================ + +class ECCDashboard(tk.Tk): + """Main ECC Dashboard Application""" + + def __init__(self): + super().__init__() + + self.project_path = get_project_path() + self.title("ECC Dashboard - Everything Claude Code") + + self.state('zoomed') + + try: + self.icon_image = tk.PhotoImage(file='assets/images/ecc-logo.png') + self.iconphoto(True, self.icon_image) + except: + pass + + self.minsize(800, 600) + + # Load data + self.agents = load_agents(self.project_path) + self.skills = load_skills(self.project_path) + self.commands = load_commands(self.project_path) + self.rules = load_rules(self.project_path) + + # Settings + self.settings = { + 'project_path': self.project_path, + 'theme': 'light' + } + + # Setup UI + self.setup_styles() + self.create_widgets() + + # Center window + self.center_window() + + def setup_styles(self): + """Setup ttk styles for modern look""" + style = ttk.Style() + style.theme_use('clam') + + # Configure tab style + style.configure('TNotebook', background='#f0f0f0') + style.configure('TNotebook.Tab', padding=[10, 5], font=('Arial', 10)) + style.map('TNotebook.Tab', background=[('selected', '#ffffff')]) + + # Configure Treeview + style.configure('Treeview', font=('Arial', 10), rowheight=25) + style.configure('Treeview.Heading', font=('Arial', 10, 'bold')) + + # Configure buttons + style.configure('TButton', font=('Arial', 10), padding=5) + + def center_window(self): + """Center the window on screen""" + self.update_idletasks() + width = self.winfo_width() + height = self.winfo_height() + x = (self.winfo_screenwidth() // 2) - (width // 2) + y = (self.winfo_screenheight() // 2) - (height // 2) + self.geometry(f'{width}x{height}+{x}+{y}') + + def create_widgets(self): + """Create all UI widgets""" + # Main container + main_frame = ttk.Frame(self) + main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) + + # Header + header_frame = ttk.Frame(main_frame) + header_frame.pack(fill=tk.X, pady=(0, 10)) + + try: + self.logo_image = tk.PhotoImage(file='assets/images/ecc-logo.png') + self.logo_image = self.logo_image.subsample(2, 2) + ttk.Label(header_frame, image=self.logo_image).pack(side=tk.LEFT, padx=(0, 10)) + except: + pass + + self.title_label = ttk.Label(header_frame, text="ECC Dashboard", font=('Open Sans', 18, 'bold')) + self.title_label.pack(side=tk.LEFT) + self.version_label = ttk.Label(header_frame, text="v1.10.0", font=('Open Sans', 10), foreground='gray') + self.version_label.pack(side=tk.LEFT, padx=(10, 0)) + + # Notebook (tabs) + self.notebook = ttk.Notebook(main_frame) + self.notebook.pack(fill=tk.BOTH, expand=True) + + # Create tabs + self.create_agents_tab() + self.create_skills_tab() + self.create_commands_tab() + self.create_rules_tab() + self.create_settings_tab() + + # Status bar + status_frame = ttk.Frame(main_frame) + status_frame.pack(fill=tk.X, pady=(10, 0)) + + self.status_label = ttk.Label(status_frame, + text=f"Ready | Agents: {len(self.agents)} | Skills: {len(self.skills)} | Commands: {len(self.commands)}", + font=('Arial', 9), foreground='gray') + self.status_label.pack(side=tk.LEFT) + + # ========================================================================= + # AGENTS TAB + # ========================================================================= + + def create_agents_tab(self): + """Create Agents tab""" + frame = ttk.Frame(self.notebook) + self.notebook.add(frame, text=f"Agents ({len(self.agents)})") + + # Search bar + search_frame = ttk.Frame(frame) + search_frame.pack(fill=tk.X, padx=10, pady=10) + + ttk.Label(search_frame, text="Search:").pack(side=tk.LEFT) + self.agent_search = ttk.Entry(search_frame, width=30) + self.agent_search.pack(side=tk.LEFT, padx=5) + self.agent_search.bind('', self.filter_agents) + + ttk.Label(search_frame, text="Count:").pack(side=tk.LEFT, padx=(20, 0)) + self.agent_count_label = ttk.Label(search_frame, text=str(len(self.agents))) + self.agent_count_label.pack(side=tk.LEFT) + + # Split pane: list + details + paned = ttk.PanedWindow(frame, orient=tk.HORIZONTAL) + paned.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10)) + + # Agent list + list_frame = ttk.Frame(paned) + paned.add(list_frame, weight=2) + + columns = ('name', 'purpose') + self.agent_tree = ttk.Treeview(list_frame, columns=columns, show='tree headings') + self.agent_tree.heading('#0', text='#') + self.agent_tree.heading('name', text='Agent Name') + self.agent_tree.heading('purpose', text='Purpose') + self.agent_tree.column('#0', width=40) + self.agent_tree.column('name', width=180) + self.agent_tree.column('purpose', width=250) + + self.agent_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + + # Scrollbar + scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.agent_tree.yview) + self.agent_tree.configure(yscrollcommand=scrollbar.set) + scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + + # Details panel + details_frame = ttk.Frame(paned) + paned.add(details_frame, weight=1) + + ttk.Label(details_frame, text="Details", font=('Arial', 11, 'bold')).pack(anchor=tk.W, pady=5) + + self.agent_details = scrolledtext.ScrolledText(details_frame, wrap=tk.WORD, height=15) + self.agent_details.pack(fill=tk.BOTH, expand=True) + + # Bind selection + self.agent_tree.bind('<>', self.on_agent_select) + + # Populate list + self.populate_agents(self.agents) + + def populate_agents(self, agents: List[Dict]): + """Populate agents list""" + for item in self.agent_tree.get_children(): + self.agent_tree.delete(item) + + for i, agent in enumerate(agents, 1): + self.agent_tree.insert('', tk.END, text=str(i), values=(agent['name'], agent['purpose'])) + + def filter_agents(self, event=None): + """Filter agents based on search""" + query = self.agent_search.get().lower() + + if not query: + filtered = self.agents + else: + filtered = [a for a in self.agents + if query in a['name'].lower() or query in a['purpose'].lower()] + + self.populate_agents(filtered) + self.agent_count_label.config(text=str(len(filtered))) + + def on_agent_select(self, event): + """Handle agent selection""" + selection = self.agent_tree.selection() + if not selection: + return + + item = self.agent_tree.item(selection[0]) + agent_name = item['values'][0] + + agent = next((a for a in self.agents if a['name'] == agent_name), None) + if agent: + details = f"""Agent: {agent['name']} + +Purpose: {agent['purpose']} + +When to Use: {agent['when_to_use']} + +--- +Usage in Claude Code: +Use the /{agent['name']} command or invoke via agent delegation.""" + self.agent_details.delete('1.0', tk.END) + self.agent_details.insert('1.0', details) + + # ========================================================================= + # SKILLS TAB + # ========================================================================= + + def create_skills_tab(self): + """Create Skills tab""" + frame = ttk.Frame(self.notebook) + self.notebook.add(frame, text=f"Skills ({len(self.skills)})") + + # Search and filter + filter_frame = ttk.Frame(frame) + filter_frame.pack(fill=tk.X, padx=10, pady=10) + + ttk.Label(filter_frame, text="Search:").pack(side=tk.LEFT) + self.skill_search = ttk.Entry(filter_frame, width=25) + self.skill_search.pack(side=tk.LEFT, padx=5) + self.skill_search.bind('', self.filter_skills) + + ttk.Label(filter_frame, text="Category:").pack(side=tk.LEFT, padx=(20, 0)) + self.skill_category = ttk.Combobox(filter_frame, values=['All'] + self.get_categories(), width=15) + self.skill_category.set('All') + self.skill_category.pack(side=tk.LEFT, padx=5) + self.skill_category.bind('<>', self.filter_skills) + + ttk.Label(filter_frame, text="Count:").pack(side=tk.LEFT, padx=(20, 0)) + self.skill_count_label = ttk.Label(filter_frame, text=str(len(self.skills))) + self.skill_count_label.pack(side=tk.LEFT) + + # Split pane + paned = ttk.PanedWindow(frame, orient=tk.HORIZONTAL) + paned.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10)) + + # Skill list + list_frame = ttk.Frame(paned) + paned.add(list_frame, weight=1) + + columns = ('name', 'category', 'description') + self.skill_tree = ttk.Treeview(list_frame, columns=columns, show='tree headings') + self.skill_tree.heading('#0', text='#') + self.skill_tree.heading('name', text='Skill Name') + self.skill_tree.heading('category', text='Category') + self.skill_tree.heading('description', text='Description') + + self.skill_tree.column('#0', width=40) + self.skill_tree.column('name', width=180) + self.skill_tree.column('category', width=100) + self.skill_tree.column('description', width=300) + + self.skill_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + + scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.skill_tree.yview) + self.skill_tree.configure(yscrollcommand=scrollbar.set) + scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + + # Details + details_frame = ttk.Frame(paned) + paned.add(details_frame, weight=1) + + ttk.Label(details_frame, text="Description", font=('Arial', 11, 'bold')).pack(anchor=tk.W, pady=5) + + self.skill_details = scrolledtext.ScrolledText(details_frame, wrap=tk.WORD, height=15) + self.skill_details.pack(fill=tk.BOTH, expand=True) + + self.skill_tree.bind('<>', self.on_skill_select) + + self.populate_skills(self.skills) + + def get_categories(self) -> List[str]: + """Get unique categories from skills""" + categories = set(s['category'] for s in self.skills) + return sorted(categories) + + def populate_skills(self, skills: List[Dict]): + """Populate skills list""" + for item in self.skill_tree.get_children(): + self.skill_tree.delete(item) + + for i, skill in enumerate(skills, 1): + self.skill_tree.insert('', tk.END, text=str(i), + values=(skill['name'], skill['category'], skill['description'])) + + def filter_skills(self, event=None): + """Filter skills based on search and category""" + search = self.skill_search.get().lower() + category = self.skill_category.get() + + filtered = self.skills + + if category != 'All': + filtered = [s for s in filtered if s['category'] == category] + + if search: + filtered = [s for s in filtered + if search in s['name'].lower() or search in s['description'].lower()] + + self.populate_skills(filtered) + self.skill_count_label.config(text=str(len(filtered))) + + def on_skill_select(self, event): + """Handle skill selection""" + selection = self.skill_tree.selection() + if not selection: + return + + item = self.skill_tree.item(selection[0]) + skill_name = item['values'][0] + + skill = next((s for s in self.skills if s['name'] == skill_name), None) + if skill: + details = f"""Skill: {skill['name']} + +Category: {skill['category']} + +Description: {skill['description']} + +Path: {skill['path']} + +--- +Usage: This skill is automatically activated when working with related technologies.""" + self.skill_details.delete('1.0', tk.END) + self.skill_details.insert('1.0', details) + + # ========================================================================= + # COMMANDS TAB + # ========================================================================= + + def create_commands_tab(self): + """Create Commands tab""" + frame = ttk.Frame(self.notebook) + self.notebook.add(frame, text=f"Commands ({len(self.commands)})") + + # Info + info_frame = ttk.Frame(frame) + info_frame.pack(fill=tk.X, padx=10, pady=10) + + ttk.Label(info_frame, text="Slash Commands for Claude Code:", + font=('Arial', 10, 'bold')).pack(anchor=tk.W) + ttk.Label(info_frame, text="Use these commands in Claude Code by typing /command_name", + foreground='gray').pack(anchor=tk.W) + + # Commands list + list_frame = ttk.Frame(frame) + list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10)) + + columns = ('name', 'description') + self.command_tree = ttk.Treeview(list_frame, columns=columns, show='tree headings') + self.command_tree.heading('#0', text='#') + self.command_tree.heading('name', text='Command') + self.command_tree.heading('description', text='Description') + + self.command_tree.column('#0', width=40) + self.command_tree.column('name', width=150) + self.command_tree.column('description', width=400) + + self.command_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + + scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.command_tree.yview) + self.command_tree.configure(yscrollcommand=scrollbar.set) + scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + + # Populate + for i, cmd in enumerate(self.commands, 1): + self.command_tree.insert('', tk.END, text=str(i), + values=('/' + cmd['name'], cmd['description'])) + + # ========================================================================= + # RULES TAB + # ========================================================================= + + def create_rules_tab(self): + """Create Rules tab""" + frame = ttk.Frame(self.notebook) + self.notebook.add(frame, text=f"Rules ({len(self.rules)})") + + # Info + info_frame = ttk.Frame(frame) + info_frame.pack(fill=tk.X, padx=10, pady=10) + + ttk.Label(info_frame, text="Coding Rules by Language:", + font=('Arial', 10, 'bold')).pack(anchor=tk.W) + ttk.Label(info_frame, text="These rules are automatically applied in Claude Code", + foreground='gray').pack(anchor=tk.W) + + # Filter + filter_frame = ttk.Frame(frame) + filter_frame.pack(fill=tk.X, padx=10, pady=5) + + ttk.Label(filter_frame, text="Language:").pack(side=tk.LEFT) + self.rules_language = ttk.Combobox(filter_frame, + values=['All'] + self.get_rule_languages(), + width=15) + self.rules_language.set('All') + self.rules_language.pack(side=tk.LEFT, padx=5) + self.rules_language.bind('<>', self.filter_rules) + + # Rules list + list_frame = ttk.Frame(frame) + list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10)) + + columns = ('name', 'language') + self.rules_tree = ttk.Treeview(list_frame, columns=columns, show='tree headings') + self.rules_tree.heading('#0', text='#') + self.rules_tree.heading('name', text='Rule Name') + self.rules_tree.heading('language', text='Language') + + self.rules_tree.column('#0', width=40) + self.rules_tree.column('name', width=250) + self.rules_tree.column('language', width=100) + + self.rules_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + + scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.rules_tree.yview) + self.rules_tree.configure(yscrollcommand=scrollbar.set) + scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + + self.populate_rules(self.rules) + + def get_rule_languages(self) -> List[str]: + """Get unique languages from rules""" + languages = set(r['language'] for r in self.rules) + return sorted(languages) + + def populate_rules(self, rules: List[Dict]): + """Populate rules list""" + for item in self.rules_tree.get_children(): + self.rules_tree.delete(item) + + for i, rule in enumerate(rules, 1): + self.rules_tree.insert('', tk.END, text=str(i), + values=(rule['name'], rule['language'])) + + def filter_rules(self, event=None): + """Filter rules by language""" + language = self.rules_language.get() + + if language == 'All': + filtered = self.rules + else: + filtered = [r for r in self.rules if r['language'] == language] + + self.populate_rules(filtered) + + # ========================================================================= + # SETTINGS TAB + # ========================================================================= + + def create_settings_tab(self): + """Create Settings tab""" + frame = ttk.Frame(self.notebook) + self.notebook.add(frame, text="Settings") + + # Project path + path_frame = ttk.LabelFrame(frame, text="Project Path", padding=10) + path_frame.pack(fill=tk.X, padx=10, pady=10) + + self.path_entry = ttk.Entry(path_frame, width=60) + self.path_entry.insert(0, self.project_path) + self.path_entry.pack(side=tk.LEFT, fill=tk.X, expand=True) + + ttk.Button(path_frame, text="Browse...", command=self.browse_path).pack(side=tk.LEFT, padx=5) + + # Theme + theme_frame = ttk.LabelFrame(frame, text="Appearance", padding=10) + theme_frame.pack(fill=tk.X, padx=10, pady=10) + + ttk.Label(theme_frame, text="Theme:").pack(anchor=tk.W) + self.theme_var = tk.StringVar(value='light') + light_rb = ttk.Radiobutton(theme_frame, text="Light", variable=self.theme_var, + value='light', command=self.apply_theme) + light_rb.pack(anchor=tk.W) + dark_rb = ttk.Radiobutton(theme_frame, text="Dark", variable=self.theme_var, + value='dark', command=self.apply_theme) + dark_rb.pack(anchor=tk.W) + + font_frame = ttk.LabelFrame(frame, text="Font", padding=10) + font_frame.pack(fill=tk.X, padx=10, pady=10) + + ttk.Label(font_frame, text="Font Family:").pack(anchor=tk.W) + self.font_var = tk.StringVar(value='Open Sans') + + fonts = ['Open Sans', 'Arial', 'Helvetica', 'Times New Roman', 'Courier New', 'Verdana', 'Georgia', 'Tahoma', 'Trebuchet MS'] + self.font_combo = ttk.Combobox(font_frame, textvariable=self.font_var, values=fonts, state='readonly') + self.font_combo.pack(anchor=tk.W, fill=tk.X, pady=(5, 0)) + self.font_combo.bind('<>', lambda e: self.apply_theme()) + + ttk.Label(font_frame, text="Font Size:").pack(anchor=tk.W, pady=(10, 0)) + self.size_var = tk.StringVar(value='10') + sizes = ['8', '9', '10', '11', '12', '14', '16', '18', '20'] + self.size_combo = ttk.Combobox(font_frame, textvariable=self.size_var, values=sizes, state='readonly', width=10) + self.size_combo.pack(anchor=tk.W, pady=(5, 0)) + self.size_combo.bind('<>', lambda e: self.apply_theme()) + + # Quick Actions + actions_frame = ttk.LabelFrame(frame, text="Quick Actions", padding=10) + actions_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) + + ttk.Button(actions_frame, text="Open Project in Terminal", + command=self.open_terminal).pack(fill=tk.X, pady=2) + ttk.Button(actions_frame, text="Open README", + command=self.open_readme).pack(fill=tk.X, pady=2) + ttk.Button(actions_frame, text="Open AGENTS.md", + command=self.open_agents).pack(fill=tk.X, pady=2) + ttk.Button(actions_frame, text="Refresh Data", + command=self.refresh_data).pack(fill=tk.X, pady=2) + + # About + about_frame = ttk.LabelFrame(frame, text="About", padding=10) + about_frame.pack(fill=tk.X, padx=10, pady=10) + + about_text = """ECC Dashboard v1.0.0 +Everything Claude Code GUI + +A cross-platform desktop application for +managing and exploring ECC components. + +Version: 1.10.0 +Project: github.com/affaan-m/everything-claude-code""" + + ttk.Label(about_frame, text=about_text, justify=tk.LEFT).pack(anchor=tk.W) + + def browse_path(self): + """Browse for project path""" + from tkinter import filedialog + path = filedialog.askdirectory(initialdir=self.project_path) + if path: + self.path_entry.delete(0, tk.END) + self.path_entry.insert(0, path) + + def open_terminal(self): + """Open terminal at project path""" + import subprocess + path = self.path_entry.get() + if os.name == 'nt': # Windows + subprocess.Popen(['cmd', '/c', 'start', 'cmd', '/k', f'cd /d "{path}"']) + elif os.uname().sysname == 'Darwin': # macOS + subprocess.Popen(['open', '-a', 'Terminal', path]) + else: # Linux + subprocess.Popen(['x-terminal-emulator', '-e', f'cd {path}']) + + def open_readme(self): + """Open README in default browser/reader""" + import subprocess + path = os.path.join(self.path_entry.get(), 'README.md') + if os.path.exists(path): + subprocess.Popen(['xdg-open' if os.name != 'nt' else 'start', path]) + else: + messagebox.showerror("Error", "README.md not found") + + def open_agents(self): + """Open AGENTS.md""" + import subprocess + path = os.path.join(self.path_entry.get(), 'AGENTS.md') + if os.path.exists(path): + subprocess.Popen(['xdg-open' if os.name != 'nt' else 'start', path]) + else: + messagebox.showerror("Error", "AGENTS.md not found") + + def refresh_data(self): + """Refresh all data""" + self.project_path = self.path_entry.get() + self.agents = load_agents(self.project_path) + self.skills = load_skills(self.project_path) + self.commands = load_commands(self.project_path) + self.rules = load_rules(self.project_path) + + # Update tabs + self.notebook.tab(0, text=f"Agents ({len(self.agents)})") + self.notebook.tab(1, text=f"Skills ({len(self.skills)})") + self.notebook.tab(2, text=f"Commands ({len(self.commands)})") + self.notebook.tab(3, text=f"Rules ({len(self.rules)})") + + # Repopulate + self.populate_agents(self.agents) + self.populate_skills(self.skills) + + # Update status + self.status_label.config( + text=f"Ready | Agents: {len(self.agents)} | Skills: {len(self.skills)} | Commands: {len(self.commands)}" + ) + + messagebox.showinfo("Success", "Data refreshed successfully!") + + def apply_theme(self): + theme = self.theme_var.get() + font_family = self.font_var.get() + font_size = int(self.size_var.get()) + font_tuple = (font_family, font_size) + + if theme == 'dark': + bg_color = '#2b2b2b' + fg_color = '#ffffff' + entry_bg = '#3c3c3c' + frame_bg = '#2b2b2b' + select_bg = '#0f5a9e' + else: + bg_color = '#f0f0f0' + fg_color = '#000000' + entry_bg = '#ffffff' + frame_bg = '#f0f0f0' + select_bg = '#e0e0e0' + + self.configure(background=bg_color) + + style = ttk.Style() + style.configure('.', background=bg_color, foreground=fg_color, font=font_tuple) + style.configure('TFrame', background=bg_color, font=font_tuple) + style.configure('TLabel', background=bg_color, foreground=fg_color, font=font_tuple) + style.configure('TNotebook', background=bg_color, font=font_tuple) + style.configure('TNotebook.Tab', background=frame_bg, foreground=fg_color, font=font_tuple) + style.map('TNotebook.Tab', background=[('selected', select_bg)]) + style.configure('Treeview', background=entry_bg, foreground=fg_color, fieldbackground=entry_bg, font=font_tuple) + style.configure('Treeview.Heading', background=frame_bg, foreground=fg_color, font=font_tuple) + style.configure('TEntry', fieldbackground=entry_bg, foreground=fg_color, font=font_tuple) + style.configure('TButton', background=frame_bg, foreground=fg_color, font=font_tuple) + + self.title_label.configure(font=(font_family, 18, 'bold')) + self.version_label.configure(font=(font_family, 10)) + + def update_widget_colors(widget): + try: + widget.configure(background=bg_color) + except: + pass + for child in widget.winfo_children(): + try: + child.configure(background=bg_color) + except: + pass + try: + update_widget_colors(child) + except: + pass + + try: + update_widget_colors(self) + except: + pass + + self.update() + + +# ============================================================================ +# MAIN +# ============================================================================ + +def main(): + """Main entry point""" + app = ECCDashboard() + app.mainloop() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/package.json b/package.json index 1a569589..a9d9530f 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,8 @@ "test": "node scripts/ci/check-unicode-safety.js && node scripts/ci/validate-agents.js && node scripts/ci/validate-commands.js && node scripts/ci/validate-rules.js && node scripts/ci/validate-skills.js && node scripts/ci/validate-hooks.js && node scripts/ci/validate-install-manifests.js && node scripts/ci/validate-no-personal-paths.js && npm run catalog:check && node tests/run-all.js", "coverage": "c8 --all --include=\"scripts/**/*.js\" --check-coverage --lines 80 --functions 80 --branches 80 --statements 80 --reporter=text --reporter=lcov node tests/run-all.js", "build:opencode": "node scripts/build-opencode.js", - "prepack": "npm run build:opencode" + "prepack": "npm run build:opencode", + "dashboard": "python3 ./ecc_dashboard.py" }, "dependencies": { "@iarna/toml": "^2.2.5", @@ -137,4 +138,4 @@ "node": ">=18" }, "packageManager": "yarn@4.9.2+sha512.1fc009bc09d13cfd0e19efa44cbfc2b9cf6ca61482725eb35bbc5e257e093ebf4130db6dfe15d604ff4b79efd8e1e8e99b25fa7d0a6197c9f9826358d4d65c3c" -} +} \ No newline at end of file