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
215 lines
6.2 KiB
Python
Executable File
215 lines
6.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Iteration 1: Core Validation Test Suite
|
|
Tests all token ingestion, analysis, and Storybook functionality
|
|
"""
|
|
|
|
import asyncio
|
|
import sys
|
|
import json
|
|
from pathlib import Path
|
|
|
|
# Add tools to path
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
async def test_css_ingestion():
|
|
"""Test CSS token ingestion"""
|
|
print("\n=== Testing CSS Token Ingestion ===")
|
|
from tools.ingest.css import CSSTokenSource
|
|
|
|
# Test CSS
|
|
css_content = """
|
|
:root {
|
|
--primary-color: #3B82F6;
|
|
--spacing-md: 16px;
|
|
--font-size-base: 16px;
|
|
}
|
|
"""
|
|
|
|
try:
|
|
parser = CSSTokenSource()
|
|
collection = await parser.extract(css_content)
|
|
print(f"✅ CSS: Parsed {len(collection.tokens)} tokens")
|
|
for token in collection.tokens[:3]:
|
|
print(f" - {token.name}: {token.value}")
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ CSS Error: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
async def test_scss_ingestion():
|
|
"""Test SCSS token ingestion"""
|
|
print("\n=== Testing SCSS Token Ingestion ===")
|
|
from tools.ingest.scss import SCSSTokenSource
|
|
|
|
scss_content = """
|
|
$primary: #3B82F6;
|
|
$spacing-md: 16px;
|
|
$font-family: 'Inter', sans-serif;
|
|
"""
|
|
|
|
try:
|
|
parser = SCSSTokenSource()
|
|
tokens = await parser.parse(scss_content)
|
|
print(f"✅ SCSS: Parsed {len(tokens)} tokens")
|
|
for token in tokens[:3]:
|
|
print(f" - {token.name}: {token.value}")
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ SCSS Error: {e}")
|
|
return False
|
|
|
|
async def test_tailwind_ingestion():
|
|
"""Test Tailwind config ingestion"""
|
|
print("\n=== Testing Tailwind Token Ingestion ===")
|
|
from tools.ingest.tailwind import TailwindTokenSource
|
|
|
|
config_content = """
|
|
module.exports = {
|
|
theme: {
|
|
colors: {
|
|
primary: '#3B82F6',
|
|
secondary: '#10B981',
|
|
},
|
|
spacing: {
|
|
'sm': '8px',
|
|
'md': '16px',
|
|
}
|
|
}
|
|
}
|
|
"""
|
|
|
|
try:
|
|
parser = TailwindTokenSource()
|
|
tokens = await parser.parse(config_content)
|
|
print(f"✅ Tailwind: Parsed {len(tokens)} tokens")
|
|
for token in tokens[:3]:
|
|
print(f" - {token.name}: {token.value}")
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ Tailwind Error: {e}")
|
|
return False
|
|
|
|
async def test_json_ingestion():
|
|
"""Test JSON token ingestion"""
|
|
print("\n=== Testing JSON Token Ingestion ===")
|
|
from tools.ingest.json_tokens import JSONTokenSource
|
|
|
|
json_content = {
|
|
"color": {
|
|
"primary": {
|
|
"500": {"value": "#3B82F6", "type": "color"}
|
|
}
|
|
},
|
|
"spacing": {
|
|
"md": {"value": "16px", "type": "dimension"}
|
|
}
|
|
}
|
|
|
|
try:
|
|
parser = JSONTokenSource()
|
|
tokens = await parser.parse(json.dumps(json_content))
|
|
print(f"✅ JSON: Parsed {len(tokens)} tokens")
|
|
for token in tokens[:3]:
|
|
print(f" - {token.name}: {token.value}")
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ JSON Error: {e}")
|
|
return False
|
|
|
|
async def test_token_merge():
|
|
"""Test token merging"""
|
|
print("\n=== Testing Token Merge ===")
|
|
from tools.ingest.merge import TokenMerger, MergeStrategy
|
|
from tools.ingest.base import DesignToken
|
|
|
|
try:
|
|
tokens_a = [
|
|
DesignToken(name="color.primary", value="#FF0000", type="color", source="css"),
|
|
DesignToken(name="spacing.md", value="16px", type="dimension", source="css"),
|
|
]
|
|
|
|
tokens_b = [
|
|
DesignToken(name="color.primary", value="#3B82F6", type="color", source="figma"),
|
|
DesignToken(name="color.secondary", value="#10B981", type="color", source="figma"),
|
|
]
|
|
|
|
merger = TokenMerger(strategy=MergeStrategy.PREFER_FIGMA)
|
|
result = await merger.merge([tokens_a, tokens_b])
|
|
|
|
print(f"✅ Merge: {len(result.tokens)} tokens, {len(result.conflicts)} conflicts")
|
|
if result.conflicts:
|
|
print(f" Conflicts resolved:")
|
|
for conflict in result.conflicts:
|
|
print(f" - {conflict.token_name}: chose {conflict.chosen_value}")
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ Merge Error: {e}")
|
|
return False
|
|
|
|
async def test_figma_tools():
|
|
"""Test Figma integration"""
|
|
print("\n=== Testing Figma Integration ===")
|
|
from tools.figma.figma_tools import FigmaToolSuite
|
|
|
|
try:
|
|
# Test with mock mode (no API key)
|
|
suite = FigmaToolSuite(output_dir="./test_output")
|
|
print(f"✅ Figma: Mode = {suite.mode}")
|
|
|
|
# Test mock data
|
|
file_key = "test123"
|
|
components = await suite.extract_components(file_key)
|
|
print(f" Components: {components.get('components_count', 0)}")
|
|
|
|
styles = await suite.extract_styles(file_key)
|
|
print(f" Styles: {styles.get('styles_count', 0)}")
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ Figma Error: {e}")
|
|
return False
|
|
|
|
async def main():
|
|
"""Run all tests"""
|
|
print("=" * 60)
|
|
print("DSS ITERATION 1: CORE VALIDATION")
|
|
print("=" * 60)
|
|
|
|
results = []
|
|
|
|
# Token Ingestion Tests
|
|
results.append(("CSS Ingestion", await test_css_ingestion()))
|
|
results.append(("SCSS Ingestion", await test_scss_ingestion()))
|
|
results.append(("Tailwind Ingestion", await test_tailwind_ingestion()))
|
|
results.append(("JSON Ingestion", await test_json_ingestion()))
|
|
results.append(("Token Merge", await test_token_merge()))
|
|
results.append(("Figma Tools", await test_figma_tools()))
|
|
|
|
# Summary
|
|
print("\n" + "=" * 60)
|
|
print("TEST SUMMARY")
|
|
print("=" * 60)
|
|
|
|
passed = sum(1 for _, result in results if result)
|
|
total = len(results)
|
|
|
|
for name, result in results:
|
|
status = "✅ PASS" if result else "❌ FAIL"
|
|
print(f"{status}: {name}")
|
|
|
|
print(f"\nPassed: {passed}/{total} ({100*passed//total}%)")
|
|
|
|
if passed == total:
|
|
print("\n🎉 ALL TESTS PASSED!")
|
|
return 0
|
|
else:
|
|
print(f"\n⚠️ {total - passed} TEST(S) FAILED")
|
|
return 1
|
|
|
|
if __name__ == "__main__":
|
|
exit_code = asyncio.run(main())
|
|
sys.exit(exit_code)
|