Migrated from design-system-swarm with fresh git history.
Old project history preserved in /home/overbits/apps/design-system-swarm
Core components:
- MCP Server (Python FastAPI with mcp 1.23.1)
- Claude Plugin (agents, commands, skills, strategies, hooks, core)
- DSS Backend (dss-mvp1 - token translation, Figma sync)
- Admin UI (Node.js/React)
- Server (Node.js/Express)
- Storybook integration (dss-mvp1/.storybook)
Self-contained configuration:
- All paths relative or use DSS_BASE_PATH=/home/overbits/dss
- PYTHONPATH configured for dss-mvp1 and dss-claude-plugin
- .env file with all configuration
- Claude plugin uses ${CLAUDE_PLUGIN_ROOT} for portability
Migration completed: $(date)
🤖 Clean migration with full functionality preserved
472 lines
8.4 KiB
Markdown
472 lines
8.4 KiB
Markdown
# Troubleshooting Guide
|
|
|
|
Common issues and solutions for DSS (Design System Server).
|
|
|
|
## Table of Contents
|
|
|
|
- [Installation Issues](#installation-issues)
|
|
- [Server Issues](#server-issues)
|
|
- [Figma Integration Issues](#figma-integration-issues)
|
|
- [Token Ingestion Issues](#token-ingestion-issues)
|
|
- [Test Failures](#test-failures)
|
|
- [Performance Issues](#performance-issues)
|
|
- [Database Issues](#database-issues)
|
|
|
|
## Installation Issues
|
|
|
|
### Python Version Error
|
|
|
|
**Problem**: `Python 3.10+ is required`
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Check your Python version
|
|
python3 --version
|
|
|
|
# Install Python 3.10+ if needed (Ubuntu/Debian)
|
|
sudo apt update
|
|
sudo apt install python3.10 python3.10-venv python3-pip
|
|
|
|
# Or use pyenv
|
|
pyenv install 3.10.0
|
|
pyenv local 3.10.0
|
|
```
|
|
|
|
### pip Install Fails
|
|
|
|
**Problem**: `error: externally-managed-environment`
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Use virtual environment (recommended)
|
|
python3 -m venv .venv
|
|
source .venv/bin/activate
|
|
pip install -r requirements.txt
|
|
|
|
# Or use --break-system-packages (not recommended)
|
|
pip install --break-system-packages -r requirements.txt
|
|
```
|
|
|
|
### Permission Denied on setup.sh
|
|
|
|
**Problem**: `Permission denied: ./setup.sh`
|
|
|
|
**Solution**:
|
|
```bash
|
|
chmod +x setup.sh
|
|
./setup.sh
|
|
```
|
|
|
|
## Server Issues
|
|
|
|
### Port Already in Use
|
|
|
|
**Problem**: `Address already in use: 3456`
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Find process using port 3456
|
|
lsof -i :3456
|
|
|
|
# Kill the process
|
|
kill -9 <PID>
|
|
|
|
# Or use different port
|
|
PORT=3457 python -m tools.api.server
|
|
```
|
|
|
|
### ModuleNotFoundError
|
|
|
|
**Problem**: `ModuleNotFoundError: No module named 'tools'`
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Ensure you're in project root
|
|
cd /path/to/dss
|
|
|
|
# Activate virtual environment
|
|
source .venv/bin/activate
|
|
|
|
# Verify Python path
|
|
python3 -c "import sys; print(sys.path)"
|
|
|
|
# Run from project root
|
|
python3 -m tools.api.server
|
|
```
|
|
|
|
### Server Starts But Can't Connect
|
|
|
|
**Problem**: Server starts but `curl http://localhost:3456/status` fails
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Check server is actually running
|
|
ps aux | grep "tools.api.server"
|
|
|
|
# Check logs for errors
|
|
tail -f .dss/logs/server.log
|
|
|
|
# Verify port binding
|
|
netstat -tulpn | grep 3456
|
|
|
|
# Try 127.0.0.1 instead of localhost
|
|
curl http://127.0.0.1:3456/status
|
|
```
|
|
|
|
## Figma Integration Issues
|
|
|
|
### Figma API Returns Empty
|
|
|
|
**Problem**: `extract_variables()` returns 0 tokens
|
|
|
|
**Possible Causes & Solutions**:
|
|
|
|
1. **No Variables in File**
|
|
```bash
|
|
# Check if file has Variables (requires Figma Pro/Org)
|
|
# Variables are different from Styles
|
|
```
|
|
|
|
2. **Wrong File Key**
|
|
```bash
|
|
# Get file key from URL:
|
|
# https://figma.com/file/FILE_KEY/...
|
|
# Use FILE_KEY, not the file name
|
|
```
|
|
|
|
3. **Invalid Token**
|
|
```bash
|
|
# Verify token is valid
|
|
curl -H "X-Figma-Token: $FIGMA_TOKEN" \
|
|
https://api.figma.com/v1/me
|
|
|
|
# Should return your user info
|
|
```
|
|
|
|
4. **Use Styles Instead**
|
|
```python
|
|
# For community files, use styles
|
|
result = await suite.extract_styles(file_key)
|
|
```
|
|
|
|
### Figma API Rate Limiting
|
|
|
|
**Problem**: `429 Too Many Requests`
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Increase cache TTL
|
|
export FIGMA_CACHE_TTL=600 # 10 minutes
|
|
|
|
# Add delay between requests
|
|
import asyncio
|
|
await asyncio.sleep(1)
|
|
```
|
|
|
|
### Figma Token Not Found
|
|
|
|
**Problem**: `FigmaToken environment variable not set`
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Add to .env file
|
|
echo "FIGMA_TOKEN=figd_your_token_here" >> .env
|
|
|
|
# Or export directly
|
|
export FIGMA_TOKEN=figd_your_token_here
|
|
|
|
# Verify
|
|
echo $FIGMA_TOKEN
|
|
```
|
|
|
|
## Token Ingestion Issues
|
|
|
|
### Tailwind Parser Returns 0 Tokens
|
|
|
|
**Problem**: Tailwind config parsed but no tokens extracted
|
|
|
|
**Known Issue**: Regex doesn't match all config formats
|
|
|
|
**Workaround**:
|
|
```python
|
|
# Use JSON tokens instead
|
|
import json
|
|
from tools.ingest.json_tokens import JSONTokenSource
|
|
|
|
# Convert Tailwind to JSON format
|
|
tokens_json = {
|
|
"color": {
|
|
"primary": {"value": "#3B82F6", "type": "color"}
|
|
}
|
|
}
|
|
|
|
parser = JSONTokenSource()
|
|
result = await parser.extract(json.dumps(tokens_json))
|
|
```
|
|
|
|
### CSS Variables Not Extracted
|
|
|
|
**Problem**: CSS parsed but tokens not found
|
|
|
|
**Solution**:
|
|
```python
|
|
# Ensure using :root selector
|
|
css_content = """
|
|
:root {
|
|
--color-primary: #3B82F6; /* This works */
|
|
}
|
|
|
|
.class {
|
|
--local-var: red; /* This doesn't work (scoped) */
|
|
}
|
|
"""
|
|
```
|
|
|
|
### SCSS Import Errors
|
|
|
|
**Problem**: `@import` statements cause parsing errors
|
|
|
|
**Solution**:
|
|
```python
|
|
# DSS doesn't resolve @import
|
|
# Extract the compiled CSS instead, or inline variables
|
|
```
|
|
|
|
## Test Failures
|
|
|
|
### Async Tests Skipped
|
|
|
|
**Problem**: All `@pytest.mark.asyncio` tests skipped
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Install pytest-asyncio
|
|
pip install pytest-asyncio
|
|
|
|
# Verify installation
|
|
pytest --version
|
|
# Should show: plugins: asyncio-...
|
|
|
|
# Run tests again
|
|
pytest tests/
|
|
```
|
|
|
|
### Tests Fail: "database is locked"
|
|
|
|
**Problem**: SQLite database locked during tests
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Use separate test database
|
|
export TEST_DB_PATH=.dss/test.db
|
|
|
|
# Or delete lock file
|
|
rm -f .dss/dss.db-lock
|
|
|
|
# Run tests
|
|
pytest
|
|
```
|
|
|
|
### Import Errors in Tests
|
|
|
|
**Problem**: `ModuleNotFoundError` in test files
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Run from project root
|
|
cd /path/to/dss
|
|
|
|
# Verify pytest.ini exists and has:
|
|
# pythonpath = .
|
|
|
|
# Run with python path
|
|
PYTHONPATH=. pytest tests/
|
|
```
|
|
|
|
## Performance Issues
|
|
|
|
### Slow File Scanning
|
|
|
|
**Problem**: Project scan takes >10 seconds
|
|
|
|
**Solution**:
|
|
```python
|
|
# Add more directories to skip
|
|
scanner = ProjectScanner(
|
|
path=".",
|
|
exclude=['node_modules', '.git', 'dist', 'build', '.venv']
|
|
)
|
|
|
|
# Use cache
|
|
scanner = ProjectScanner(path=".", use_cache=True)
|
|
|
|
# Scan specific subdirectories only
|
|
scanner = ProjectScanner(path="./src")
|
|
```
|
|
|
|
### High Memory Usage
|
|
|
|
**Problem**: Python process using >1GB RAM
|
|
|
|
**Solution**:
|
|
```python
|
|
# Process tokens in batches
|
|
for batch in batches(tokens, 1000):
|
|
process_batch(batch)
|
|
|
|
# Clear collections after use
|
|
collection.tokens.clear()
|
|
|
|
# Use generators for large datasets
|
|
def token_generator():
|
|
for token in large_dataset:
|
|
yield process(token)
|
|
```
|
|
|
|
### Slow Figma API Calls
|
|
|
|
**Problem**: Figma extraction takes >30 seconds
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Check network latency
|
|
ping api.figma.com
|
|
|
|
# Use local JSON export for development
|
|
figma export --format json
|
|
|
|
# Increase cache TTL
|
|
export FIGMA_CACHE_TTL=3600 # 1 hour
|
|
```
|
|
|
|
## Database Issues
|
|
|
|
### Database Corruption
|
|
|
|
**Problem**: `database disk image is malformed`
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Backup database
|
|
cp .dss/dss.db .dss/dss.db.backup
|
|
|
|
# Try to repair
|
|
sqlite3 .dss/dss.db "PRAGMA integrity_check;"
|
|
|
|
# If corrupt, restore from backup or delete
|
|
rm .dss/dss.db
|
|
# Database will be recreated on next run
|
|
```
|
|
|
|
### Can't Write to Database
|
|
|
|
**Problem**: `attempt to write a readonly database`
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Check permissions
|
|
ls -l .dss/dss.db
|
|
|
|
# Fix permissions
|
|
chmod 644 .dss/dss.db
|
|
chown $USER:$USER .dss/dss.db
|
|
|
|
# Check parent directory is writable
|
|
ls -ld .dss/
|
|
chmod 755 .dss/
|
|
```
|
|
|
|
## Getting Help
|
|
|
|
### Check Logs
|
|
|
|
```bash
|
|
# Server logs
|
|
tail -f .dss/logs/server.log
|
|
|
|
# MCP server logs
|
|
tail -f .dss/logs/mcp.log
|
|
|
|
# Application logs
|
|
python -m tools.api.server --log-level DEBUG
|
|
```
|
|
|
|
### Debug Mode
|
|
|
|
```bash
|
|
# Enable debug logging
|
|
export LOG_LEVEL=DEBUG
|
|
|
|
# Run with verbose output
|
|
python -m tools.api.server -vv
|
|
```
|
|
|
|
### Still Stuck?
|
|
|
|
1. **Search Issues**: https://github.com/your-org/dss/issues
|
|
2. **Open Issue**: Provide:
|
|
- DSS version (`git describe --tags`)
|
|
- Python version (`python3 --version`)
|
|
- Operating system
|
|
- Full error message
|
|
- Steps to reproduce
|
|
3. **Check Documentation**:
|
|
- README.md
|
|
- QUICKSTART.md
|
|
- ARCHITECTURE.md
|
|
- CODE_QUALITY.md
|
|
|
|
## Common Error Messages
|
|
|
|
### "RuntimeError: Event loop is closed"
|
|
|
|
**Solution**:
|
|
```python
|
|
# Use asyncio.run() for top-level async calls
|
|
import asyncio
|
|
|
|
async def main():
|
|
result = await some_async_function()
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|
|
```
|
|
|
|
### "JSONDecodeError: Expecting value"
|
|
|
|
**Solution**:
|
|
```python
|
|
# Check JSON is valid
|
|
import json
|
|
|
|
try:
|
|
data = json.loads(content)
|
|
except json.JSONDecodeError as e:
|
|
print(f"Invalid JSON: {e}")
|
|
print(f"Content: {content[:100]}")
|
|
```
|
|
|
|
### "ConnectionRefusedError: [Errno 111]"
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Server not running - start it
|
|
python -m tools.api.server
|
|
|
|
# Or check correct host/port
|
|
curl http://127.0.0.1:3456/status
|
|
```
|
|
|
|
## Prevention Tips
|
|
|
|
1. **Always use virtual environment**
|
|
2. **Run tests before committing**
|
|
3. **Keep dependencies updated**
|
|
4. **Check logs regularly**
|
|
5. **Use .env for configuration**
|
|
6. **Back up database periodically**
|
|
|
|
---
|
|
|
|
Can't find your issue? Open a GitHub issue with details!
|