7.1 KiB
7.1 KiB
General Bots Workspace - Master Development Guide
Version: 6.1.0 - DO NOT CHANGE
Project: General Bots Workspace (Rust Monorepo)
🔥 CRITICAL: INFINITE LOOP MODE
LOOP UNTIL (0 warnings AND 0 errors):
1. diagnostics() → pick file with issues
2. Read entire file
3. Fix ALL issues in that file
4. Write file once with all fixes
5. Sleep 30-300s: terminal(command="sleep 120", cd="gb")
6. diagnostics() → verify
7. CONTINUE LOOP
END LOOP
NEVER STOP while warnings/errors exist. NEVER SKIP the sleep.
🔐 SECURITY DIRECTIVES - MANDATORY FOR ALL NEW CODE
Error Handling - NO PANICS IN PRODUCTION
// ❌ FORBIDDEN - causes panic
value.unwrap()
value.expect("message")
panic!("error")
todo!()
unimplemented!()
// ✅ REQUIRED - proper error handling
value?
value.ok_or_else(|| Error::NotFound)?
value.unwrap_or_default()
value.unwrap_or_else(|e| { log::error!("{}", e); default })
if let Some(v) = value { ... }
match value { Ok(v) => v, Err(e) => return Err(e.into()) }
Command Execution - USE SafeCommand
// ❌ FORBIDDEN - direct command execution
Command::new("some_command").arg(user_input).output()
// ✅ REQUIRED - use SafeCommand from security module
use crate::security::command_guard::SafeCommand;
SafeCommand::new("allowed_command")?
.arg("safe_arg")?
.execute()
Error Responses - USE ErrorSanitizer
// ❌ FORBIDDEN - leaks internal details
Json(json!({ "error": e.to_string() }))
format!("Database error: {}", e)
// ✅ REQUIRED - sanitize errors
use crate::security::error_sanitizer::log_and_sanitize;
let sanitized = log_and_sanitize(&e, "context", None);
(StatusCode::INTERNAL_SERVER_ERROR, sanitized)
SQL - USE sql_guard
// ❌ FORBIDDEN - SQL injection risk
format!("SELECT * FROM {}", user_table)
// ✅ REQUIRED - use sql_guard functions
use crate::security::sql_guard::{sanitize_identifier, validate_table_name};
let safe_table = sanitize_identifier(&user_table);
validate_table_name(&safe_table)?;
ABSOLUTE PROHIBITIONS
❌ NEVER use .unwrap() or .expect() in production code (tests OK)
❌ NEVER use panic!(), todo!(), unimplemented!()
❌ NEVER use Command::new() directly - use SafeCommand
❌ NEVER return raw error strings to HTTP clients
❌ NEVER use #[allow()] in source code - FIX the code instead
❌ NEVER add lint exceptions to Cargo.toml - FIX the code instead
❌ NEVER use _ prefix for unused variables - DELETE or USE them
❌ NEVER leave unused imports or dead code
❌ NEVER add comments - code must be self-documenting
❌ NEVER run cargo check/clippy/build - use diagnostics tool
❌ NEVER modify Cargo.toml lints section
FIXING WARNINGS - DO NOT SUPPRESS
When you encounter warnings, FIX them properly:
Dead Code
// ❌ WRONG - suppressing
#[allow(dead_code)]
struct Unused { field: String }
// ✅ CORRECT - delete unused code or use it
// DELETE the struct entirely, or add code that uses it
Unused Variables
// ❌ WRONG - underscore prefix
fn foo(_unused: String) { }
// ✅ CORRECT - remove parameter or use it
fn foo() { } // remove if not needed
fn foo(used: String) { println!("{used}"); } // or use it
Unreachable Code
// ❌ WRONG - allow attribute
#[allow(unreachable_code)]
{ unreachable_statement(); }
// ✅ CORRECT - restructure code so it's reachable or delete it
Unused Async
// ❌ WRONG - allow attribute
#[allow(clippy::unused_async)]
async fn handler() { sync_code(); }
// ✅ CORRECT - add .await or remove async
fn handler() { sync_code(); } // remove async if not needed
async fn handler() { some_future.await; } // or add await
MANDATORY CODE PATTERNS
Use Self in Impl Blocks
impl MyStruct {
fn new() -> Self { Self { } } // ✅ Not MyStruct
}
Derive Eq with PartialEq
#[derive(PartialEq, Eq)] // ✅ Always both
struct MyStruct { }
Inline Format Args
format!("Hello {name}") // ✅ Not format!("{}", name)
Combine Match Arms
match x {
A | B => do_thing(), // ✅ Combine identical arms
C => other(),
}
Workspace Structure
gb/
├── botapp/ # Desktop app (Tauri)
├── botserver/ # Main server (Axum API)
├── botlib/ # Shared library
├── botui/ # Web UI
├── botbook/ # Documentation
├── bottest/ # Integration tests
└── PROMPT.md # THIS FILE
🚀 BOTSERVER RUN LOOP - MANDATORY FOR RUNTIME FIXES
LOOP UNTIL botserver starts successfully:
1. cargo build -p botserver 2>&1 | tail -20
2. IF build fails → fix errors → CONTINUE LOOP
3. cd botserver && timeout 30 ../target/debug/botserver --noconsole 2>&1 | head -80
4. Analyze output for errors/warnings
5. Fix issues in code
6. CONTINUE LOOP
END LOOP
Run Commands
# Build botserver only
cargo build -p botserver 2>&1 | tail -20
# Run from botserver directory (required for .env and botserver-stack paths)
cd botserver && timeout 30 ../target/debug/botserver --noconsole 2>&1 | head -80
Key Paths (relative to gb/)
- Binary:
target/debug/botserver - Run from:
botserver/directory - Env file:
botserver/.env - Stack:
botserver/botserver-stack/ - Logs:
botserver/botserver-stack/logs/<component>/
Development Workflow
The Loop
diagnostics()→ find file with issuesread_file()→ read entire file- Fix ALL issues in that file (batch them)
edit_file(mode="overwrite")→ write onceterminal(command="sleep 120", cd="gb")→ MANDATORYdiagnostics()→ verify fixes- REPEAT until 0 warnings, 0 errors
Quick Reference
- Read:
read_file(path="botserver/src/main.rs") - Edit:
edit_file(path="...", mode="overwrite") - Find:
find_path(glob="**/*.rs") - Search:
grep(regex="pattern") - Check:
diagnostics()ordiagnostics(path="file.rs")
📋 CONTINUATION PROMPT FOR NEXT SESSION
When starting a new session, use this prompt:
Continue working on gb/ workspace. Follow PROMPT.md strictly:
1. Run diagnostics() first
2. Fix ALL warnings and errors - NO #[allow()] attributes
3. Delete unused code, don't suppress warnings
4. Remove unused parameters, don't prefix with _
5. Sleep after edits, verify with diagnostics
6. Loop until 0 warnings, 0 errors
Current focus areas needing fixes:
- botserver/src/core/package_manager/installer.rs - unreachable code
- botserver/src/meet/mod.rs - unused async/parameters
- botserver/src/settings/rbac_ui.rs - Display trait issues
- Any remaining #[allow()] attributes in source files
Remember: FIX code, never suppress warnings!
Remember
- ZERO WARNINGS, ZERO ERRORS - The only acceptable state
- FIX, DON'T SUPPRESS - No #[allow()], no Cargo.toml lint exceptions
- SECURITY FIRST - No unwrap, no raw errors, no direct commands
- SLEEP AFTER EDITS - Diagnostics needs 30-300s to refresh
- FIX ENTIRE FILE - Batch all issues before writing
- TRUST DIAGNOSTICS - Source of truth after sleep
- LOOP FOREVER - Never stop until 0,0
- DELETE DEAD CODE - Don't keep unused code around
- Version 6.1.0 - Do not change without approval