Use for WRITING documentation with ready-to-use code templates (C# XML docs, TypeScript JSDoc, API docs, README patterns). Best for implementing actual documentation, adding code comments, and creating docs from scratch. NOT for documentation planning (use documentation instead).
/// <summary>
/// Saves or updates an employee entity.
/// </summary>
/// <remarks>
/// This command handles both create and update operations.
/// For new employees, the Id should be null or empty.
/// </remarks>
/// <example>
/// <code>
/// var command = new SaveEmployeeCommand
/// {
/// Name = "John Doe",
/// Email = "john@example.com"
/// };
/// var result = await handler.HandleAsync(command, cancellationToken);
/// </code>
/// </example>
public sealed class SaveEmployeeCommand : PlatformCqrsCommand<SaveEmployeeCommandResult>
{
/// <summary>
/// The unique identifier of the employee.
/// Null or empty for new employees.
/// </summary>
public string? Id { get; set; }
/// <summary>
/// The employee's full name.
/// </summary>
/// <value>Must be non-empty and max 200 characters.</value>
public string Name { get; set; } = string.Empty;
}
/// <summary>
/// Represents a unique expression for finding an employee.
/// </summary>
/// <param name="companyId">The company identifier.</param>
/// <param name="userId">The user identifier.</param>
/// <returns>An expression that matches the unique employee.</returns>
public static Expression<Func<Employee, bool>> UniqueExpr(string companyId, string userId)
=> e => e.CompanyId == companyId && e.UserId == userId;
/**
* Manages the feature list state and operations.
*
* @example
* ```typescript
* @Component({
* providers: [FeatureListStore]
* })
* export class FeatureListComponent {
* constructor(private store: FeatureListStore) {
* store.loadItems();
* }
* }
* ```
*/
@Injectable()
export class FeatureListStore extends PlatformVmStore<FeatureListState> {
/**
* Loads items from the API with current filters.
*
* @remarks
* This effect automatically tracks loading state under the key 'loadItems'.
* Use `isLoading$('loadItems')` to check loading status.
*
* @see {@link FeatureApiService.getList}
*/
public loadItems = this.effectSimple(() => /* ... */);
/**
* Updates the filter criteria and resets to first page.
*
* @param filters - Partial filter object to merge with current filters
*
* @example
* ```typescript
* // Filter by status
* store.setFilters({ status: FeatureStatus.Active });
*
* // Filter by search text
* store.setFilters({ searchText: 'keyword' });
* ```
*/
public setFilters(filters: Partial<FeatureFilters>): void {
// ...
}
}
/**
* Represents a feature entity from the API.
*/
export interface FeatureDto {
/** Unique identifier */
id: string;
/** Display name of the feature */
name: string;
/**
* Current status of the feature.
* @default FeatureStatus.Draft
*/
status: FeatureStatus;
}
/// <summary>
/// Employee management endpoints.
/// </summary>
[ApiController]
[Route("api/[controller]")]
[PlatformAuthorize]
public class EmployeeController : PlatformBaseController
{
/// <summary>
/// Retrieves a paginated list of employees.
/// </summary>
/// <param name="query">Query parameters for filtering and pagination.</param>
/// <returns>Paginated list of employees.</returns>
/// <response code="200">Returns the employee list.</response>
/// <response code="400">Invalid query parameters.</response>
/// <response code="401">Unauthorized - authentication required.</response>
/// <response code="403">Forbidden - insufficient permissions.</response>
[HttpGet]
[ProducesResponseType(typeof(GetEmployeeListQueryResult), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
public async Task<IActionResult> GetList([FromQuery] GetEmployeeListQuery query)
=> Ok(await Cqrs.SendAsync(query));
/// <summary>
/// Creates or updates an employee.
/// </summary>
/// <param name="command">Employee data to save.</param>
/// <returns>The saved employee.</returns>
/// <response code="200">Employee saved successfully.</response>
/// <response code="400">Validation failed.</response>
/// <response code="404">Employee not found (for updates).</response>
[HttpPost]
[ProducesResponseType(typeof(SaveEmployeeCommandResult), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Save([FromBody] SaveEmployeeCommand command)
=> Ok(await Cqrs.SendAsync(command));
}
# Feature Name
Brief description of what this feature does.
## Overview
More detailed explanation of the feature's purpose and functionality.
## Architecture
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ Frontend │────▶│ API Layer │────▶│ Domain Layer │ │ Component │ │ Controller │ │ Entity │ └─────────────────┘ └──────────────────┘ └─────────────────┘
## Usage
### Backend
```csharp
// Example usage
var command = new SaveFeatureCommand { Name = "Example" };
var result = await handler.HandleAsync(command, cancellationToken);
// Example usage
this.store.loadItems();
| Setting | Description | Default |
| -------------- | ------------------------- | ------- |
| MaxItems | Maximum items per page | 50 |
| CacheTimeout | Cache duration in seconds | 300 |
| Method | Endpoint | Description |
| ------ | ------------------- | --------------------- |
| GET | /api/feature | List features |
| POST | /api/feature | Create/update feature |
| DELETE | /api/feature/{id} | Delete feature |
| Code | Description | | ---- | -------------------- | | 400 | Invalid request data | | 404 | Feature not found | | 409 | Conflict (duplicate) |
## Pattern 5: Inline Code Comments
```csharp
protected override async Task<SaveEmployeeCommandResult> HandleAsync(
SaveEmployeeCommand request, CancellationToken cancellationToken)
{
// Step 1: Determine if this is a create or update operation
var isCreate = request.Id.IsNullOrEmpty();
// Step 2: Get or create the entity
var employee = isCreate
? request.MapToNewEntity()
.With(e => e.CreatedBy = RequestContext.UserId())
: await repository.GetByIdAsync(request.Id, cancellationToken)
.EnsureFound($"Employee not found: {request.Id}")
.Then(existing => request.UpdateEntity(existing));
// Step 3: Validate business rules
// NOTE: This checks for duplicate codes within the same company
await employee.ValidateAsync(repository, cancellationToken).EnsureValidAsync();
// Step 4: Persist changes
// The repository automatically raises entity events for cross-service sync
var saved = await repository.CreateOrUpdateAsync(employee, cancellationToken);
// Step 5: Return result
return new SaveEmployeeCommandResult
{
Employee = new EmployeeDto(saved)
};
}
| Type | When to Use |
| ---------------- | ------------------------- |
| /// <summary> | Public API documentation |
| // Explanation | Complex logic explanation |
| // TODO: | Planned improvements |
| // FIXME: | Known issues |
| // HACK: | Temporary workarounds |
| // NOTE: | Important information |
npx skills add CongDon1207/tasks-documentation下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer