2025-12-04 12:30:07 -03:00
# BotUI Development Prompt Guide
2025-12-03 18:42:22 -03:00
2025-12-04 12:30:07 -03:00
**Version:** 6.1.0
**Purpose:** LLM context for BotUI development
---
2025-12-18 16:18:09 -03:00
## Weekly Maintenance - EVERY MONDAY
### Package Review Checklist
**Every Monday, review the following:**
1. **Dependency Updates**
```bash
cargo outdated
cargo audit
```
2. **Package Consolidation Opportunities**
- Check if new crates can replace custom code
- Look for crates that combine multiple dependencies
- Review `Cargo.toml` for redundant dependencies
3. **Code Reduction Candidates**
- Custom implementations that now have crate equivalents
- Boilerplate that can be replaced with derive macros
- Manual serialization that `serde` can handle
4. **Frontend Asset Updates**
```bash
# Check vendor libs in ui/suite/js/vendor/
2025-12-18 18:53:11 -03:00
# Compare with latest versions of htmx, gsap, etc.
2025-12-18 16:18:09 -03:00
```
### Packages to Watch
| Area | Potential Packages | Purpose |
|------|-------------------|---------|
| HTTP Client | `reqwest` | Consolidate HTTP handling |
| Templates | `askama` | Efficient HTML templates |
| Animations | `gsap` | Replace CSS animations |
---
2025-12-06 11:09:12 -03:00
## Version Management - CRITICAL
**Current version is 6.1.0 - DO NOT CHANGE without explicit approval!**
### Rules
1. **Version is 6.1.0 across ALL workspace crates**
2. **NEVER change version without explicit user approval**
3. **BotUI does not have migrations - all migrations are in botserver/**
4. **All workspace crates share version 6.1.0**
---
2025-12-04 18:15:31 -03:00
## Official Icons - MANDATORY
**NEVER generate icons with LLM. ALWAYS use official SVG icons from:**
```
ui/suite/assets/icons/
├── gb-logo.svg # Main GB logo
├── gb-bot.svg # Bot/assistant
├── gb-analytics.svg # Analytics app
├── gb-calendar.svg # Calendar app
├── gb-chat.svg # Chat app
├── gb-compliance.svg # Compliance/security
├── gb-designer.svg # Workflow designer
├── gb-drive.svg # File storage
├── gb-mail.svg # Email
├── gb-meet.svg # Video meetings
├── gb-paper.svg # Documents
├── gb-research.svg # Research/search
├── gb-sources.svg # Knowledge sources
└── gb-tasks.svg # Task management
```
### Usage in HTML
```html
<!-- Inline SVG (preferred for styling) -->
< img src = "/assets/icons/gb-chat.svg" alt = "Chat" class = "icon" >
<!-- With CSS currentColor -->
< svg class = "icon" style = "color: var(--primary);" >
< use href = "/assets/icons/gb-chat.svg #icon " ></ use >
< / svg >
```
### Icon Style Guidelines
- All icons use `stroke="currentColor"` for theming
- ViewBox: `0 0 24 24`
- Stroke width: `1.5`
- Rounded caps and joins
- Consistent with GB brand identity
**DO NOT:**
- Generate new icons with AI/LLM
- Use emoji or unicode symbols as icons
- Use external icon libraries (FontAwesome, etc.)
- Create inline SVG content in templates
---
2025-12-04 12:30:07 -03:00
## Project Overview
2025-12-03 18:42:22 -03:00
BotUI is a **dual-mode UI application** built in Rust that runs as either a desktop app (Tauri) or web server (Axum). All business logic is in **botserver** - BotUI is purely presentation + HTTP bridge.
2025-12-04 12:30:07 -03:00
### Workspace Position
```
botui/ # THIS PROJECT - Web/Desktop UI
botserver/ # Main server (business logic)
botlib/ # Shared library (consumed here)
botapp/ # Desktop wrapper (consumes botui)
botbook/ # Documentation
```
2025-12-04 13:55:31 -03:00
---
## LLM Workflow Strategy
### Two Types of LLM Work
1. **Execution Mode (Fazer)**
- Pre-annotate phrases and send for execution
- Focus on automation freedom
- Less concerned with code details
- Primary concern: Is the LLM destroying something?
- Trust but verify output doesn't break existing functionality
2. **Review Mode (Conferir)**
- Read generated code with full attention
- Line-by-line verification
- Check for correctness, security, performance
- Validate against requirements
### LLM Fallback Strategy (After 3 attempts / 10 minutes)
2025-12-04 12:30:07 -03:00
2025-12-04 13:55:31 -03:00
1. DeepSeek-V3-0324 (good architect, reliable)
2. gpt-5-chat (slower but thorough)
3. gpt-oss-120b (final validation)
4. Claude Web (for complex debugging, unit tests, UI)
2025-12-04 12:30:07 -03:00
---
2025-12-04 13:55:31 -03:00
## Code Generation Rules
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
### CRITICAL REQUIREMENTS
```
- BotUI = Presentation + HTTP bridge ONLY
- All business logic goes in botserver
- No code duplication between layers
- Feature gates eliminate unused code paths
- Zero warnings - feature gating prevents dead code
- NO DEAD CODE - implement real functionality, never use _ for unused
- All JS/CSS must be local (no CDN)
```
### HTMX-First Frontend
```
- Use HTMX to minimize JavaScript at maximum
- Delegate ALL logic to Rust server
- Server returns HTML fragments, not JSON
- Use hx-get, hx-post, hx-target, hx-swap attributes
- WebSocket via htmx-ws extension for real-time
- NO custom JavaScript where HTMX can handle it
```
2025-12-12 23:21:01 -03:00
### JavaScript Usage Guidelines
**JS is ONLY acceptable when HTMX cannot handle the requirement:**
| Use Case | Solution |
|----------|----------|
| Data fetching | HTMX `hx-get` , `hx-post` |
| Form submission | HTMX `hx-post` , `hx-put` |
| Real-time updates | HTMX WebSocket extension `hx-ext="ws"` |
| Content swapping | HTMX `hx-target` , `hx-swap` |
| Polling | HTMX `hx-trigger="every 5s"` |
| Loading states | HTMX `hx-indicator` |
| **Modal show/hide** | **JS required** - DOM manipulation |
| **Toast notifications** | **JS required** - dynamic element creation |
| **Clipboard operations** | **JS required** - `navigator.clipboard` API |
| **Keyboard shortcuts** | **JS required** - `keydown` event handling |
| **WebSocket state mgmt** | **JS required** - connection lifecycle |
| **Complex animations** | **JS required** - GSAP or custom |
| **Client-side validation** | **JS required** - before submission UX |
**When writing JS:**
```
- Keep it minimal - one function per concern
- No frameworks (React, Vue, etc.) - vanilla JS only
2025-12-18 18:53:11 -03:00
- Use vendor libs sparingly (htmx, marked, gsap)
2025-12-12 23:21:01 -03:00
- All JS must work with HTMX lifecycle (htmx:afterSwap, etc.)
- Prefer CSS for animations when possible
```
2025-12-04 13:55:31 -03:00
### Local Assets Only
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
All external libraries are bundled locally - NEVER use CDN:
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
```
ui/suite/js/vendor/
├── htmx.min.js # HTMX core
├── htmx-ws.js # WebSocket extension
├── htmx-json-enc.js # JSON encoding
├── marked.min.js # Markdown parser
├── gsap.min.js # Animation (minimal use)
└── livekit-client.umd.min.js # LiveKit video
ui/minimal/js/vendor/
└── (same structure)
```
```html
<!-- CORRECT -->
< script src = "js/vendor/htmx.min.js" > < / script >
<!-- WRONG - NEVER DO THIS -->
< script src = "https://unpkg.com/htmx.org @1 .9.10" ></ script >
```
### Dependency Management
```
- Use diesel for any local database needs
- After adding to Cargo.toml: cargo audit must show 0 warnings
- If audit fails, find alternative library
- Minimize redundancy - check existing libs before adding new ones
```
### Documentation Rules
```
- Rust code examples ONLY allowed in architecture/gbapp documentation
- Scan for ALL_CAPS.md files created at wrong places - delete or integrate
- Keep only README.md and PROMPT.md at project root level
2025-12-03 18:42:22 -03:00
```
2025-12-04 12:30:07 -03:00
---
## Architecture
2025-12-03 18:42:22 -03:00
### Dual Modes
2025-12-04 12:30:07 -03:00
| Mode | Command | Description |
|------|---------|-------------|
| Web | `cargo run` | Axum server on port 3000 |
| Desktop | `cargo tauri dev` | Tauri native window |
2025-12-03 18:42:22 -03:00
### Code Organization
```
2025-12-04 12:30:07 -03:00
src/
├── main.rs # Entry point - mode detection
├── lib.rs # Feature-gated module exports
├── http_client.rs # HTTP wrapper for botserver (web-only)
2025-12-03 18:42:22 -03:00
├── ui_server/
2025-12-04 12:30:07 -03:00
│ └── mod.rs # Axum router + UI serving (web-only)
2025-12-03 18:42:22 -03:00
├── desktop/
2025-12-04 12:30:07 -03:00
│ ├── mod.rs # Desktop module organization
│ ├── drive.rs # File operations via Tauri
│ ├── tray.rs # System tray infrastructure
│ └── stream.rs # Streaming operations
2025-12-03 18:42:22 -03:00
└── shared/
2025-12-04 12:30:07 -03:00
└── state.rs # Shared application state
ui/
├── suite/ # Main UI (HTML/CSS/JS)
2025-12-04 13:55:31 -03:00
│ ├── js/vendor/ # Local JS libraries
2025-12-04 12:30:07 -03:00
│ └── css/ # Stylesheets
└── minimal/ # Minimal chat UI
└── js/vendor/ # Local JS libraries
2025-12-03 18:42:22 -03:00
```
2025-12-04 13:55:31 -03:00
### Feature Gating
2025-12-03 18:42:22 -03:00
```rust
2025-12-04 13:55:31 -03:00
#[cfg(feature = "desktop")]
2025-12-03 18:42:22 -03:00
pub mod desktop;
2025-12-04 13:55:31 -03:00
#[cfg(not(feature = "desktop"))]
2025-12-03 18:42:22 -03:00
pub mod http_client;
```
2025-12-04 12:30:07 -03:00
---
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
## HTMX Patterns
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
### Server-Side Rendering
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
```html
<!-- Button triggers server request, response swaps into target -->
< button hx-get = "/api/items"
hx-target="#items -list"
hx-swap="innerHTML">
Load Items
< / button >
< div id = "items-list" >
<!-- Server returns HTML fragment here -->
< / div >
2025-12-03 18:42:22 -03:00
```
2025-12-04 13:55:31 -03:00
### Form Submission
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
```html
< form hx-post = "/api/items"
hx-target="#items -list"
hx-swap="beforeend">
< input name = "title" type = "text" required >
< button type = "submit" > Add< / button >
< / form >
2025-12-03 18:42:22 -03:00
```
2025-12-04 13:55:31 -03:00
### WebSocket Real-time
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
```html
< div hx-ext = "ws" ws-connect = "/ws/chat" >
< div id = "messages" > < / div >
< form ws-send >
< input name = "message" type = "text" >
< button type = "submit" > Send< / button >
< / form >
< / div >
2025-12-03 18:42:22 -03:00
```
2025-12-04 13:55:31 -03:00
### Server Response (Rust/Askama)
2025-12-03 18:42:22 -03:00
2025-12-04 12:30:07 -03:00
```rust
2025-12-04 13:55:31 -03:00
#[derive(Template)]
#[template(path = "partials/item.html")]
struct ItemTemplate {
item: Item,
2025-12-04 12:30:07 -03:00
}
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
async fn create_item(
State(state): State< Arc < AppState > >,
Form(input): Form< CreateItem > ,
) -> Html< String > {
let item = save_item(& state, input).await;
let template = ItemTemplate { item };
Html(template.render().unwrap())
2025-12-04 12:30:07 -03:00
}
2025-12-03 18:42:22 -03:00
```
2025-12-04 12:30:07 -03:00
---
2025-12-03 18:42:22 -03:00
## Adding Features
### Process
2025-12-04 12:30:07 -03:00
2025-12-03 18:42:22 -03:00
1. Add business logic to **botserver** first
2025-12-04 13:55:31 -03:00
2. Create REST API endpoint in botserver (returns HTML for HTMX)
3. Add HTTP wrapper in BotUI if needed
4. Add UI in `ui/suite/` using HTMX attributes
2025-12-04 12:30:07 -03:00
5. For desktop-specific: Add Tauri command in `src/desktop/`
2025-12-03 18:42:22 -03:00
2025-12-04 12:30:07 -03:00
### Desktop Tauri Command
2025-12-03 18:42:22 -03:00
```rust
#[tauri::command]
2025-12-04 12:30:07 -03:00
pub fn list_files(path: & str) -> Result< Vec < FileItem > , String> {
2025-12-04 13:55:31 -03:00
let entries = std::fs::read_dir(path)
.map_err(|e| e.to_string())?;
let items: Vec< FileItem > = entries
.filter_map(|e| e.ok())
.map(|e| FileItem {
name: e.file_name().to_string_lossy().to_string(),
is_dir: e.path().is_dir(),
})
.collect();
Ok(items)
2025-12-03 18:42:22 -03:00
}
```
2025-12-04 12:30:07 -03:00
---
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
## Final Steps Before Commit
2025-12-03 18:42:22 -03:00
```bash
2025-12-04 13:55:31 -03:00
# Check for warnings
cargo check 2>& 1 | grep warning
# Audit dependencies (must be 0 warnings)
cargo audit
# Build both modes
cargo build
cargo build --features desktop
# Verify no dead code with _ prefixes
grep -r "let _" src/ --include="*.rs"
# Verify no CDN references
grep -r "unpkg.com\|cdnjs\|jsdelivr" ui/
```
---
## Key Files Reference
```
src/main.rs # Entry point, mode detection
src/lib.rs # Feature-gated exports
2025-12-12 23:21:01 -03:00
src/http_client.rs # botserverClient wrapper
2025-12-04 13:55:31 -03:00
src/ui_server/mod.rs # Axum router, static files
ui/suite/index.html # Main UI entry
ui/suite/base.html # Base template
ui/minimal/index.html # Minimal chat UI
2025-12-03 18:42:22 -03:00
```
2025-12-04 12:30:07 -03:00
---
2025-12-03 18:42:22 -03:00
2025-12-04 12:30:07 -03:00
## Dependencies
2025-12-03 18:42:22 -03:00
2025-12-04 12:30:07 -03:00
| Library | Version | Purpose |
|---------|---------|---------|
| axum | 0.7.5 | Web framework |
| reqwest | 0.12 | HTTP client |
| tokio | 1.41 | Async runtime |
2025-12-04 13:55:31 -03:00
| askama | 0.12 | HTML Templates |
2025-12-04 12:30:07 -03:00
| diesel | 2.1 | Database (sqlite) |
2025-12-03 18:42:22 -03:00
2025-12-04 12:30:07 -03:00
---
2025-12-03 18:42:22 -03:00
2025-12-04 13:55:31 -03:00
## Remember
2025-12-04 12:30:07 -03:00
2025-12-04 13:55:31 -03:00
- **Two LLM modes**: Execution (fazer) vs Review (conferir)
- **HTMX first**: Minimize JS, delegate to server
- **Local assets**: No CDN, all vendor files local
- **Dead code**: Never use _ prefix, implement real code
- **cargo audit**: Must pass with 0 warnings
- **No business logic**: All logic in botserver
- **Feature gates**: Unused code never compiles
2025-12-06 11:09:12 -03:00
- **HTML responses**: Server returns fragments, not JSON
- **Version**: Always 6.1.0 - do not change without approval
- **Theme system**: Use data-theme attribute on body, 6 themes available