--- allowed_tools: - mcp__godot__get_debug_output - Skill --- View enhanced debug output from the running Godot project with error highlighting and filtering. # Process 1. **Check if project is running** - Use mcp__godot__get_debug_output to fetch current debug output 2. **Parse and enhance the output:** - Identify error types (ERROR, WARNING, INFO) - Parse stack traces - Extract file paths and line numbers - Highlight important information 3. **Display formatted output:** ## Error Formatting Present errors with the following enhanced format: ### ERROR messages ``` [ERROR] Location: : Function: Details: Stack Trace: at (:) at (:) ``` ### WARNING messages ``` [WARNING] Location: : Context: ``` ### INFO/DEBUG messages ``` [INFO] ``` ## Common Error Patterns to Recognize ### 1. Null Reference Errors Pattern: `Attempt to call function .* in base 'null instance'` Response: ``` [ERROR] Null Reference Error Trying to call a method on a null object Quick Fixes: - Check if the object exists before calling methods - Verify @onready node paths are correct - Ensure nodes aren't freed before being accessed Example fix: if my_node != null: my_node.some_method() ``` ### 2. Node Not Found Pattern: `Node not found: .*` or `get_node: .*not found` Response: ``` [ERROR] Node Not Found Path: Possible Causes: - Node doesn't exist in the scene tree - Incorrect node path (check capitalization) - Node hasn't been added yet (timing issue) Quick Fixes: - Use get_node_or_null() to check if node exists - Verify the node path in the scene tree - Use @onready for scene tree references ``` ### 3. Index Out of Range Pattern: `Index .* out of range` Response: ``` [ERROR] Array Index Out of Bounds Index: Array Size: Quick Fixes: - Check array size before accessing: if index < array.size() - Use range-based loops instead of index access - Validate index is not negative ``` ### 4. Type Errors Pattern: `Invalid operands .* and .* in operator` Response: ``` [ERROR] Type Mismatch Cannot perform operation between incompatible types Quick Fixes: - Ensure variables are initialized - Check for null values before operations - Verify type annotations match actual types ``` ### 5. Signal Errors Pattern: `Signal .* already connected` or `Attempt to call an invalid function` Response: ``` [ERROR] Signal Connection Error Quick Fixes: - Check if signal is already connected before connecting - Verify method signature matches signal parameters - Ensure method exists and is spelled correctly ``` ## Enhanced Features ### Error Grouping - Group repeated errors together - Show count of occurrences - Display first occurrence time Example: ``` [ERROR] (x5) Null instance access First occurred at: 14:32:15 Last occurred at: 14:32:23 See details with: /gd:debug --expand= ``` ### Filtering Options Ask user if they want to filter output: Question: "Would you like to filter the debug output?" Header: "Filter" Multi-select: false Options: - Show All: Display all messages (errors, warnings, info) - Errors Only: Show only ERROR messages - Errors + Warnings: Show errors and warnings - Custom Filter: Filter by keyword ### Auto-suggestions For each error, provide: 1. **Error Type**: Classification of the error 2. **Likely Cause**: Most common reason for this error 3. **Suggested Fix**: Code example or action to take 4. **Related Documentation**: Link to relevant Godot docs if applicable Example output: ``` ───────────────────────────────────── [ERROR] Invalid get index 'health' (on base: 'null instance') Location: res://scripts/player.gd:45 Function: take_damage() Likely Cause: The player node is null when trying to access the 'health' property. This usually happens when: - A node reference (@onready var) points to a non-existent node - The node was freed/removed before this code runs - The node path is incorrect Suggested Fix: # Add null check before accessing: if player != null: player.health -= damage # Or verify node exists in _ready(): func _ready(): assert(player != null, "Player node not found!") Related Code (player.gd:45): 45 | func take_damage(amount): 46 | player.health -= amount # ERROR HERE 47 | update_health_bar() Next Steps: 1. Check that the player node exists in the scene tree 2. Verify the node path for @onready variables 3. Add null checks before accessing node properties ───────────────────────────────────── ``` ## Watch Mode Offer to enable watch mode: "Would you like to enable watch mode? This will continuously monitor for new errors." If yes: - Poll mcp__godot__get_debug_output every 2 seconds - Display new errors as they occur - Highlight new errors in real-time - User can press Ctrl+C or type 'stop' to exit watch mode Example watch mode output: ``` [WATCH MODE] Monitoring debug output... (Press Ctrl+C to stop) 14:35:12 | [INFO] Game started 14:35:15 | [WARNING] Texture not found: res://sprites/missing.png 14:35:18 | [ERROR] Null instance access in enemy.gd:23 Press Enter to see error details, or type 'stop' to exit... ``` ## Additional Commands After showing debug output, offer helpful commands: ``` Debug output retrieved. Helpful commands: /gd:debug --errors-only Show only errors /gd:debug --watch Enable watch mode /gd:restart Restart the game Need help fixing an error? Just ask! The godot-debugging skill can help interpret and fix these errors. ``` # Integration with godot-debugging Skill After displaying errors, automatically activate the godot-debugging skill to provide: - Detailed error explanations - Code fixes - Prevention strategies # Example Full Output ``` Debug Output (Last 50 lines) ═══════════════════════════════════════ [INFO] Project initialized [INFO] Scene loaded: res://scenes/main.tscn [WARNING] Node has been removed from scene: Label Location: res://scenes/ui/menu.tscn Context: Attempting to access removed node Note: This usually happens when you call queue_free() on a node and then try to access it later in the same frame. ───────────────────────────────────── [ERROR] Attempt to call function 'move_and_slide' in base 'null instance' on a null instance Location: res://scripts/player.gd:67 Function: _physics_process(delta) Stack Trace: at CharacterBody2D._physics_process (res://scripts/player.gd:67) at Node._propagate_process (core) 🔍 Analysis: The player node (CharacterBody2D) is trying to call move_and_slide() but the instance is null. This typically means: - The player was freed but physics_process is still running - The script is on a freed node 💡 Suggested Fix: func _physics_process(delta): if not is_instance_valid(self): return velocity.y += gravity * delta move_and_slide() ───────────────────────────────────── Summary: • Total Messages: 24 • Errors: 3 (🔴) • Warnings: 5 (🟡) • Info: 16 (🔵) Most Recent Error: res://scripts/player.gd:67 - Null instance in _physics_process ═══════════════════════════════════════ Would you like me to help fix any of these errors? ``` # Error History Tracking Keep track of errors across debug sessions: - Store error fingerprints (file + line + error type) - Track if error is new or recurring - Show resolution history if previously fixed Example: ``` [ERROR] (Recurring) Null instance access This error has occurred 3 times in the last hour Previously seen: 14:15, 14:22, 14:35 Note: This might indicate a deeper issue with your code structure. Consider adding more robust null checks or restructuring your node references. ``` # Implementation Notes 1. **Parse debug output intelligently** - Extract file paths as clickable links (if terminal supports it) - Parse stack traces into structured format - Identify error patterns automatically 2. **Color coding** (if terminal supports it) - Red for errors - Yellow for warnings - Blue for info - Gray for debug 3. **Smart filtering** - Remember user's last filter choice - Allow regex patterns for advanced filtering - Group similar errors together 4. **Quick actions** - Offer to open file at error line - Suggest running godot-debugging skill - Provide quick fix options After displaying the enhanced debug output, remind the user: "💡 Tip: I can help fix these errors! Just ask about any specific error and I'll provide a detailed explanation and fix using the godot-debugging skill."