20 KiB
Code Standards & Development Guidelines
1. Python Code Standards (Search Engine & Design System)
1.1 General Style
Compliance: PEP 8 with pragmatism Tools: Black (code formatter), flake8 (linter), mypy (type checking) Min Python: 3.8+
1.2 File Structure
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Module docstring (purpose, usage, examples)
"""
import <stdlib>
from <stdlib> import <specific>
import <third-party>
from <third-party> import <specific>
# ============ CONFIGURATION ============
CONSTANT_NAME = value
DICT_CONFIG = {...}
# ============ CLASS DEFINITIONS ============
class ClassName:
"""Class docstring"""
def __init__(self):
"""Initialize"""
pass
def method_name(self):
"""Method docstring"""
pass
# ============ FUNCTION DEFINITIONS ============
def function_name(param1, param2):
"""Function docstring with Args, Returns, Raises"""
pass
# ============ MAIN ENTRY ============
if __name__ == "__main__":
main()
1.3 Naming Conventions
| Type | Format | Example |
|---|---|---|
| Constants | UPPER_SNAKE_CASE | MAX_RESULTS = 3 |
| Functions | snake_case | def _load_csv(): |
| Classes | PascalCase | class BM25: |
| Private | _snake_case prefix | def _internal_function(): |
| Dunder | name (avoid custom) | __init__, __str__ |
| Variables | snake_case | query_result = [] |
1.4 Docstring Format
def search(query, domain=None, max_results=MAX_RESULTS):
"""
Main search function with auto-domain detection.
Args:
query (str): Search query string
domain (str, optional): Specific domain to search. If None, auto-detect.
max_results (int): Maximum number of results (default: 3)
Returns:
dict: Result dictionary with keys: domain, query, file, count, results
Raises:
FileNotFoundError: If CSV file not found
ValueError: If domain is invalid
Example:
>>> result = search("minimalism", "style", 5)
>>> print(result['count']) # 3
"""
pass
1.5 Imports & Dependencies
Rule: Minimize external dependencies for portability
# Good
import csv
from pathlib import Path
from math import log
# Avoid
import numpy # Not in stdlib, adds weight
import requests # Use only if absolutely necessary
Organization:
- Stdlib imports first
- Third-party imports next (none for search engine)
- Local imports last
- Blank line between groups
1.6 Error Handling
# Good
try:
result = _search_csv(filepath, columns, query, max_results)
except FileNotFoundError:
return {"error": f"File not found: {filepath}", "domain": domain}
except Exception as e:
logger.error(f"Unexpected error: {e}")
raise
# Avoid
try:
# code
except:
pass # Silent failures are bad
1.7 Type Hints
Required for:
- Public function signatures
- Class methods with complex logic
- Design system generator (all methods)
Format:
def _search_csv(
filepath: Path,
search_cols: list[str],
output_cols: list[str],
query: str,
max_results: int
) -> list[dict]:
"""Search CSV and return results."""
pass
# Return types
def get_results(self) -> dict[str, any]:
pass
1.8 Code Comments
Good comments explain WHY, not WHAT:
# Good
# BM25 uses k1=1.5 and b=0.75 (standard tuning for document length normalization)
idf = log((self.N - freq + 0.5) / (freq + 0.5) + 1)
# Avoid
# Calculate log
idf = log((self.N - freq + 0.5) / (freq + 0.5) + 1)
# Good
# Exclude words < 3 chars to reduce noise (and, the, a, etc.)
return [w for w in text.split() if len(w) > 2]
# Avoid
# Filter words
return [w for w in text.split() if len(w) > 2]
1.9 Line Length
- Maximum: 100 characters (flexible for URLs/strings)
- Readability: Break long lines at logical operators
# Good
if (config_exists and
permission_granted and
not already_installed):
proceed()
# Avoid
if config_exists and permission_granted and not already_installed and something_else: proceed()
1.10 CSV Handling
Rules:
- Always use UTF-8 encoding
- Handle missing fields gracefully
- Preserve field order for consistency
- Use DictReader/DictWriter for clarity
# Good
with open(filepath, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
data = list(reader)
# Handle missing
value = row.get('Column', 'default_value')
# Avoid
open(filepath) # No encoding specified
row['Column'] # KeyError if missing
1.11 Windows Compatibility
# Good - UTF-8 for emoji/special chars on Windows
if sys.stdout.encoding and sys.stdout.encoding.lower() != 'utf-8':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# Good - Use pathlib for cross-platform paths
from pathlib import Path
filepath = Path(__file__).parent / "data" / "styles.csv"
# Avoid
filepath = f"{os.getcwd()}\\data\\styles.csv" # Windows-specific
2. TypeScript Code Standards (CLI)
2.1 General Style
Compliance: ESLint (airbnb config) + Prettier Min TypeScript: 4.8+ Target: Node 18+
2.2 File Structure
/**
* Module purpose and usage
*/
import type { TypeName } from './types/index';
import { functionName } from './utils/logger';
// ============ TYPES ============
interface ConfigOptions {
platform: string;
offline?: boolean;
}
// ============ CONSTANTS ============
const PLATFORMS = ['claude', 'cursor', 'windsurf'] as const;
const DEFAULT_TIMEOUT = 30000;
// ============ EXPORTED FUNCTIONS ============
export async function initCommand(options: ConfigOptions): Promise<void> {
// implementation
}
// ============ PRIVATE FUNCTIONS ============
function detectPlatform(): string {
// implementation
}
// ============ MAIN ENTRY ============
export default function main() {
// entry point
}
2.3 Naming Conventions
| Type | Format | Example |
|---|---|---|
| Constants | UPPER_SNAKE_CASE | const MAX_RETRIES = 3 |
| Functions | camelCase | function detectPlatform() |
| Classes | PascalCase | class TemplateRenderer |
| Interfaces | PascalCase | interface ConfigOptions |
| Types | PascalCase | type Platform = 'claude' | 'cursor' |
| Variables | camelCase | let platformName = 'claude' |
| Private | leadingUnderscore | _internalFunction() |
| Files | kebab-case | template-renderer.ts, detect.ts |
2.4 Type Definitions
Rules:
- Always export types from
types/index.ts - Use
typefor unions/aliases,interfacefor objects - Strict null checking enabled
// types/index.ts
export interface InitOptions {
platform: 'claude' | 'cursor' | 'windsurf';
offline?: boolean;
outputDir?: string;
}
export type Platform = InitOptions['platform'];
// Usage
export async function init(options: InitOptions): Promise<void> {
const platform: Platform = options.platform;
}
2.5 Async/Await
// Good
async function downloadAssets(): Promise<void> {
try {
const data = await fetchFromGitHub(url);
await writeFiles(data);
} catch (error) {
logger.error(`Download failed: ${error.message}`);
throw new Error('Failed to download assets');
}
}
// Avoid
function downloadAssets() {
return new Promise((resolve, reject) => {
// callback hell
});
}
2.6 Error Handling
// Good - Custom error types
class InstallerError extends Error {
constructor(message: string, public platform?: string) {
super(message);
this.name = 'InstallerError';
}
}
// Usage
try {
await installSkill(platform);
} catch (error) {
if (error instanceof InstallerError) {
logger.error(`Installation failed for ${error.platform}: ${error.message}`);
} else {
throw error;
}
}
2.7 Comments & Documentation
/**
* Detects the current AI coding assistant platform.
*
* @returns The detected platform name, or 'unknown' if not detected
*
* @example
* const platform = detectPlatform();
* console.log(platform); // 'claude'
*/
function detectPlatform(): string {
// implementation
}
2.8 Module Exports
// Good - Named exports for tree-shaking
export { initCommand } from './commands/init';
export { updateCommand } from './commands/update';
export type { ConfigOptions } from './types/index';
// Avoid
export default { initCommand, updateCommand }; // Default export
export * from './types'; // Wildcard exports (less clear)
3. CSV Data Format Standards
3.1 Structure Requirements
Rules:
- UTF-8 encoding (no BOM)
- Unix line endings (LF, not CRLF)
- Comma-separated values
- Header row with descriptive names
- Consistent data types per column
3.2 CSV Header Naming
# Good - Clear, no special chars
Style Category,Type,Keywords,Best For,Performance,Accessibility
# Avoid
StyleCat,T,KW,BF,Perf,A11y # Unclear abbreviations
style_category,type,keywords # snake_case in CSV (use PascalCase)
3.3 Field Requirements
All Fields:
- Non-empty unless explicitly optional
- Properly escaped if containing quotes/commas
- Consistent data type per column
Style Category,Keywords,Best For
"Glassmorphism","glass, frosted, transparency, modern",SaaS apps
"Claymorphism","clay, soft, rounded, tactile",Educational apps
3.4 Data Consistency
| Domain | Requirement | Example |
|---|---|---|
| Styles | Consistent capitalization | "Glassmorphism" not "glassmorphism" |
| Colors | Valid hex format | #E8B4B8 not E8B4B8 or #e8b4b8 (case-insensitive OK) |
| Products | Consistent categories | "SaaS" not "saas" or "SAAS" |
| URLs | Absolute, http/https | https://fonts.google.com/... |
| Lists | Comma-separated, consistent | "item1, item2, item3" |
3.5 Search Column Selection
Rules:
- Include searchable columns in config
- Exclude very long text (use truncation in output)
- Prioritize frequently-searched fields
# In core.py CSV_CONFIG
"style": {
"file": "styles.csv",
"search_cols": ["Style Category", "Keywords", "Best For", "Type", "AI Prompt Keywords"],
"output_cols": ["Style Category", "Type", "Keywords", ..., "Design System Variables"]
}
3.6 Size Guidelines
| File | Max Rows | Max Size | Rationale |
|---|---|---|---|
| styles.csv | 100 | 100KB | Most important, larger acceptable |
| typography.csv | 100 | 50KB | Detailed font information |
| products.csv | 150 | 50KB | Comprehensive product coverage |
| colors.csv | 150 | 50KB | Industry-specific palettes |
| Others | 50 | 20KB | Specialized domains |
4. Git & Version Control
4.1 Branching Strategy
Pattern: <type>/<description>
# Feature development
git checkout -b feat/add-design-system-caching
git checkout -b feat/support-droid-platform
# Bug fixes
git checkout -b fix/windows-unicode-emoji
git checkout -b fix/version-mismatch-plugin
# Documentation
git checkout -b docs/update-codebase-summary
# Refactoring
git checkout -b refactor/modularize-design-system
# Never commit directly to main
4.2 Commit Message Format
Standard: Conventional Commits
<type>(<scope>): <subject>
<body>
<footer>
Types:
feat:- New featurefix:- Bug fixdocs:- Documentationrefactor:- Code restructuringperf:- Performance improvementtest:- Test additionschore:- Build, CI, dependencies
Examples:
git commit -m "feat(design-system): add caching for repeated queries"
git commit -m "fix(cli): resolve Windows emoji encoding issue"
git commit -m "docs(readme): update installation instructions"
git commit -m "refactor(search): extract reasoning rules to separate module"
4.3 Code Review Checklist
Before pushing, verify:
- Code follows style standards (Python PEP 8, TypeScript ESLint)
- No hardcoded values or secrets
- Tests pass (if applicable)
- Linting passes
- Documentation updated
- Version numbers correct
- Commit message is descriptive
- No unnecessary files committed
4.4 Release Process
# 1. Update version numbers
# - cli/package.json
# - .claude-plugin/marketplace.json
# - .claude-plugin/plugin.json
# 2. Update CHANGELOG
# - Note what changed, list new features/fixes
# 3. Sync CLI assets
cp -r src/ui-ux-pro-max/data/* cli/assets/data/
cp -r src/ui-ux-pro-max/scripts/* cli/assets/scripts/
cp -r src/ui-ux-pro-max/templates/* cli/assets/templates/
# 4. Build and test
cd cli && bun run build
node dist/index.js init --ai claude --offline
# 5. Publish
npm publish
# 6. Tag release
git tag -a v2.2.3 -m "Release v2.2.3"
git push origin v2.2.3
5. Testing Standards
5.1 Python Tests (pytest)
Location: tests/test_*.py
Target Coverage: ≥ 70%
# tests/test_core.py
import pytest
from core import BM25, search
class TestBM25:
"""Test BM25 ranking algorithm"""
def test_tokenize_removes_short_words(self):
bm25 = BM25()
tokens = bm25.tokenize("the quick brown fox jumps")
assert "the" not in tokens
assert "quick" in tokens
def test_search_returns_top_results(self):
result = search("minimalism", "style", max_results=3)
assert result['count'] <= 3
assert 'Minimalism' in [r.get('Style Category') for r in result['results']]
@pytest.mark.skip(reason="Requires CSV files")
def test_design_system_generation():
"""Design system generation test"""
pass
5.2 TypeScript Tests (vitest)
Location: cli/src/__tests__/test_*.ts
Target Coverage: ≥ 70%
import { describe, it, expect, beforeEach } from 'vitest';
import { detectPlatform } from '../utils/detect';
describe('Platform Detection', () => {
it('should detect Claude Code', () => {
process.env.CLAUDE_CODE = 'true';
const platform = detectPlatform();
expect(platform).toBe('claude');
});
it('should return unknown for undetected platform', () => {
delete process.env.CLAUDE_CODE;
const platform = detectPlatform();
expect(platform).toMatch(/unknown|fallback/);
});
});
5.3 Integration Tests
# Integration test: Full design system generation
def test_design_system_beauty_spa():
"""Test design system generation for beauty spa"""
result = generate_design_system(
"beauty spa wellness",
"Serenity Spa",
format="ascii"
)
# Assertions
assert "Serenity Spa" in result
assert "STYLE:" in result
assert "COLORS:" in result
assert "TYPOGRAPHY:" in result
assert "ANTI-PATTERNS:" in result
5.4 Linting & Formatting
Python:
# Install
pip install black flake8 mypy
# Format
black src/ui-ux-pro-max/scripts/
# Lint
flake8 src/ui-ux-pro-max/scripts/
# Type check
mypy src/ui-ux-pro-max/scripts/
TypeScript:
# Install
npm install --save-dev eslint prettier @typescript-eslint/parser
# Format
prettier --write cli/src/
# Lint
eslint cli/src/
# Type check
tsc --noEmit
6. Documentation Standards
6.1 Markdown Style
File Structure:
# Main Title (H1)
Brief intro (1-2 sentences)
## Section (H2)
Content with `code inline`
### Subsection (H3)
- Bullet point
- Another point
| Column 1 | Column 2 |
|----------|----------|
| Data | More data |
## Code Blocks
\`\`\`python
# Language-specified
def example():
pass
\`\`\`
## Links
[Text](relative/path.md) or [Text](https://example.com)
6.2 README Requirements
- One-sentence project description
- Installation instructions (quick start)
- Basic usage examples
- Supported platforms/stacks
- Contributing guidelines
- License information
- Links to detailed docs in
docs/
Max Length: 300 lines (link to docs/ for details)
6.3 Code Example Standards
All examples must:
- Be runnable (copy-paste and work)
- Show expected output
- Include comments explaining WHY
- Use realistic data
# Good example with explanation
def example_search():
"""Example: Search for minimalism style"""
result = search("minimalism", "style", max_results=3)
# Result contains metadata + top matches
print(f"Domain: {result['domain']}") # 'style'
print(f"Found: {result['count']} results") # 3
print(result['results'][0]['Style Category']) # 'Minimalism & Swiss Style'
7. Accessibility Standards
7.1 Design System Accessibility
All generated designs must:
- WCAG AA compliance minimum
- Text contrast ≥ 4.5:1 (normal text)
- Focus states visible for keyboard nav
- Respect
prefers-reduced-motion - No information conveyed by color alone
7.2 UI Component Accessibility
<!-- Good -->
<button class="cta" aria-label="Subscribe to newsletter">
Subscribe
</button>
<!-- Avoid -->
<div class="button" onclick="...">Subscribe</div>
7.3 Color Palette Guidelines
Rules:
- Check contrast ratios (WebAIM Contrast Checker)
- Include colorblind-safe palettes
- Don't rely on color alone for meaning
- Test with Lighthouse/axe DevTools
8. Performance Standards
8.1 Python Performance
| Operation | Target | Limit |
|---|---|---|
| CSV load | < 50ms | 100ms |
| BM25 index | < 100ms | 200ms |
| Single search | < 200ms | 500ms |
| Design system | < 2s | 3s |
Optimization Strategies:
- Load CSVs once, cache in memory
- Use generators for large datasets
- Profile with
cProfilebefore optimizing
8.2 CLI Performance
| Operation | Target | Limit |
|---|---|---|
| Platform detection | < 100ms | 200ms |
| Template rendering | < 50ms | 100ms |
| File generation | < 1s | 2s |
| Full installation | < 5s | 10s |
9. Security Standards
9.1 Code Security
Rules:
- No hardcoded API keys/secrets
- No eval() or dynamic code execution
- Sanitize user input (file paths, queries)
- Validate CSV data before use
# Good
filepath = Path(__file__).parent / "data" / filename
if not filepath.is_file():
raise ValueError(f"File not found: {filename}")
# Avoid
filepath = f"./data/{user_input}" # Path traversal vulnerability
exec(user_query) # Code injection
9.2 Dependency Security
# Regular audits
npm audit
pip audit
# Only add necessary dependencies
# No "just in case" packages
9.3 Data Privacy
- No telemetry without consent
- Generated design systems stay local
- No tracking of user queries
10. File Organization Best Practices
10.1 Project Structure Enforcement
Rule: Always edit in src/ui-ux-pro-max/, sync to CLI/skill
CORRECT:
1. Edit src/ui-ux-pro-max/data/styles.csv
2. Run sync: cp -r src/ui-ux-pro-max/data/* cli/assets/data/
3. Test in CLI
4. Commit both src/ and cli/assets/
WRONG:
1. Edit cli/assets/data/styles.csv directly
2. Changes lost on next sync
10.2 CSV File Organization
data/
├── styles.csv # Must exist
├── colors.csv # Must exist
├── typography.csv # Must exist
├── products.csv # Must exist
├── charts.csv # Must exist
├── landing.csv # Must exist
├── ui-reasoning.csv # Must exist (v2.0+)
├── ux-guidelines.csv # Required
├── icons.csv # Optional
├── react-performance.csv # Optional
├── web-interface.csv # Optional
└── stacks/ # 13 stack CSVs
├── html-tailwind.csv
├── react.csv
└── ... (11 more)
11. Unresolved Questions
- Test Framework: Should we use pytest + vitest, or add coverage tools like coverage.py?
- CI/CD: Should we add GitHub Actions for linting/testing on PR?
- Python Version: Drop support for Python 3.8 and require 3.9+ for better type hints?
- Linting Config: Should we enforce strict mypy mode or keep pragmatic?
- API Stability: How to version the Python API (core.py/design_system.py) for external users?