Initial commit: Clean DSS implementation

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
This commit is contained in:
Digital Production Factory
2025-12-09 18:45:48 -03:00
commit 276ed71f31
884 changed files with 373737 additions and 0 deletions

View File

@@ -0,0 +1,510 @@
# Plugin Marketplace Architecture Analysis
**Date**: 2025-12-06
**Status**: ✅ Analysis Complete - Hybrid Architecture Recommended
**Confidence**: Very High (90%+)
**Validated By**: Gemini 3 Pro Preview (6-step thinkdeep analysis)
---
## Executive Summary
**Question**: Should we build a plugin marketplace on our DSS server for plugin distribution?
**Answer**: **NO** to full marketplace. **YES** to lightweight hybrid architecture.
**Recommendation**: GitHub hosting + DSS Registry API (Hybrid Model)
---
## Analysis Results
### 🔍 Key Discovery
Claude Code already supports **multiple GitHub-based plugin marketplaces** via the `extraKnownMarketplaces` setting in `.claude/settings.json`:
```json
{
"extraKnownMarketplaces": [
{
"name": "My Marketplace",
"url": "https://github.com/user/repo",
"description": "Custom plugins"
}
]
}
```
**Implication**: The infrastructure for plugin distribution already exists. We don't need to reinvent it.
---
## Architecture Comparison
| Aspect | Full Marketplace | Hybrid (Recommended) |
|--------|------------------|---------------------|
| **Implementation Time** | 5-7 weeks | 2-3 days |
| **Maintenance Burden** | ~40 hrs/month | ~2 hrs/month |
| **Security Risk** | High | Low |
| **Infrastructure Needed** | File hosting, CDN, backups, versioning | Simple REST API |
| **GitHub Integration** | Manual sync | Direct consumption |
| **Development Cost** | $20-30K equivalent | ~$1K equivalent |
---
## Recommended Architecture: Hybrid Model
### Components
**1. GitHub (File Hosting & Distribution)**
- Hosts actual plugin files (`.py`, `.json`, etc.)
- Provides version control, code review, audit trail
- Handles security scanning, access control
- Free infrastructure (GitHub Pages, Releases)
**2. DSS Registry API (Discovery & Analytics)**
- Lightweight REST API on DSS server
- Provides plugin discovery, search, categories
- Tracks download/usage analytics per team
- Enables private plugin sharing within organizations
**3. Claude Code (Installation)**
- Users add GitHub URLs to `extraKnownMarketplaces`
- Existing Claude Code plugin system handles installation
- Zero changes needed to Claude Code itself
### Data Flow
```
┌──────────────┐
│ GitHub │ Hosts: plugin files, metadata, releases
│ (Storage) │
└──────┬───────┘
│ ① Fetch metadata
┌──────▼───────┐
│ DSS Registry │ Provides: search, analytics, team features
│ API │
└──────┬───────┘
│ ② Query available plugins
┌──────▼───────┐
│ Claude Code │ Displays: plugin browser, install instructions
│ UI │
└──────┬───────┘
│ ③ Install: Add to extraKnownMarketplaces
┌──────▼───────┐
│ User │
└──────────────┘
```
---
## Implementation Plan
### Phase 1: Registry API (2-3 days)
**API Endpoints**:
```
GET /api/plugins/registry - List all registered plugins
GET /api/plugins/search?q={query} - Search plugins
GET /api/plugins/{id} - Get plugin details + analytics
POST /api/plugins/register - Register new plugin (GitHub URL)
POST /api/plugins/{id}/analytics - Track download/usage event
```
**Database Schema**:
```sql
-- plugins table
CREATE TABLE plugins (
id VARCHAR(50) PRIMARY KEY,
name VARCHAR(200) NOT NULL,
description TEXT,
github_url VARCHAR(500) NOT NULL,
author VARCHAR(100),
category VARCHAR(50),
tags TEXT[],
version VARCHAR(20),
downloads_count INTEGER DEFAULT 0,
rating_avg DECIMAL(3,2),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- plugin_analytics table
CREATE TABLE plugin_analytics (
id SERIAL PRIMARY KEY,
plugin_id VARCHAR(50) REFERENCES plugins(id),
team_id VARCHAR(50),
event_type VARCHAR(20), -- install, uninstall, usage
timestamp TIMESTAMP DEFAULT NOW()
);
```
**GitHub Integration**:
```python
async def sync_plugin_metadata(plugin_id: str, github_url: str):
"""Fetch plugin.json from GitHub and update registry."""
# Parse GitHub URL
# Fetch raw content of .claude-plugin/plugin.json
# Validate schema
# Update database with metadata
# Cache for 1 hour
```
### Phase 2: Dynamic Plugin Loader ⚠️ CRITICAL
**Current Problem**:
- Plugins are hardcoded in `tools/dss_mcp/tools/project_tools.py`
- Adding a new plugin requires manual code changes
- No auto-discovery mechanism
**Solution**: Create plugin auto-loader
**File**: `tools/dss_mcp/plugin_loader.py`
```python
"""Dynamic plugin loader for DSS MCP server."""
import importlib
import pkgutil
import logging
from pathlib import Path
from typing import List, Dict, Any
logger = logging.getLogger(__name__)
def load_plugins(plugin_dirs: List[str] = None) -> List[Dict[str, Any]]:
"""
Dynamically load all plugins from specified directories.
Plugin Contract:
- Must be a Python module (.py file)
- Must expose EXPORT_TOOLS variable (list of MCP tool definitions)
- Optional: PLUGIN_METADATA dict with name, version, author
Args:
plugin_dirs: List of directories to scan. Defaults to ['tools'].
Returns:
List of MCP tool definitions from all discovered plugins.
"""
if plugin_dirs is None:
plugin_dirs = ['tools']
registry = []
for plugin_dir in plugin_dirs:
plugin_path = Path(plugin_dir)
if not plugin_path.exists():
logger.warning(f"Plugin directory not found: {plugin_dir}")
continue
# Scan for Python modules
for module_file in plugin_path.glob('*.py'):
if module_file.name.startswith('_'):
continue # Skip __init__.py, __pycache__, etc.
module_name = module_file.stem
try:
# Dynamically import the module
spec = importlib.util.spec_from_file_location(
f"plugins.{module_name}",
module_file
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Check for plugin contract compliance
if hasattr(module, 'EXPORT_TOOLS'):
tools = module.EXPORT_TOOLS
registry.extend(tools)
metadata = getattr(module, 'PLUGIN_METADATA', {})
logger.info(
f"Loaded plugin: {metadata.get('name', module_name)} "
f"({len(tools)} tools)"
)
else:
logger.debug(
f"Skipping {module_name} (no EXPORT_TOOLS variable)"
)
except Exception as e:
logger.error(f"Failed to load plugin {module_name}: {e}")
return registry
```
**Plugin Contract Example**:
```python
# tools/network_logger.py - Example plugin
PLUGIN_METADATA = {
"name": "Network Logger",
"version": "1.0.0",
"author": "DSS Team",
"description": "Captures and analyzes browser network traffic"
}
EXPORT_TOOLS = [
{
"name": "get_network_requests",
"description": "Get browser network requests",
"inputSchema": {
"type": "object",
"properties": {
"filter_type": {
"type": "string",
"enum": ["xhr", "fetch", "all"]
}
}
}
}
]
# Implementation class would go here
```
**Update MCP Server**:
```python
# tools/dss_mcp/server.py
from .plugin_loader import load_plugins
# Instead of hardcoded imports:
# from .tools.project_tools import PROJECT_TOOLS
# from .tools.debug_tools import DEBUG_TOOLS
# Use dynamic loading:
all_tools = load_plugins(['tools/dss_mcp/tools'])
# Register with MCP
for tool in all_tools:
mcp.tool()(tool)
```
### Phase 3: Discovery UI (1-2 days)
**Location**: `admin-ui/plugins.html`
**Features**:
- Browse plugins by category (Design Tools, Testing, Debugging, etc.)
- Search functionality
- Plugin details page with:
- Description, author, version
- Download count, ratings
- GitHub repository link
- Installation instructions
- "Install" button → copies to clipboard:
```json
{
"name": "Network Logger",
"url": "https://github.com/overbits/dss-plugins/tree/main/network-logger",
"description": "Network traffic analyzer"
}
```
**User Flow**:
1. Browse/search plugins at `https://dss.overbits.luz.uy/plugins`
2. Click "Install" → copies GitHub URL
3. Add to `.claude/settings.json` → `extraKnownMarketplaces`
4. Claude Code auto-discovers and installs plugin
### Phase 4: Team Features (Optional, 1-2 days)
- **Private Plugins**: Team-specific plugin repos
- **Usage Analytics**: Which plugins are most used by your team
- **Recommendations**: "Teams like yours also use..."
- **Admin Dashboard**: Manage approved plugins for organization
---
## What We DON'T Need ❌
- ❌ File hosting/storage infrastructure
- ❌ CDN (Content Delivery Network)
- ❌ Backup systems for plugin files
- ❌ Version management (GitHub handles this)
- ❌ Code security scanning (GitHub handles this)
- ❌ User authentication for downloads (GitHub handles access control)
- ❌ Payment processing (free plugins, GitHub Sponsors for premium)
---
## Security Implications
### GitHub-Based (Recommended) ✅
**Strengths**:
- Code review via Pull Requests
- Audit trail (Git history)
- GitHub's security scanning (Dependabot, CodeQL)
- Access control (public/private repos, teams)
- Trusted platform
**Risks**:
- Malicious plugins (mitigated by curated registry)
- Dependency vulnerabilities (mitigated by GitHub scanning)
**Mitigation Strategy**:
1. **Curated Registry**: All plugins require PR review before appearing in registry
2. **Checksum Validation**: Registry stores SHA256 checksums
3. **Dependency Whitelist**: Start with "standard library only" or pre-approved packages
4. **Sandbox Execution**: Future enhancement - run plugins in isolated environment
### Server-Hosted ❌
**Risks**:
- Code injection vulnerabilities
- File upload attacks
- Unvetted code execution
- No audit trail
- Maintenance nightmare
---
## Migration Path
### Existing Plugins
Current structure:
```
dss-claude-plugin/
├── .claude-plugin/
│ └── plugin.json
├── commands/
├── skills/
└── agents/
```
**Step 1**: Create GitHub repo structure
```
dss-plugins/
├── network-logger/
│ ├── .claude-plugin/plugin.json
│ └── network_logger.py
├── performance-analyzer/
│ ├── .claude-plugin/plugin.json
│ └── performance_analyzer.py
└── registry.json # Central registry file
```
**Step 2**: Publish to GitHub
```bash
gh repo create overbits/dss-plugins --public
git push origin main
```
**Step 3**: Register in DSS API
```bash
POST /api/plugins/register
{
"github_url": "https://github.com/overbits/dss-plugins/tree/main/network-logger"
}
```
**Step 4**: Users install
```json
// .claude/settings.json
{
"extraKnownMarketplaces": [
{
"name": "DSS Official Plugins",
"url": "https://github.com/overbits/dss-plugins",
"description": "Official DSS design system plugins"
}
]
}
```
---
## Success Metrics
### Phase 1 (Registry API)
- ✅ API endpoints functional
- ✅ Database schema created
- ✅ GitHub metadata sync working
- ✅ Basic search functional
### Phase 2 (Dynamic Loader)
- ✅ Plugins auto-discovered on server start
- ✅ No manual registration needed
- ✅ Error handling for broken plugins
- ✅ Plugin contract documented
### Phase 3 (Discovery UI)
- ✅ Plugin browser accessible
- ✅ Search & filter working
- ✅ Install flow documented
- ✅ Analytics tracking events
### Phase 4 (Team Features)
- ✅ Private plugin support
- ✅ Team usage dashboard
- ✅ Admin controls functional
---
## Timeline
| Phase | Component | Effort | Priority |
|-------|-----------|--------|----------|
| 2 | Dynamic Plugin Loader | 1 day | 🔴 CRITICAL |
| 1 | Registry API | 2 days | 🟡 High |
| 3 | Discovery UI | 1-2 days | 🟢 Medium |
| 4 | Team Features | 1-2 days | 🔵 Low |
**Total**: 5-7 days for full implementation
**Minimum Viable**: 3 days (Phases 1+2)
---
## Expert Validation Notes
From Gemini 3 Pro Preview analysis:
> "The proposed Hybrid Architecture (GitHub-hosted files + DSS Registry API) is the correct strategic choice. It avoids the 'marketplace antipattern' (building infrastructure for billing/hosting that already exists) while retaining control over discovery and curation."
**Critical Insight**:
> "For this to work practically, the underlying DSS MCP server must be refactored to support **dynamic tool loading**, otherwise 'installing' a plugin requires manual code changes."
**Security Warning**:
> "Code Injection Risk: Downloading Python files and executing them is high-risk. Mitigation: Registry must be curated (PR review required)."
**Dependency Management**:
> "Plugins might require conflicting Python packages. Mitigation: Start with 'standard library only' or pre-approved dependency list (like httpx, numpy)."
---
## Conclusion
**Recommendation**: Implement Hybrid Architecture (GitHub + DSS Registry API)
**Priority Order**:
1. **Phase 2 (Dynamic Loader)** - CRITICAL, blocks everything else
2. **Phase 1 (Registry API)** - Core discovery infrastructure
3. **Phase 3 (Discovery UI)** - Improves UX
4. **Phase 4 (Team Features)** - Nice-to-have
**Total Effort**: 5-7 days
**Maintenance**: ~2 hours/month
**Security Risk**: Low (GitHub handles file hosting)
**Cost**: Minimal (no infrastructure needed)
**Next Steps**:
1. Create `plugin_loader.py` with auto-discovery
2. Define plugin contract documentation
3. Test with example plugin
4. Implement Registry API
5. Create discovery UI
6. Launch with curated initial plugins
---
**Analysis validated by**: Gemini 3 Pro Preview
**Confidence**: Very High (90%+)
**Date**: 2025-12-06