884 lines
20 KiB
Markdown
884 lines
20 KiB
Markdown
# 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
|
|
|
|
```python
|
|
#!/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
|
|
|
|
```python
|
|
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
|
|
|
|
```python
|
|
# 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:**
|
|
1. Stdlib imports first
|
|
2. Third-party imports next (none for search engine)
|
|
3. Local imports last
|
|
4. Blank line between groups
|
|
|
|
### 1.6 Error Handling
|
|
|
|
```python
|
|
# 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:**
|
|
```python
|
|
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:**
|
|
|
|
```python
|
|
# 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
|
|
|
|
```python
|
|
# 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:**
|
|
1. Always use UTF-8 encoding
|
|
2. Handle missing fields gracefully
|
|
3. Preserve field order for consistency
|
|
4. Use DictReader/DictWriter for clarity
|
|
|
|
```python
|
|
# 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
|
|
|
|
```python
|
|
# 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
|
|
|
|
```typescript
|
|
/**
|
|
* 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:**
|
|
1. Always export types from `types/index.ts`
|
|
2. Use `type` for unions/aliases, `interface` for objects
|
|
3. Strict null checking enabled
|
|
|
|
```typescript
|
|
// 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
|
|
|
|
```typescript
|
|
// 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
|
|
|
|
```typescript
|
|
// 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
|
|
|
|
```typescript
|
|
/**
|
|
* 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
|
|
|
|
```typescript
|
|
// 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:**
|
|
1. UTF-8 encoding (no BOM)
|
|
2. Unix line endings (LF, not CRLF)
|
|
3. Comma-separated values
|
|
4. Header row with descriptive names
|
|
5. Consistent data types per column
|
|
|
|
### 3.2 CSV Header Naming
|
|
|
|
```csv
|
|
# 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
|
|
|
|
```csv
|
|
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:**
|
|
1. Include searchable columns in config
|
|
2. Exclude very long text (use truncation in output)
|
|
3. Prioritize frequently-searched fields
|
|
|
|
```python
|
|
# 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>`
|
|
|
|
```bash
|
|
# 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 feature
|
|
- `fix:` - Bug fix
|
|
- `docs:` - Documentation
|
|
- `refactor:` - Code restructuring
|
|
- `perf:` - Performance improvement
|
|
- `test:` - Test additions
|
|
- `chore:` - Build, CI, dependencies
|
|
|
|
**Examples:**
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
# 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%
|
|
|
|
```python
|
|
# 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%
|
|
|
|
```typescript
|
|
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
|
|
|
|
```python
|
|
# 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:**
|
|
```bash
|
|
# 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:**
|
|
```bash
|
|
# 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:**
|
|
```markdown
|
|
# 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:**
|
|
1. Be runnable (copy-paste and work)
|
|
2. Show expected output
|
|
3. Include comments explaining WHY
|
|
4. Use realistic data
|
|
|
|
```python
|
|
# 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:**
|
|
1. WCAG AA compliance minimum
|
|
2. Text contrast ≥ 4.5:1 (normal text)
|
|
3. Focus states visible for keyboard nav
|
|
4. Respect `prefers-reduced-motion`
|
|
5. No information conveyed by color alone
|
|
|
|
### 7.2 UI Component Accessibility
|
|
|
|
```html
|
|
<!-- Good -->
|
|
<button class="cta" aria-label="Subscribe to newsletter">
|
|
Subscribe
|
|
</button>
|
|
|
|
<!-- Avoid -->
|
|
<div class="button" onclick="...">Subscribe</div>
|
|
```
|
|
|
|
### 7.3 Color Palette Guidelines
|
|
|
|
**Rules:**
|
|
1. Check contrast ratios (WebAIM Contrast Checker)
|
|
2. Include colorblind-safe palettes
|
|
3. Don't rely on color alone for meaning
|
|
4. 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 `cProfile` before 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:**
|
|
1. No hardcoded API keys/secrets
|
|
2. No eval() or dynamic code execution
|
|
3. Sanitize user input (file paths, queries)
|
|
4. Validate CSV data before use
|
|
|
|
```python
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
1. **Test Framework:** Should we use pytest + vitest, or add coverage tools like coverage.py?
|
|
2. **CI/CD:** Should we add GitHub Actions for linting/testing on PR?
|
|
3. **Python Version:** Drop support for Python 3.8 and require 3.9+ for better type hints?
|
|
4. **Linting Config:** Should we enforce strict mypy mode or keep pragmatic?
|
|
5. **API Stability:** How to version the Python API (core.py/design_system.py) for external users?
|