Agent skill
writing-docs
Expert at writing high-quality documentation for code, APIs, and projects. Auto-invokes when generating docstrings, creating README files, writing API documentation, adding code comments, or producing any technical documentation. Provides language-specific templates and best practices for effective documentation writing.
Install this agent skill to your Project
npx add-skill https://github.com/aiskillstore/marketplace/tree/main/skills/c0ntr0lledcha0s/writing-docs
SKILL.md
Writing Documentation Skill
You are an expert at writing clear, comprehensive, and useful documentation for software projects.
When This Skill Activates
This skill auto-invokes when:
- User asks to "document this function/class/module"
- User wants to create or update a README
- User needs JSDoc, docstrings, or code comments
- User asks for API documentation
- User wants documentation for a specific file or codebase
Documentation Writing Principles
Core Principles
-
Clarity Over Cleverness
- Use simple, direct language
- Avoid jargon when possible
- Define technical terms when first used
-
Show, Don't Just Tell
- Include working code examples
- Demonstrate common use cases
- Show expected outputs
-
Structure for Scanning
- Use clear headings
- Keep paragraphs short
- Use lists for multiple items
- Highlight important information
-
Write for Your Audience
- Consider the reader's expertise level
- Provide appropriate context
- Link to prerequisites when needed
Language-Specific Templates
JavaScript/TypeScript (JSDoc)
/**
* Brief one-line description of what the function does.
*
* Longer description if needed. Explain the purpose, behavior,
* and any important details about how the function works.
*
* @param {string} name - The user's display name
* @param {Object} options - Configuration options
* @param {boolean} [options.verbose=false] - Enable verbose output
* @param {number} [options.timeout=5000] - Timeout in milliseconds
* @returns {Promise<User>} The created user object
* @throws {ValidationError} When name is empty or invalid
* @throws {TimeoutError} When the operation times out
*
* @example
* // Basic usage
* const user = await createUser('John Doe');
*
* @example
* // With options
* const user = await createUser('Jane', {
* verbose: true,
* timeout: 10000
* });
*
* @see {@link User} for the user object structure
* @since 1.2.0
*/
Python (Google Style Docstrings)
def create_user(name: str, **options) -> User:
"""Create a new user with the given name.
Longer description if needed. Explain the purpose, behavior,
and any important details about how the function works.
Args:
name: The user's display name. Must be non-empty.
**options: Optional keyword arguments.
verbose (bool): Enable verbose output. Defaults to False.
timeout (int): Timeout in milliseconds. Defaults to 5000.
Returns:
User: The created user object with populated fields.
Raises:
ValidationError: When name is empty or invalid.
TimeoutError: When the operation times out.
Example:
Basic usage::
user = create_user('John Doe')
With options::
user = create_user('Jane', verbose=True, timeout=10000)
Note:
The user is not persisted until `user.save()` is called.
See Also:
User: The user object class.
"""
Go
// CreateUser creates a new user with the given name.
//
// CreateUser validates the name, initializes a User struct with default
// values, and returns a pointer to the new user. The user is not persisted
// to the database until Save() is called.
//
// Parameters:
// - name: The user's display name. Must be non-empty string.
// - opts: Optional configuration. See UserOptions for available options.
//
// Returns the created User pointer and any error encountered.
//
// Example:
//
// user, err := CreateUser("John Doe", nil)
// if err != nil {
// log.Fatal(err)
// }
//
// Errors:
// - ErrEmptyName: returned when name is empty
// - ErrInvalidName: returned when name contains invalid characters
func CreateUser(name string, opts *UserOptions) (*User, error) {
Rust
/// Creates a new user with the given name.
///
/// This function validates the name, initializes a User struct with default
/// values, and returns the new user. The user is not persisted to the
/// database until [`User::save`] is called.
///
/// # Arguments
///
/// * `name` - The user's display name. Must be non-empty.
/// * `options` - Optional configuration settings.
///
/// # Returns
///
/// Returns `Ok(User)` on success, or an error if validation fails.
///
/// # Errors
///
/// * [`UserError::EmptyName`] - If `name` is empty.
/// * [`UserError::InvalidName`] - If `name` contains invalid characters.
///
/// # Examples
///
/// Basic usage:
///
/// ```
/// let user = create_user("John Doe", None)?;
/// ```
///
/// With options:
///
/// ```
/// let opts = UserOptions { verbose: true, ..Default::default() };
/// let user = create_user("Jane", Some(opts))?;
/// ```
///
/// # Panics
///
/// This function does not panic under normal circumstances.
README Template
# Project Name
Brief description of what this project does and why it exists.
## Features
- Feature 1: Brief description
- Feature 2: Brief description
- Feature 3: Brief description
## Installation
### Prerequisites
- Requirement 1 (version X.X+)
- Requirement 2
### Install via [package manager]
\`\`\`bash
npm install project-name
# or
pip install project-name
\`\`\`
### Install from source
\`\`\`bash
git clone https://github.com/user/project-name
cd project-name
npm install
\`\`\`
## Quick Start
\`\`\`javascript
import { Project } from 'project-name';
const project = new Project();
project.doSomething();
\`\`\`
## Usage
### Basic Example
\`\`\`javascript
// Code example with comments
\`\`\`
### Advanced Usage
\`\`\`javascript
// More complex example
\`\`\`
## API Reference
### `functionName(param1, param2)`
Description of the function.
**Parameters:**
- `param1` (Type): Description
- `param2` (Type, optional): Description. Default: `value`
**Returns:** Type - Description
**Example:**
\`\`\`javascript
const result = functionName('value', { option: true });
\`\`\`
## Configuration
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `option1` | string | `"default"` | Description |
| `option2` | number | `10` | Description |
## Contributing
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing`)
5. Open a Pull Request
## License
[License Type] - see [LICENSE](LICENSE) for details.
Writing Guidelines
Function Documentation
Always Include:
- Brief description (first line)
- Parameter descriptions with types
- Return value description
- Possible errors/exceptions
- At least one example
Include When Relevant:
- Side effects
- Performance considerations
- Thread safety notes
- Deprecation notices
- Links to related functions
Class Documentation
Always Include:
- Class purpose and responsibility
- Constructor documentation
- Public method documentation
- Important properties
Include When Relevant:
- Inheritance relationships
- Interface implementations
- State management notes
- Lifecycle information
Module/File Documentation
Always Include:
- Module purpose
- Main exports
- Usage overview
Include When Relevant:
- Dependencies
- Configuration requirements
- Architecture notes
Common Patterns
Documenting Options Objects
/**
* @typedef {Object} CreateUserOptions
* @property {boolean} [verbose=false] - Enable verbose logging
* @property {number} [timeout=5000] - Operation timeout in ms
* @property {string} [role='user'] - Initial user role
*/
/**
* Creates a user with the specified options.
* @param {string} name - User name
* @param {CreateUserOptions} [options] - Configuration options
*/
Documenting Callbacks
/**
* @callback UserCallback
* @param {Error|null} error - Error if operation failed
* @param {User} user - The user object if successful
*/
/**
* Fetches a user asynchronously.
* @param {string} id - User ID
* @param {UserCallback} callback - Called with result
*/
Documenting Generic Types
/**
* A generic result wrapper.
* @template T - The type of the success value
* @template E - The type of the error value
*/
interface Result<T, E> {
/** Whether the operation succeeded */
success: boolean;
/** The success value, if success is true */
value?: T;
/** The error value, if success is false */
error?: E;
}
Quality Checklist
Before finalizing documentation, verify:
- First line is a clear, concise summary
- All parameters are documented with types
- Return value is documented
- Errors/exceptions are documented
- At least one working example is included
- Example code is tested and correct
- Language is clear and grammatically correct
- Formatting is consistent with codebase style
- Links to related documentation are included
- Edge cases and limitations are noted
Integration
This skill works with:
- analyzing-docs skill for identifying what needs documentation
- managing-docs skill for organizing documentation structure
- docs-analyzer agent for comprehensive documentation projects
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
perigon-backend
Perigon ASP.NET Core + EF Core + Aspire conventions
perigon-agent
Pointers for Copilot/agents to apply Perigon conventions
perigon-angular
Angular 21+ standalone/Material/signal conventions for Perigon WebApp
fastapi-mastery
Comprehensive FastAPI development skill covering REST API creation, routing, request/response handling, validation, authentication, database integration, middleware, and deployment. Use when working with FastAPI projects, building APIs, implementing CRUD operations, setting up authentication/authorization, integrating databases (SQL/NoSQL), adding middleware, handling WebSockets, or deploying FastAPI applications. Triggered by requests involving .py files with FastAPI code, API endpoint creation, Pydantic models, or FastAPI-specific features.
context7-efficient
Token-efficient library documentation fetcher using Context7 MCP with 86.8% token savings through intelligent shell pipeline filtering. Fetches code examples, API references, and best practices for JavaScript, Python, Go, Rust, and other libraries. Use when users ask about library documentation, need code examples, want API usage patterns, are learning a new framework, need syntax reference, or troubleshooting with library-specific information. Triggers include questions like "Show me React hooks", "How do I use Prisma", "What's the Next.js routing syntax", or any request for library/framework documentation.
browser-use
Browser automation using Playwright MCP. Navigate websites, fill forms, click elements, take screenshots, and extract data. Use when tasks require web browsing, form submission, web scraping, UI testing, or any browser interaction.
Didn't find tool you were looking for?