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
128 lines
3.0 KiB
Python
128 lines
3.0 KiB
Python
"""
|
|
DSS Configuration Management
|
|
|
|
Secure configuration loading with:
|
|
- Environment variables (highest priority)
|
|
- .env files
|
|
- Default values
|
|
|
|
Never logs or exposes sensitive values.
|
|
"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from typing import Optional
|
|
from dataclasses import dataclass
|
|
|
|
# Try to load dotenv if available
|
|
try:
|
|
from dotenv import load_dotenv
|
|
# Load from multiple possible locations (first found wins)
|
|
project_root = Path(__file__).parent.parent
|
|
env_locations = [
|
|
project_root / ".env", # Project root
|
|
project_root / "dss-mvp1" / ".env", # dss-mvp1 subdirectory
|
|
]
|
|
for env_path in env_locations:
|
|
if env_path.exists():
|
|
load_dotenv(env_path)
|
|
break
|
|
except ImportError:
|
|
pass
|
|
|
|
|
|
@dataclass
|
|
class FigmaConfig:
|
|
"""Figma API configuration."""
|
|
token: Optional[str] = None
|
|
cache_ttl: int = 300 # 5 minutes
|
|
|
|
@classmethod
|
|
def from_env(cls) -> "FigmaConfig":
|
|
return cls(
|
|
token=os.getenv("FIGMA_TOKEN"),
|
|
cache_ttl=int(os.getenv("FIGMA_CACHE_TTL", "300"))
|
|
)
|
|
|
|
@property
|
|
def is_configured(self) -> bool:
|
|
return bool(self.token)
|
|
|
|
|
|
@dataclass
|
|
class DatabaseConfig:
|
|
"""Database configuration."""
|
|
path: str = ".dss/dss.db"
|
|
|
|
@classmethod
|
|
def from_env(cls) -> "DatabaseConfig":
|
|
return cls(
|
|
path=os.getenv("DATABASE_PATH", ".dss/dss.db")
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class ServerConfig:
|
|
"""Server configuration."""
|
|
port: int = 3456
|
|
host: str = "0.0.0.0"
|
|
env: str = "development"
|
|
log_level: str = "info"
|
|
|
|
@classmethod
|
|
def from_env(cls) -> "ServerConfig":
|
|
return cls(
|
|
port=int(os.getenv("PORT", "3456")),
|
|
host=os.getenv("HOST", "0.0.0.0"),
|
|
env=os.getenv("NODE_ENV", "development"),
|
|
log_level=os.getenv("LOG_LEVEL", "info")
|
|
)
|
|
|
|
@property
|
|
def is_production(self) -> bool:
|
|
return self.env == "production"
|
|
|
|
|
|
@dataclass
|
|
class Config:
|
|
"""Main configuration container."""
|
|
figma: FigmaConfig
|
|
database: DatabaseConfig
|
|
server: ServerConfig
|
|
|
|
@classmethod
|
|
def load(cls) -> "Config":
|
|
"""Load configuration from environment."""
|
|
return cls(
|
|
figma=FigmaConfig.from_env(),
|
|
database=DatabaseConfig.from_env(),
|
|
server=ServerConfig.from_env()
|
|
)
|
|
|
|
def summary(self) -> dict:
|
|
"""Return config summary (no secrets)."""
|
|
return {
|
|
"figma": {
|
|
"configured": self.figma.is_configured,
|
|
"cache_ttl": self.figma.cache_ttl
|
|
},
|
|
"database": {
|
|
"path": self.database.path
|
|
},
|
|
"server": {
|
|
"port": self.server.port,
|
|
"env": self.server.env,
|
|
"log_level": self.server.log_level
|
|
}
|
|
}
|
|
|
|
|
|
# Global config instance
|
|
config = Config.load()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import json
|
|
print("DSS Configuration:")
|
|
print(json.dumps(config.summary(), indent=2))
|