- Removed timestamps from sidebar room names
- Removed "Using current Ollama" status display
- Removed send button (enter key works)
- Buried Reset Demo Data button
- Moved participants badges directly under room title
- Message input properly clears on send
- Fixed all AgentCard → Persona model updates
- Added Dev Assistant persona with Claude oneshot backend
- Configured tool capabilities: shell_command, screenshot, search, events
- Fixed capability atom conversion for new tool types
- Tools properly passed to agent via filter_tools_for_agent function
- Added pre-commit hook to check Elixir compilation
- Fixed all compilation warnings
- Cleaned up unused functions and aliases
- All 6 personas now load successfully
- Provider: claude_oneshot (uses Claude CLI)
- Model: claude-3-5-sonnet-20241022
- Tools: shell_command, take_screenshot, search_messages, get_recent_events, get_current_time, create_room
- Capabilities: tool_use, technical_analysis, code_review, system_diagnostics
- Maya (assistant) - Ollama/qwen2.5:latest - Coffee Chat
- Coda (expert) - Ollama/qwen2.5-coder:latest - Technical Help
- Alex (friend) - Claude oneshot/claude-3-sonnet - casual chat
- Jordan Chen (employee) - OpenRouter/qwen-2.5-72b - product management
- Sage (character) - Claude oneshot/claude-3-opus - philosophy
- Dev Assistant (expert) - Claude oneshot/claude-3-5-sonnet - tools & development
Steps:
-
Start ash_chat server (30s)
- Input: Clean slate
- Output: Server running on localhost:4000
- Verification: Can access chat interface
-
Trigger duplicate message scenario (60s)
- Input: User sends message, immediately clicks "retrigger"
- Output: Should see warning "Agents are already responding"
- Verification: No duplicate messages appear
-
Test agent name consistency (30s)
- Input: Agent responds in chat
- Output: Agent name displays from database, not "Assistant"
- Verification: Name matches agent card name
Steps:
-
Test Node.js MCP server directly (60s)
- Input:
echo '{"method":"tools/list","id":1}' | node claude-spawner.js - Output: JSON response with spawn_claude tool
- Verification: Valid JSON, no errors
- Input:
-
Test simple spawn via command line (90s)
- Input: Manual MCP call with simple prompt
- Output: Spawned Claude response
- Verification: Response contains expected content + spawn metadata
-
Document working example (30s)
- Input: Working command sequence
- Output: README section with copy-paste example
- Verification: Others can reproduce the test
- Test tool usage (shell commands, screenshots, etc.)
- Verify Claude oneshot backend integration works
- Test agent responses with different persona types
Steps:
-
Research SillyTavern JSON format (60s)
- Input: SillyTavern documentation/examples
- Output: Sample JSON structure documented
- Verification: Know required fields (name, description, etc.)
-
Add file upload to personas page (90s)
- Input: Existing personas LiveView
- Output: File input accepts .json files
- Verification: Can select JSON file
-
Parse and create Persona (60s)
- Input: Uploaded JSON file
- Output: New Persona record in database
- Verification: Card appears in personas list
Steps:
-
Audit current setup script (30s)
- Input: setup-dependencies.sh
- Output: List of what's actually needed vs over-engineered
- Verification: Clear list of requirements
-
Create minimal version (60s)
- Input: Essential requirements only
- Output: Simplified script (≤10 lines)
- Verification: Still installs claude-code-mcp successfully
-
Test and replace (30s)
- Input: Clean environment
- Output: Dependencies installed via minimal script
- Verification: MCP servers work
Steps:
-
Create test script skeleton (30s)
- Input: Known working MCP calls
- Output: Shell script with test functions
- Verification: Script runs without errors
-
Add spawn tests (60s)
- Input: spawn_claude and spawn_status tools
- Output: Automated tests for each tool
- Verification: Pass/fail results for each test
-
Add safety limit tests (60s)
- Input: Concurrent/depth limit scenarios
- Output: Tests that verify limits are enforced
- Verification: Proper blocking when limits exceeded
# Reset demo data
mix run -e 'AshChat.SetupV2.reset_demo_data()'
# List rooms
mix run -e 'AshChat.Resources.Room.read!() |> Enum.each(&IO.puts("#{&1.title}: #{&1.id}"))'
# List personas
mix run -e 'AshChat.Resources.Persona.read!() |> Enum.each(&IO.puts("#{&1.name} (#{&1.provider})"))'- Tools are correctly filtered per agent via
available_toolsfield - Claude oneshot integration exists but needs testing
- Pre-commit hooks prevent broken code from being committed
- All personas use different backends demonstrating multi-provider support
Total estimated time for high priority: ~13 minutes All steps have clear inputs/outputs and can be executed independently