ln-770-crosscutting-setup

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

ln-770-crosscutting-setup

ln-770-横切关注点配置

Type: L2 Domain Coordinator Category: 7XX Project Bootstrap Parent: ln-700-project-bootstrap
Coordinates cross-cutting concerns configuration for .NET and Python projects.

类型: L2 领域协调器 分类: 7XX 项目初始化 父级: ln-700-project-bootstrap
负责协调.NET和Python项目的横切关注点配置工作。

Overview

概述

AspectDetails
InputProject root directory
OutputConfigured logging, error handling, CORS, health checks, API docs
Workersln-771 to ln-775
Stacks.NET (ASP.NET Core), Python (FastAPI)

方面详情
输入项目根目录
输出已配置的日志记录、错误处理、CORS、健康检查、API文档
子任务执行者ln-771 至 ln-775
技术栈.NET (ASP.NET Core)、Python (FastAPI)

Phase 1: Detect Project Stack

阶段1:检测项目技术栈

Determine the technology stack by scanning project files.
Detection Rules:
File PatternStackFramework
*.csproj
.NETASP.NET Core
pyproject.toml
or
requirements.txt
+ FastAPI
PythonFastAPI
Actions:
  1. Glob for
    *.csproj
    files
  2. If not found, Glob for
    pyproject.toml
    or
    requirements.txt
  3. If Python, check for FastAPI in dependencies
  4. Store detected stack in Context Store
Context Store Initial:
json
{
  "STACK": ".NET" | "Python",
  "FRAMEWORK": "ASP.NET Core" | "FastAPI",
  "PROJECT_ROOT": "/path/to/project",
  "FRAMEWORK_VERSION": "8.0" | "0.109.0"
}

通过扫描项目文件确定技术栈。
检测规则:
文件模式技术栈框架
*.csproj
.NETASP.NET Core
pyproject.toml
requirements.txt
+ FastAPI
PythonFastAPI
操作步骤:
  1. 查找
    *.csproj
    文件
  2. 若未找到,查找
    pyproject.toml
    requirements.txt
  3. 若为Python项目,检查依赖中是否包含FastAPI
  4. 将检测到的技术栈存储到上下文存储中
初始上下文存储:
json
{
  "STACK": ".NET" | "Python",
  "FRAMEWORK": "ASP.NET Core" | "FastAPI",
  "PROJECT_ROOT": "/path/to/project",
  "FRAMEWORK_VERSION": "8.0" | "0.109.0"
}

Phase 2: Check Existing Configuration

阶段2:检查现有配置

Scan for already configured cross-cutting concerns.
Detection Patterns:
Concern.NET PatternPython Pattern
Logging
Serilog
in *.csproj,
UseSerilog
in Program.cs
structlog
in requirements, logging config
Error Handling
GlobalExceptionMiddleware
,
UseExceptionHandler
@app.exception_handler
, exception_handlers.py
CORS
AddCors
,
UseCors
CORSMiddleware
Health Checks
AddHealthChecks
,
MapHealthChecks
/health
routes
API Docs
AddSwaggerGen
,
UseSwagger
FastAPI auto-generates
Actions:
  1. Grep for each pattern
  2. Mark configured concerns as
    skip: true
  3. Update Context Store with findings
Context Store Updated:
json
{
  "concerns": {
    "logging": { "configured": false },
    "errorHandling": { "configured": false },
    "cors": { "configured": true, "skip": true },
    "healthChecks": { "configured": false },
    "apiDocs": { "configured": false }
  }
}

扫描已配置的横切关注点。
检测模式:
关注点.NET 检测模式Python 检测模式
日志记录
*.csproj
中的
Serilog
、Program.cs 中的
UseSerilog
requirements 中的
structlog
、日志配置文件
错误处理
GlobalExceptionMiddleware
UseExceptionHandler
@app.exception_handler
、exception_handlers.py
CORS
AddCors
UseCors
CORSMiddleware
健康检查
AddHealthChecks
MapHealthChecks
/health
路由
API文档
AddSwaggerGen
UseSwagger
FastAPI 自动生成
操作步骤:
  1. 针对每个模式进行检索
  2. 将已配置的关注点标记为
    skip: true
  3. 将检测结果更新到上下文存储中
更新后的上下文存储:
json
{
  "concerns": {
    "logging": { "configured": false },
    "errorHandling": { "configured": false },
    "cors": { "configured": true, "skip": true },
    "healthChecks": { "configured": false },
    "apiDocs": { "configured": false }
  }
}

Phase 3: Invoke Workers (Conditional)

阶段3:调用子任务执行者(按需)

Delegate to workers only for unconfigured concerns.
Worker Invocation Order:
OrderWorkerConditionSkill Call
1ln-771-logging-configurator
logging.configured == false
/skill ln-771-logging-configurator
2ln-772-error-handler-setup
errorHandling.configured == false
/skill ln-772-error-handler-setup
3ln-773-cors-configurator
cors.configured == false
/skill ln-773-cors-configurator
4ln-774-healthcheck-setup
healthChecks.configured == false
/skill ln-774-healthcheck-setup
5ln-775-api-docs-generator
apiDocs.configured == false
/skill ln-775-api-docs-generator
Pass Context Store to each worker.
Worker Response Format:
json
{
  "status": "success" | "skipped" | "error",
  "files_created": ["path/to/file.cs"],
  "packages_added": ["Serilog.AspNetCore"],
  "message": "Configured structured logging with Serilog"
}

仅针对未配置的关注点委托给子任务执行者处理。
子任务执行者调用顺序:
顺序子任务执行者条件技能调用
1ln-771-logging-configurator
logging.configured == false
/skill ln-771-logging-configurator
2ln-772-error-handler-setup
errorHandling.configured == false
/skill ln-772-error-handler-setup
3ln-773-cors-configurator
cors.configured == false
/skill ln-773-cors-configurator
4ln-774-healthcheck-setup
healthChecks.configured == false
/skill ln-774-healthcheck-setup
5ln-775-api-docs-generator
apiDocs.configured == false
/skill ln-775-api-docs-generator
将上下文存储传递给每个子任务执行者。
子任务执行者响应格式:
json
{
  "status": "success" | "skipped" | "error",
  "files_created": ["path/to/file.cs"],
  "packages_added": ["Serilog.AspNetCore"],
  "message": "Configured structured logging with Serilog"
}

Phase 4: Generate Aggregation File

阶段4:生成聚合文件

Create a single entry point for all cross-cutting services.
创建所有横切服务的统一入口文件。

.NET: Extensions/ServiceExtensions.cs

.NET:Extensions/ServiceExtensions.cs

Generate based on configured workers:
// Structure only - actual code generated via MCP ref
public static class ServiceExtensions
{
    public static IServiceCollection AddCrosscuttingServices(
        this IServiceCollection services,
        IConfiguration configuration)
    {
        // Calls added based on configured workers:
        // services.AddLogging(configuration);      // if ln-771 ran
        // services.AddCorsPolicy(configuration);   // if ln-773 ran
        // services.AddHealthChecks();              // if ln-774 ran
        // services.AddSwaggerServices();           // if ln-775 ran
        return services;
    }
}
根据已配置的子任务生成:
// 仅为结构示例 - 实际代码通过MCP引用生成
public static class ServiceExtensions
{
    public static IServiceCollection AddCrosscuttingServices(
        this IServiceCollection services,
        IConfiguration configuration)
    {
        // 根据已配置的子任务添加调用:
        // services.AddLogging(configuration);      // 若ln-771已执行
        // services.AddCorsPolicy(configuration);   // 若ln-773已执行
        // services.AddHealthChecks();              // 若ln-774已执行
        // services.AddSwaggerServices();           // 若ln-775已执行
        return services;
    }
}

Python: middleware/init.py

Python:middleware/init.py

Generate based on configured workers:
undefined
根据已配置的子任务生成:
undefined

Structure only - actual code generated via MCP ref

仅为结构示例 - 实际代码通过MCP引用生成

def configure_middleware(app): # Middleware added based on configured workers: # configure_logging(app) # if ln-771 ran # configure_error_handlers(app) # if ln-772 ran # configure_cors(app) # if ln-773 ran # configure_health_routes(app) # if ln-774 ran pass

---
def configure_middleware(app): # 根据已配置的子任务添加中间件: # configure_logging(app) # 若ln-771已执行 # configure_error_handlers(app) # 若ln-772已执行 # configure_cors(app) # 若ln-773已执行 # configure_health_routes(app) # 若ln-774已执行 pass

---

Phase 5: Summary Report

阶段5:汇总报告

Display summary of all configured concerns.
Output Format:
Cross-cutting Setup Complete
============================
Stack: .NET (ASP.NET Core 8.0)

Configured:
  ✓ Logging (Serilog) - Extensions/LoggingExtensions.cs
  ✓ Error Handling - Middleware/GlobalExceptionMiddleware.cs
  ✓ CORS - Extensions/CorsExtensions.cs
  ✓ Health Checks - Extensions/HealthCheckExtensions.cs
  ✓ API Docs (Swagger) - Extensions/SwaggerExtensions.cs

Skipped (already configured):
  - None

Entry Point: Extensions/ServiceExtensions.cs
  Add to Program.cs: builder.Services.AddCrosscuttingServices(builder.Configuration);

Packages to Install:
  dotnet add package Serilog.AspNetCore
  dotnet add package Swashbuckle.AspNetCore

展示所有已配置关注点的汇总信息。
输出格式:
横切关注点配置完成
============================
技术栈:.NET (ASP.NET Core 8.0)

已配置项:
  ✓ 日志记录 (Serilog) - Extensions/LoggingExtensions.cs
  ✓ 错误处理 - Middleware/GlobalExceptionMiddleware.cs
  ✓ CORS - Extensions/CorsExtensions.cs
  ✓ 健康检查 - Extensions/HealthCheckExtensions.cs
  ✓ API文档 (Swagger) - Extensions/SwaggerExtensions.cs

已跳过(已配置):
  - 无

入口文件:Extensions/ServiceExtensions.cs
  需添加到Program.cs:builder.Services.AddCrosscuttingServices(builder.Configuration);

需安装的包:
  dotnet add package Serilog.AspNetCore
  dotnet add package Swashbuckle.AspNetCore

Workers

子任务执行者

WorkerPurposeStacks
ln-771-logging-configuratorStructured logging.NET (Serilog), Python (structlog)
ln-772-error-handler-setupGlobal exception middleware.NET, Python
ln-773-cors-configuratorCORS policy configuration.NET, Python
ln-774-healthcheck-setup/health endpoints.NET, Python
ln-775-api-docs-generatorSwagger/OpenAPI.NET (Swashbuckle), Python (FastAPI built-in)

子任务执行者用途技术栈
ln-771-logging-configurator结构化日志配置.NET (Serilog)、Python (structlog)
ln-772-error-handler-setup全局异常中间件配置.NET、Python
ln-773-cors-configuratorCORS策略配置.NET、Python
ln-774-healthcheck-setup/health 端点配置.NET、Python
ln-775-api-docs-generatorSwagger/OpenAPI 生成.NET (Swashbuckle)、Python (FastAPI 内置)

Context Store Interface

上下文存储接口

Workers receive and return via Context Store:
Input to Workers:
json
{
  "STACK": ".NET",
  "FRAMEWORK": "ASP.NET Core",
  "FRAMEWORK_VERSION": "8.0",
  "PROJECT_ROOT": "/path/to/project",
  "ENVIRONMENT": "Development"
}
Output from Workers:
json
{
  "status": "success",
  "files_created": [],
  "packages_added": [],
  "registration_code": "services.AddLogging(configuration);"
}

子任务执行者通过上下文存储接收和返回数据:
子任务执行者输入:
json
{
  "STACK": ".NET",
  "FRAMEWORK": "ASP.NET Core",
  "FRAMEWORK_VERSION": "8.0",
  "PROJECT_ROOT": "/path/to/project",
  "ENVIRONMENT": "Development"
}
子任务执行者输出:
json
{
  "status": "success",
  "files_created": [],
  "packages_added": [],
  "registration_code": "services.AddLogging(configuration);"
}

Idempotency

幂等性

This skill is idempotent:
  • Phase 2 detects existing configuration
  • Workers skip if already configured
  • Aggregation file preserves existing entries

Version: 2.0.0 Last Updated: 2026-01-10
本技能具备幂等性:
  • 阶段2会检测现有配置
  • 子任务执行者若检测到已配置则跳过
  • 聚合文件会保留现有条目

版本: 2.0.0 最后更新: 2026-01-10