Initial commit
This commit is contained in:
@@ -0,0 +1,496 @@
|
||||
# Documentation Standards and Quality Guidelines
|
||||
|
||||
Comprehensive standards for creating high-quality technical documentation for Grey Haven projects.
|
||||
|
||||
## Documentation Principles
|
||||
|
||||
### 1. Progressive Disclosure
|
||||
Start with overview, provide details on demand.
|
||||
|
||||
**Good**:
|
||||
```markdown
|
||||
# User Authentication
|
||||
|
||||
Quick overview: Our authentication uses JWT tokens with refresh rotation.
|
||||
|
||||
## Getting Started
|
||||
[Simple example]
|
||||
|
||||
## Advanced Usage
|
||||
[Detailed configuration options]
|
||||
|
||||
## Security Considerations
|
||||
[Deep dive into security]
|
||||
```
|
||||
|
||||
### 2. Show, Don't Tell
|
||||
Use code examples instead of lengthy explanations.
|
||||
|
||||
**Bad**: "To create a user, you need to instantiate a User class with email and password, then call the save method."
|
||||
|
||||
**Good**:
|
||||
```python
|
||||
user = User(email="user@example.com", password="secure123")
|
||||
user.save()
|
||||
```
|
||||
|
||||
### 3. Keep It Current
|
||||
Documentation that's out of date is worse than no documentation.
|
||||
|
||||
Use automation:
|
||||
- Auto-generate API docs from code
|
||||
- CI/CD validation (fail if docs outdated)
|
||||
- Link to code for truth source
|
||||
|
||||
## Writing Style
|
||||
|
||||
### Voice and Tone
|
||||
|
||||
**Use Active Voice**:
|
||||
- ❌ "The order will be processed by the system"
|
||||
- ✅ "The system processes the order"
|
||||
|
||||
**Be Direct**:
|
||||
- ❌ "It might be a good idea to consider using..."
|
||||
- ✅ "Use X when Y"
|
||||
|
||||
**Avoid Jargon**:
|
||||
- ❌ "Leverage our enterprise-grade synergistic platform"
|
||||
- ✅ "Use our API to manage users"
|
||||
|
||||
### Structure
|
||||
|
||||
**Every Page Should Have**:
|
||||
1. **Title**: Clear, descriptive
|
||||
2. **Summary**: 1-2 sentence overview
|
||||
3. **Prerequisites**: What user needs to know/have
|
||||
4. **Step-by-Step**: Numbered instructions
|
||||
5. **Code Examples**: Working, copy-paste ready
|
||||
6. **Troubleshooting**: Common errors and solutions
|
||||
7. **Next Steps**: Where to go next
|
||||
|
||||
### Code Examples
|
||||
|
||||
**Always Include**:
|
||||
- ✅ Complete, working examples
|
||||
- ✅ Expected output/result
|
||||
- ✅ Error handling
|
||||
- ✅ Comments explaining why, not what
|
||||
|
||||
**Example Template**:
|
||||
```python
|
||||
# Create a new user
|
||||
# Requires: Admin authentication
|
||||
# Returns: User object or raises ValidationError
|
||||
|
||||
try:
|
||||
user = User.objects.create(
|
||||
email="user@example.com",
|
||||
password="secure123",
|
||||
role="member" # Default role for new users
|
||||
)
|
||||
print(f"User created: {user.id}")
|
||||
except ValidationError as e:
|
||||
print(f"Validation failed: {e.message}")
|
||||
```
|
||||
|
||||
## API Documentation Standards
|
||||
|
||||
### Endpoint Documentation Template
|
||||
|
||||
```markdown
|
||||
## POST /api/v1/users
|
||||
|
||||
Create a new user account.
|
||||
|
||||
### Authentication
|
||||
Requires: Admin JWT token in Authorization header
|
||||
|
||||
### Request
|
||||
|
||||
**Headers**:
|
||||
- `Authorization: Bearer <token>` (required)
|
||||
- `Content-Type: application/json` (required)
|
||||
|
||||
**Body**:
|
||||
| Field | Type | Required | Description |
|
||||
|-------|------|----------|-------------|
|
||||
| email | string | Yes | Valid email address |
|
||||
| password | string | Yes | Min 8 characters |
|
||||
| role | string | No | Default: "member" |
|
||||
|
||||
**Example**:
|
||||
```json
|
||||
{
|
||||
"email": "user@example.com",
|
||||
"password": "secure123",
|
||||
"role": "member"
|
||||
}
|
||||
```
|
||||
|
||||
### Response
|
||||
|
||||
**Success (201 Created)**:
|
||||
```json
|
||||
{
|
||||
"id": "usr_123abc",
|
||||
"email": "user@example.com",
|
||||
"role": "member",
|
||||
"created_at": "2024-01-15T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
**Errors**:
|
||||
- `400 Bad Request`: Validation failed (email invalid, password too short)
|
||||
- `401 Unauthorized`: Missing or invalid auth token
|
||||
- `403 Forbidden`: User lacks admin role
|
||||
- `409 Conflict`: Email already exists
|
||||
- `429 Too Many Requests`: Rate limit exceeded
|
||||
|
||||
**Error Response**:
|
||||
```json
|
||||
{
|
||||
"error": "VALIDATION_ERROR",
|
||||
"message": "Email address is invalid",
|
||||
"details": {
|
||||
"field": "email",
|
||||
"value": "invalid-email"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Rate Limiting
|
||||
- Authenticated: 1000 requests/hour
|
||||
- Unauthenticated: 100 requests/hour
|
||||
|
||||
### Code Examples
|
||||
|
||||
**TypeScript**:
|
||||
```typescript
|
||||
const response = await fetch("https://api.greyhaven.com/users", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Authorization": `Bearer ${token}`,
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: JSON.stringify({
|
||||
email: "user@example.com",
|
||||
password: "secure123"
|
||||
})
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const error = await response.json();
|
||||
throw new Error(error.message);
|
||||
}
|
||||
|
||||
const user = await response.json();
|
||||
console.log(`User created: ${user.id}`);
|
||||
```
|
||||
|
||||
**Python**:
|
||||
```python
|
||||
import httpx
|
||||
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.post(
|
||||
"https://api.greyhaven.com/users",
|
||||
headers={"Authorization": f"Bearer {token}"},
|
||||
json={"email": "user@example.com", "password": "secure123"}
|
||||
)
|
||||
response.raise_for_status()
|
||||
user = response.json()
|
||||
print(f"User created: {user['id']}")
|
||||
```
|
||||
```
|
||||
|
||||
## Function Documentation Standards
|
||||
|
||||
### JSDoc (TypeScript)
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* Calculate order total including tax and shipping.
|
||||
*
|
||||
* @param items - Array of order items with quantity and price
|
||||
* @param shippingAddress - Address for tax calculation
|
||||
* @returns Total amount in USD cents
|
||||
* @throws {ValidationError} If items array is empty
|
||||
* @throws {TaxCalculationError} If tax lookup fails
|
||||
*
|
||||
* @example
|
||||
* const total = calculateTotal(
|
||||
* [{ quantity: 2, price: 2999 }],
|
||||
* { zip: "94105", country: "US" }
|
||||
* );
|
||||
* // Returns: 6398 (5998 + 400 tax + 0 shipping)
|
||||
*/
|
||||
export function calculateTotal(
|
||||
items: OrderItem[],
|
||||
shippingAddress: Address
|
||||
): number {
|
||||
if (items.length === 0) {
|
||||
throw new ValidationError("Items array cannot be empty");
|
||||
}
|
||||
|
||||
const subtotal = items.reduce((sum, item) =>
|
||||
sum + (item.quantity * item.price), 0
|
||||
);
|
||||
|
||||
const tax = calculateTax(subtotal, shippingAddress);
|
||||
const shipping = calculateShipping(items, shippingAddress);
|
||||
|
||||
return subtotal + tax + shipping;
|
||||
}
|
||||
```
|
||||
|
||||
### Python Docstrings (Google Style)
|
||||
|
||||
```python
|
||||
def calculate_total(items: List[OrderItem], shipping_address: Address) -> int:
|
||||
"""Calculate order total including tax and shipping.
|
||||
|
||||
Args:
|
||||
items: Array of order items with quantity and price.
|
||||
shipping_address: Address for tax calculation.
|
||||
|
||||
Returns:
|
||||
Total amount in USD cents.
|
||||
|
||||
Raises:
|
||||
ValidationError: If items array is empty.
|
||||
TaxCalculationError: If tax lookup fails.
|
||||
|
||||
Example:
|
||||
>>> items = [OrderItem(quantity=2, price=2999)]
|
||||
>>> address = Address(zip="94105", country="US")
|
||||
>>> total = calculate_total(items, address)
|
||||
>>> print(total)
|
||||
6398 # 5998 + 400 tax + 0 shipping
|
||||
"""
|
||||
if not items:
|
||||
raise ValidationError("Items array cannot be empty")
|
||||
|
||||
subtotal = sum(item.quantity * item.price for item in items)
|
||||
tax = calculate_tax(subtotal, shipping_address)
|
||||
shipping = calculate_shipping(items, shipping_address)
|
||||
|
||||
return subtotal + tax + shipping
|
||||
```
|
||||
|
||||
## README Structure
|
||||
|
||||
Every project should have a comprehensive README:
|
||||
|
||||
```markdown
|
||||
# Project Name
|
||||
|
||||
One-line description of what this project does.
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Visit http://localhost:3000
|
||||
|
||||
## Features
|
||||
|
||||
- Feature 1: Brief description
|
||||
- Feature 2: Brief description
|
||||
- Feature 3: Brief description
|
||||
|
||||
## Installation
|
||||
|
||||
### Prerequisites
|
||||
- Node.js 20+
|
||||
- PostgreSQL 14+
|
||||
- Redis (optional)
|
||||
|
||||
### Steps
|
||||
|
||||
1. Clone repository
|
||||
```bash
|
||||
git clone https://github.com/greyhaven/project.git
|
||||
cd project
|
||||
```
|
||||
|
||||
2. Install dependencies
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
3. Configure environment
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Edit .env with your values
|
||||
```
|
||||
|
||||
4. Run migrations
|
||||
```bash
|
||||
npm run migrate
|
||||
```
|
||||
|
||||
5. Start development server
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
| Variable | Required | Default | Description |
|
||||
|----------|----------|---------|-------------|
|
||||
| `DATABASE_URL` | Yes | - | PostgreSQL connection string |
|
||||
| `REDIS_URL` | No | - | Redis connection string |
|
||||
| `API_KEY` | Yes | - | API key for external service |
|
||||
|
||||
## Architecture
|
||||
|
||||
[Link to architecture docs or include Mermaid diagram]
|
||||
|
||||
## Development
|
||||
|
||||
### Running Tests
|
||||
```bash
|
||||
npm test
|
||||
```
|
||||
|
||||
### Code Quality
|
||||
```bash
|
||||
npm run lint
|
||||
npm run type-check
|
||||
```
|
||||
|
||||
### Building
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
## Deployment
|
||||
|
||||
[Link to deployment guide or include basic steps]
|
||||
|
||||
## Contributing
|
||||
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md)
|
||||
|
||||
## License
|
||||
|
||||
MIT License - see [LICENSE](LICENSE)
|
||||
```
|
||||
|
||||
## Documentation Coverage
|
||||
|
||||
### Minimum Requirements
|
||||
|
||||
**Code Coverage**:
|
||||
- Public functions: 100%
|
||||
- Exported types: 100%
|
||||
- API endpoints: 100%
|
||||
|
||||
**Content Coverage**:
|
||||
- Every function has description
|
||||
- Every parameter documented
|
||||
- Return value documented
|
||||
- Errors/exceptions documented
|
||||
- At least one example
|
||||
|
||||
### Validation
|
||||
|
||||
Use automated tools:
|
||||
- TypeScript: ts-morph for AST analysis
|
||||
- Python: AST module for docstring coverage
|
||||
- API: OpenAPI schema validation
|
||||
|
||||
```bash
|
||||
# Check coverage
|
||||
npm run docs:coverage
|
||||
|
||||
# Expected output
|
||||
TypeScript: 87% (124/142 documented)
|
||||
Python: 91% (98/108 documented)
|
||||
API Endpoints: 95% (42/44 documented)
|
||||
```
|
||||
|
||||
## Quality Checklist
|
||||
|
||||
Before publishing documentation:
|
||||
|
||||
- [ ] All code examples work (copy-paste tested)
|
||||
- [ ] Links are valid (no 404s)
|
||||
- [ ] Screenshots are current
|
||||
- [ ] Version numbers are correct
|
||||
- [ ] Prerequisite versions are accurate
|
||||
- [ ] Examples use realistic data
|
||||
- [ ] Error messages match actual errors
|
||||
- [ ] Spelling and grammar checked
|
||||
- [ ] Follows style guide
|
||||
- [ ] Reviewed by another person
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
### 1. Outdated Examples
|
||||
|
||||
❌ **Bad**: Uses deprecated API
|
||||
```typescript
|
||||
// This was removed in v2.0
|
||||
const user = User.create({ email, password });
|
||||
```
|
||||
|
||||
✅ **Good**: Current API with version note
|
||||
```typescript
|
||||
// As of v2.0, use createUser instead of User.create
|
||||
const user = await createUser({ email, password });
|
||||
```
|
||||
|
||||
### 2. Missing Error Handling
|
||||
|
||||
❌ **Bad**: Happy path only
|
||||
```typescript
|
||||
const user = await api.getUser(id);
|
||||
console.log(user.email);
|
||||
```
|
||||
|
||||
✅ **Good**: Error handling included
|
||||
```typescript
|
||||
try {
|
||||
const user = await api.getUser(id);
|
||||
console.log(user.email);
|
||||
} catch (error) {
|
||||
if (error.code === 'NOT_FOUND') {
|
||||
console.error(`User ${id} not found`);
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Vague Instructions
|
||||
|
||||
❌ **Bad**: "Configure the database"
|
||||
|
||||
✅ **Good**: Specific steps
|
||||
```markdown
|
||||
1. Create database: `createdb myapp`
|
||||
2. Run migrations: `npm run migrate`
|
||||
3. Verify: `psql myapp -c "\dt"`
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Update docs with code**: Documentation changes in same PR as code changes
|
||||
2. **Link to code**: Reference specific files and line numbers
|
||||
3. **Version everything**: Document which version each feature was added
|
||||
4. **Test examples**: All code examples must be tested
|
||||
5. **Screenshots with captions**: Always explain what image shows
|
||||
6. **Consistent terminology**: Use same terms throughout
|
||||
7. **Mobile-friendly**: Documentation should work on phones
|
||||
8. **Search-optimized**: Use descriptive headings and keywords
|
||||
9. **Accessible**: Alt text for images, semantic HTML
|
||||
10. **Feedback loops**: Easy way for users to report doc issues
|
||||
|
||||
---
|
||||
|
||||
Related: [openapi-patterns.md](openapi-patterns.md) | [mermaid-diagrams.md](mermaid-diagrams.md) | [Return to INDEX](INDEX.md)
|
||||
Reference in New Issue
Block a user