[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FJPRJ06B36655PBBS250TV":3,"skill-same:01M6FJPRJ06B36655PBBS250TV":78},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6FJPRJ06B36655PBBS250TV","ln-770-crosscutting-setup",null,"Sets up logging, error handling, CORS, health checks, and API docs. Use when adding cross-cutting concerns to backend projects.","boisenoise\u002Fskills-collections","boisenoise","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F193180?v=4","01M6CDBDQK6BDN55ZMA6B6PKBM","01M6CDBDVSJ3JPTBYN26FZ7TZK",12,"MIT","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-770-crosscutting-setup\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"setup","ln 770 crosscutting setup","ln","docs","error handling","logging","api","cors","health","projects","use","backend","up","error","when","2026-11-10 10:12:30",false,"---\nname: ln-770-crosscutting-setup\ndescription: \"Sets up logging, error handling, CORS, health checks, and API docs. Use when adding cross-cutting concerns to backend projects.\"\nlicense: MIT\n---\n\n> **Paths:** File paths (`shared\u002F`, `references\u002F`, `..\u002Fln-*`) are relative to skills repo root. If not found at CWD, locate this SKILL.md directory and go up one level for repo root. If `shared\u002F` is missing, fetch files via WebFetch from `https:\u002F\u002Fraw.githubusercontent.com\u002Flevnikolaevich\u002Fclaude-code-skills\u002Fmaster\u002Fskills\u002F{path}`.\n\n# ln-770-crosscutting-setup\n\n**Type:** L2 Domain Coordinator\n**Category:** 7XX Project Bootstrap\n**Parent:** ln-700-project-bootstrap\n\nCoordinates cross-cutting concerns configuration for .NET and Python projects.\n\n---\n\n## Overview\n\n| Aspect | Details |\n|--------|---------|\n| **Input** | Project root directory |\n| **Output** | Configured logging, error handling, CORS, health checks, API docs |\n| **Workers** | ln-771 to ln-775 |\n| **Stacks** | .NET (ASP.NET Core), Python (FastAPI) |\n\n---\n\n## Phase 1: Detect Project Stack\n\nDetermine the technology stack by scanning project files.\n\n**Detection Rules:**\n\n| File Pattern | Stack | Framework |\n|--------------|-------|-----------|\n| `*.csproj` | .NET | ASP.NET Core |\n| `pyproject.toml` or `requirements.txt` + FastAPI | Python | FastAPI |\n\n**Actions:**\n1. Glob for `*.csproj` files\n2. If not found, Glob for `pyproject.toml` or `requirements.txt`\n3. If Python, check for FastAPI in dependencies\n4. Store detected stack in Context Store\n\n**Context Store Initial:**\n```json\n{\n  \"STACK\": \".NET\" | \"Python\",\n  \"FRAMEWORK\": \"ASP.NET Core\" | \"FastAPI\",\n  \"PROJECT_ROOT\": \"\u002Fpath\u002Fto\u002Fproject\",\n  \"FRAMEWORK_VERSION\": \"8.0\" | \"0.109.0\"\n}\n```\n\n---\n\n## Phase 2: Check Existing Configuration\n\nScan for already configured cross-cutting concerns.\n\n**Detection Patterns:**\n\n| Concern | .NET Pattern | Python Pattern |\n|---------|--------------|----------------|\n| Logging | `Serilog` in *.csproj, `UseSerilog` in Program.cs | `structlog` in requirements, logging config |\n| Error Handling | `GlobalExceptionMiddleware`, `UseExceptionHandler` | `@app.exception_handler`, exception_handlers.py |\n| CORS | `AddCors`, `UseCors` | `CORSMiddleware` |\n| Health Checks | `AddHealthChecks`, `MapHealthChecks` | `\u002Fhealth` routes |\n| API Docs | `AddSwaggerGen`, `UseSwagger` | FastAPI auto-generates |\n\n**Actions:**\n1. Grep for each pattern\n2. Mark configured concerns as `skip: true`\n3. Update Context Store with findings\n\n**Context Store Updated:**\n```json\n{\n  \"concerns\": {\n    \"logging\": { \"configured\": false },\n    \"errorHandling\": { \"configured\": false },\n    \"cors\": { \"configured\": true, \"skip\": true },\n    \"healthChecks\": { \"configured\": false },\n    \"apiDocs\": { \"configured\": false }\n  }\n}\n```\n\n---\n\n## Phase 3: Invoke Workers (Conditional)\n\nDelegate to workers only for unconfigured concerns.\n\n**Worker Invocation Order:**\n\n| Order | Worker | Condition | Skill Call |\n|-------|--------|-----------|------------|\n| 1 | ln-771-logging-configurator | `logging.configured == false` | `\u002Fskill ln-771-logging-configurator` |\n| 2 | ln-772-error-handler-setup | `errorHandling.configured == false` | `\u002Fskill ln-772-error-handler-setup` |\n| 3 | ln-773-cors-configurator | `cors.configured == false` | `\u002Fskill ln-773-cors-configurator` |\n| 4 | ln-774-healthcheck-setup | `healthChecks.configured == false` | `\u002Fskill ln-774-healthcheck-setup` |\n| 5 | ln-775-api-docs-generator | `apiDocs.configured == false` | `\u002Fskill ln-775-api-docs-generator` |\n\n**Invocations (conditional — skip if concern already configured):**\n```\nSkill(skill: \"ln-771-logging-configurator\", args: \"{STACK} {FRAMEWORK}\")\nSkill(skill: \"ln-772-error-handler-setup\", args: \"{STACK} {FRAMEWORK}\")\nSkill(skill: \"ln-773-cors-configurator\", args: \"{STACK} {FRAMEWORK}\")\nSkill(skill: \"ln-774-healthcheck-setup\", args: \"{STACK} {FRAMEWORK}\")\nSkill(skill: \"ln-775-api-docs-generator\", args: \"{STACK} {FRAMEWORK}\")\n```\n\n**Pass Context Store to each worker.**\n\n**Worker Response Format:**\n```json\n{\n  \"status\": \"success\" | \"skipped\" | \"error\",\n  \"files_created\": [\"path\u002Fto\u002Ffile.cs\"],\n  \"packages_added\": [\"Serilog.AspNetCore\"],\n  \"message\": \"Configured structured logging with Serilog\"\n}\n```\n\n---\n\n## Phase 4: Generate Aggregation File\n\nCreate a single entry point for all cross-cutting services.\n\n### .NET: Extensions\u002FServiceExtensions.cs\n\nGenerate based on configured workers:\n\n```\n\u002F\u002F Structure only - actual code generated via MCP ref\npublic static class ServiceExtensions\n{\n    public static IServiceCollection AddCrosscuttingServices(\n        this IServiceCollection services,\n        IConfiguration configuration)\n    {\n        \u002F\u002F Calls added based on configured workers:\n        \u002F\u002F services.AddLogging(configuration);      \u002F\u002F if ln-771 ran\n        \u002F\u002F services.AddCorsPolicy(configuration);   \u002F\u002F if ln-773 ran\n        \u002F\u002F services.AddHealthChecks();              \u002F\u002F if ln-774 ran\n        \u002F\u002F services.AddSwaggerServices();           \u002F\u002F if ln-775 ran\n        return services;\n    }\n}\n```\n\n### Python: middleware\u002F__init__.py\n\nGenerate based on configured workers:\n\n```\n# Structure only - actual code generated via MCP ref\ndef configure_middleware(app):\n    # Middleware added based on configured workers:\n    # configure_logging(app)        # if ln-771 ran\n    # configure_error_handlers(app) # if ln-772 ran\n    # configure_cors(app)           # if ln-773 ran\n    # configure_health_routes(app)  # if ln-774 ran\n    pass\n```\n\n---\n\n## Phase 5: Summary Report\n\nDisplay summary of all configured concerns.\n\n**Output Format:**\n\n```\nCross-cutting Setup Complete\n============================\nStack: .NET (ASP.NET Core 8.0)\n\nConfigured:\n  ✓ Logging (Serilog) - Extensions\u002FLoggingExtensions.cs\n  ✓ Error Handling - Middleware\u002FGlobalExceptionMiddleware.cs\n  ✓ CORS - Extensions\u002FCorsExtensions.cs\n  ✓ Health Checks - Extensions\u002FHealthCheckExtensions.cs\n  ✓ API Docs (Swagger) - Extensions\u002FSwaggerExtensions.cs\n\nSkipped (already configured):\n  - None\n\nEntry Point: Extensions\u002FServiceExtensions.cs\n  Add to Program.cs: builder.Services.AddCrosscuttingServices(builder.Configuration);\n\nPackages to Install:\n  dotnet add package Serilog.AspNetCore\n  dotnet add package Swashbuckle.AspNetCore\n```\n\n---\n\n## Workers\n\n| Worker | Purpose | Stacks |\n|--------|---------|--------|\n| [ln-771-logging-configurator](..\u002Fln-771-logging-configurator\u002FSKILL.md) | Structured logging | .NET (Serilog), Python (structlog) |\n| [ln-772-error-handler-setup](..\u002Fln-772-error-handler-setup\u002FSKILL.md) | Global exception middleware | .NET, Python |\n| [ln-773-cors-configurator](..\u002Fln-773-cors-configurator\u002FSKILL.md) | CORS policy configuration | .NET, Python |\n| [ln-774-healthcheck-setup](..\u002Fln-774-healthcheck-setup\u002FSKILL.md) | \u002Fhealth endpoints | .NET, Python |\n| [ln-775-api-docs-generator](..\u002Fln-775-api-docs-generator\u002FSKILL.md) | Swagger\u002FOpenAPI | .NET (Swashbuckle), Python (FastAPI built-in) |\n\n---\n\n## Context Store Interface\n\nWorkers receive and return via Context Store:\n\n**Input to Workers:**\n```json\n{\n  \"STACK\": \".NET\",\n  \"FRAMEWORK\": \"ASP.NET Core\",\n  \"FRAMEWORK_VERSION\": \"8.0\",\n  \"PROJECT_ROOT\": \"\u002Fpath\u002Fto\u002Fproject\",\n  \"ENVIRONMENT\": \"Development\"\n}\n```\n\n**Output from Workers:**\n```json\n{\n  \"status\": \"success\",\n  \"files_created\": [],\n  \"packages_added\": [],\n  \"registration_code\": \"services.AddLogging(configuration);\"\n}\n```\n\n---\n\n## Idempotency\n\nThis skill is idempotent:\n- Phase 2 detects existing configuration\n- Workers skip if already configured\n- Aggregation file preserves existing entries\n\n---\n\n## Critical Rules\n\n- **Skip already configured concerns** — Phase 2 detection must gate worker invocation (set `skip: true`)\n- **Pass Context Store to every worker** — workers depend on `STACK`, `FRAMEWORK`, `PROJECT_ROOT`\n- **Generate aggregation file only for workers that ran** — do not add registration calls for skipped concerns\n- **Support only .NET and Python** — detect via `*.csproj` or `pyproject.toml`\u002F`requirements.txt` + FastAPI\n- **Idempotent execution** — re-running must not duplicate configs or break existing setup\n\n**TodoWrite format (mandatory):**\n```\n- Detect project stack (in_progress)\n- Check existing configuration (pending)\n- Invoke ln-771-logging-configurator (pending)\n- Invoke ln-772-error-handler-setup (pending)\n- Invoke ln-773-cors-configurator (pending)\n- Invoke ln-774-healthcheck-setup (pending)\n- Invoke ln-775-api-docs-generator (pending)\n- Generate aggregation file (pending)\n- Summary report (pending)\n```\n\n## Worker Invocation (MANDATORY)\n\n| Phase | Worker | Context |\n|-------|--------|---------|\n| 3 | ln-771-logging-configurator | Shared (Skill tool) — structured logging setup |\n| 3 | ln-772-error-handler-setup | Shared (Skill tool) — global exception middleware |\n| 3 | ln-773-cors-configurator | Shared (Skill tool) — CORS policy configuration |\n| 3 | ln-774-healthcheck-setup | Shared (Skill tool) — \u002Fhealth endpoints |\n| 3 | ln-775-api-docs-generator | Shared (Skill tool) — Swagger\u002FOpenAPI docs |\n\n**All workers:** Invoke via Skill tool — workers see coordinator context.\n\n## Definition of Done\n\n- [ ] Project stack detected and stored in Context Store\n- [ ] Existing configurations detected (Phase 2 complete)\n- [ ] All unconfigured concerns delegated to workers (ln-771 through ln-775)\n- [ ] Aggregation entry point generated (`ServiceExtensions.cs` or `middleware\u002F__init__.py`)\n- [ ] Summary report displayed with configured\u002Fskipped concerns and package install commands\n\n## Reference Files\n\n- Worker skills: `ln-771-logging-configurator\u002FSKILL.md` through `ln-775-api-docs-generator\u002FSKILL.md`\n- `references\u002Flogging_patterns.md` — structured logging patterns per stack (passed to ln-771)\n- `references\u002Ferror_handling_patterns.md` — global exception handling patterns (passed to ln-772)\n- `references\u002Fcors_configuration.md` — CORS dev\u002Fprod policies per stack (passed to ln-773)\n\n---\n\n## Phase 6: Meta-Analysis\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Fmeta_analysis_protocol.md`\n\nSkill type: `execution-orchestrator`. Run after all phases complete. Output to chat using the `execution-orchestrator` format.\n\n---\n\n**Version:** 2.0.0\n**Last Updated:** 2026-01-10\n","> **Paths:** File paths (`shared\u002F`, `references\u002F`, `..\u002Fln-*`) are relative to skills repo root. If not found at CWD, locate this SKILL.md directory and go up one level for repo root. If `shared\u002F` is missing, fetch files via WebFetch from `https:\u002F\u002Fraw.githubusercontent.com\u002Flevnikolaevich\u002Fclaude-code-skills\u002Fmaster\u002Fskills\u002F{path}`.\n\n# ln-770-crosscutting-setup\n\n**Type:** L2 Domain Coordinator\n**Category:** 7XX Project Bootstrap\n**Parent:** ln-700-project-bootstrap\n\nCoordinates cross-cutting concerns configuration for .NET and Python projects.\n\n---\n\n## Overview\n\n| Aspect | Details |\n|--------|---------|\n| **Input** | Project root directory |\n| **Output** | Configured logging, error handling, CORS, health checks, API docs |\n| **Workers** | ln-771 to ln-775 |\n| **Stacks** | .NET (ASP.NET Core), Python (FastAPI) |\n\n---\n\n## Phase 1: Detect Project Stack\n\nDetermine the technology stack by scanning project files.\n\n**Detection Rules:**\n\n| File Pattern | Stack | Framework |\n|--------------|-------|-----------|\n| `*.csproj` | .NET | ASP.NET Core |\n| `pyproject.toml` or `requirements.txt` + FastAPI | Python | FastAPI |\n\n**Actions:**\n1. Glob for `*.csproj` files\n2. If not found, Glob for `pyproject.toml` or `requirements.txt`\n3. If Python, check for FastAPI in dependencies\n4. Store detected stack in Context Store\n\n**Context Store Initial:**\n```json\n{\n  \"STACK\": \".NET\" | \"Python\",\n  \"FRAMEWORK\": \"ASP.NET Core\" | \"FastAPI\",\n  \"PROJECT_ROOT\": \"\u002Fpath\u002Fto\u002Fproject\",\n  \"FRAMEWORK_VERSION\": \"8.0\" | \"0.109.0\"\n}\n```\n\n---\n\n## Phase 2: Check Existing Configuration\n\nScan for already configured cross-cutting concerns.\n\n**Detection Patterns:**\n\n| Concern | .NET Pattern | Python Pattern |\n|---------|--------------|----------------|\n| Logging | `Serilog` in *.csproj, `UseSerilog` in Program.cs | `structlog` in requirements, logging config |\n| Error Handling | `GlobalExceptionMiddleware`, `UseExceptionHandler` | `@app.exception_handler`, exception_handlers.py |\n| CORS | `AddCors`, `UseCors` | `CORSMiddleware` |\n| Health Checks | `AddHealthChecks`, `MapHealthChecks` | `\u002Fhealth` routes |\n| API Docs | `AddSwaggerGen`, `UseSwagger` | FastAPI auto-generates |\n\n**Actions:**\n1. Grep for each pattern\n2. Mark configured concerns as `skip: true`\n3. Update Context Store with findings\n\n**Context Store Updated:**\n```json\n{\n  \"concerns\": {\n    \"logging\": { \"configured\": false },\n    \"errorHandling\": { \"configured\": false },\n    \"cors\": { \"configured\": true, \"skip\": true },\n    \"healthChecks\": { \"configured\": false },\n    \"apiDocs\": { \"configured\": false }\n  }\n}\n```\n\n---\n\n## Phase 3: Invoke Workers (Conditional)\n\nDelegate to workers only for unconfigured concerns.\n\n**Worker Invocation Order:**\n\n| Order | Worker | Condition | Skill Call |\n|-------|--------|-----------|------------|\n| 1 | ln-771-logging-configurator | `logging.configured == false` | `\u002Fskill ln-771-logging-configurator` |\n| 2 | ln-772-error-handler-setup | `errorHandling.configured == false` | `\u002Fskill ln-772-error-handler-setup` |\n| 3 | ln-773-cors-configurator | `cors.configured == false` | `\u002Fskill ln-773-cors-configurator` |\n| 4 | ln-774-healthcheck-setup | `healthChecks.configured == false` | `\u002Fskill ln-774-healthcheck-setup` |\n| 5 | ln-775-api-docs-generator | `apiDocs.configured == false` | `\u002Fskill ln-775-api-docs-generator` |\n\n**Invocations (conditional — skip if concern already configured):**\n```\nSkill(skill: \"ln-771-logging-configurator\", args: \"{STACK} {FRAMEWORK}\")\nSkill(skill: \"ln-772-error-handler-setup\", args: \"{STACK} {FRAMEWORK}\")\nSkill(skill: \"ln-773-cors-configurator\", args: \"{STACK} {FRAMEWORK}\")\nSkill(skill: \"ln-774-healthcheck-setup\", args: \"{STACK} {FRAMEWORK}\")\nSkill(skill: \"ln-775-api-docs-generator\", args: \"{STACK} {FRAMEWORK}\")\n```\n\n**Pass Context Store to each worker.**\n\n**Worker Response Format:**\n```json\n{\n  \"status\": \"success\" | \"skipped\" | \"error\",\n  \"files_created\": [\"path\u002Fto\u002Ffile.cs\"],\n  \"packages_added\": [\"Serilog.AspNetCore\"],\n  \"message\": \"Configured structured logging with Serilog\"\n}\n```\n\n---\n\n## Phase 4: Generate Aggregation File\n\nCreate a single entry point for all cross-cutting services.\n\n### .NET: Extensions\u002FServiceExtensions.cs\n\nGenerate based on configured workers:\n\n```\n\u002F\u002F Structure only - actual code generated via MCP ref\npublic static class ServiceExtensions\n{\n    public static IServiceCollection AddCrosscuttingServices(\n        this IServiceCollection services,\n        IConfiguration configuration)\n    {\n        \u002F\u002F Calls added based on configured workers:\n        \u002F\u002F services.AddLogging(configuration);      \u002F\u002F if ln-771 ran\n        \u002F\u002F services.AddCorsPolicy(configuration);   \u002F\u002F if ln-773 ran\n        \u002F\u002F services.AddHealthChecks();              \u002F\u002F if ln-774 ran\n        \u002F\u002F services.AddSwaggerServices();           \u002F\u002F if ln-775 ran\n        return services;\n    }\n}\n```\n\n### Python: middleware\u002F__init__.py\n\nGenerate based on configured workers:\n\n```\n# Structure only - actual code generated via MCP ref\ndef configure_middleware(app):\n    # Middleware added based on configured workers:\n    # configure_logging(app)        # if ln-771 ran\n    # configure_error_handlers(app) # if ln-772 ran\n    # configure_cors(app)           # if ln-773 ran\n    # configure_health_routes(app)  # if ln-774 ran\n    pass\n```\n\n---\n\n## Phase 5: Summary Report\n\nDisplay summary of all configured concerns.\n\n**Output Format:**\n\n```\nCross-cutting Setup Complete\n============================\nStack: .NET (ASP.NET Core 8.0)\n\nConfigured:\n  ✓ Logging (Serilog) - Extensions\u002FLoggingExtensions.cs\n  ✓ Error Handling - Middleware\u002FGlobalExceptionMiddleware.cs\n  ✓ CORS - Extensions\u002FCorsExtensions.cs\n  ✓ Health Checks - Extensions\u002FHealthCheckExtensions.cs\n  ✓ API Docs (Swagger) - Extensions\u002FSwaggerExtensions.cs\n\nSkipped (already configured):\n  - None\n\nEntry Point: Extensions\u002FServiceExtensions.cs\n  Add to Program.cs: builder.Services.AddCrosscuttingServices(builder.Configuration);\n\nPackages to Install:\n  dotnet add package Serilog.AspNetCore\n  dotnet add package Swashbuckle.AspNetCore\n```\n\n---\n\n## Workers\n\n| Worker | Purpose | Stacks |\n|--------|---------|--------|\n| [ln-771-logging-configurator](..\u002Fln-771-logging-configurator\u002FSKILL.md) | Structured logging | .NET (Serilog), Python (structlog) |\n| [ln-772-error-handler-setup](..\u002Fln-772-error-handler-setup\u002FSKILL.md) | Global exception middleware | .NET, Python |\n| [ln-773-cors-configurator](..\u002Fln-773-cors-configurator\u002FSKILL.md) | CORS policy configuration | .NET, Python |\n| [ln-774-healthcheck-setup](..\u002Fln-774-healthcheck-setup\u002FSKILL.md) | \u002Fhealth endpoints | .NET, Python |\n| [ln-775-api-docs-generator](..\u002Fln-775-api-docs-generator\u002FSKILL.md) | Swagger\u002FOpenAPI | .NET (Swashbuckle), Python (FastAPI built-in) |\n\n---\n\n## Context Store Interface\n\nWorkers receive and return via Context Store:\n\n**Input to Workers:**\n```json\n{\n  \"STACK\": \".NET\",\n  \"FRAMEWORK\": \"ASP.NET Core\",\n  \"FRAMEWORK_VERSION\": \"8.0\",\n  \"PROJECT_ROOT\": \"\u002Fpath\u002Fto\u002Fproject\",\n  \"ENVIRONMENT\": \"Development\"\n}\n```\n\n**Output from Workers:**\n```json\n{\n  \"status\": \"success\",\n  \"files_created\": [],\n  \"packages_added\": [],\n  \"registration_code\": \"services.AddLogging(configuration);\"\n}\n```\n\n---\n\n## Idempotency\n\nThis skill is idempotent:\n- Phase 2 detects existing configuration\n- Workers skip if already configured\n- Aggregation file preserves existing entries\n\n---\n\n## Critical Rules\n\n- **Skip already configured concerns** — Phase 2 detection must gate worker invocation (set `skip: true`)\n- **Pass Context Store to every worker** — workers depend on `STACK`, `FRAMEWORK`, `PROJECT_ROOT`\n- **Generate aggregation file only for workers that ran** — do not add registration calls for skipped concerns\n- **Support only .NET and Python** — detect via `*.csproj` or `pyproject.toml`\u002F`requirements.txt` + FastAPI\n- **Idempotent execution** — re-running must not duplicate configs or break existing setup\n\n**TodoWrite format (mandatory):**\n```\n- Detect project stack (in_progress)\n- Check existing configuration (pending)\n- Invoke ln-771-logging-configurator (pending)\n- Invoke ln-772-error-handler-setup (pending)\n- Invoke ln-773-cors-configurator (pending)\n- Invoke ln-774-healthcheck-setup (pending)\n- Invoke ln-775-api-docs-generator (pending)\n- Generate aggregation file (pending)\n- Summary report (pending)\n```\n\n## Worker Invocation (MANDATORY)\n\n| Phase | Worker | Context |\n|-------|--------|---------|\n| 3 | ln-771-logging-configurator | Shared (Skill tool) — structured logging setup |\n| 3 | ln-772-error-handler-setup | Shared (Skill tool) — global exception middleware |\n| 3 | ln-773-cors-configurator | Shared (Skill tool) — CORS policy configuration |\n| 3 | ln-774-healthcheck-setup | Shared (Skill tool) — \u002Fhealth endpoints |\n| 3 | ln-775-api-docs-generator | Shared (Skill tool) — Swagger\u002FOpenAPI docs |\n\n**All workers:** Invoke via Skill tool — workers see coordinator context.\n\n## Definition of Done\n\n- [ ] Project stack detected and stored in Context Store\n- [ ] Existing configurations detected (Phase 2 complete)\n- [ ] All unconfigured concerns delegated to workers (ln-771 through ln-775)\n- [ ] Aggregation entry point generated (`ServiceExtensions.cs` or `middleware\u002F__init__.py`)\n- [ ] Summary report displayed with configured\u002Fskipped concerns and package install commands\n\n## Reference Files\n\n- Worker skills: `ln-771-logging-configurator\u002FSKILL.md` through `ln-775-api-docs-generator\u002FSKILL.md`\n- `references\u002Flogging_patterns.md` — structured logging patterns per stack (passed to ln-771)\n- `references\u002Ferror_handling_patterns.md` — global exception handling patterns (passed to ln-772)\n- `references\u002Fcors_configuration.md` — CORS dev\u002Fprod policies per stack (passed to ln-773)\n\n---\n\n## Phase 6: Meta-Analysis\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Fmeta_analysis_protocol.md`\n\nSkill type: `execution-orchestrator`. Run after all phases complete. Output to chat using the `execution-orchestrator` format.\n\n---\n\n**Version:** 2.0.0\n**Last Updated:** 2026-01-10\n",{"name":5,"license":14,"description":7},"main","7bf2279c8a65758319526a721d5c4b75683aec9c","skills\u002Flevn-ln-770-crosscutting-setup",3,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections","https:\u002F\u002Fgithub.com\u002Fboisenoise","2026-11-11 14:20:43",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add boisenoise\u002Fskills-collections --skill ln-770-crosscutting-setup",{"tool":56,"command":57},"bunx","bunx skills add boisenoise\u002Fskills-collections --skill ln-770-crosscutting-setup",{"tool":59,"command":60},"pnpm","pnpm dlx skills add boisenoise\u002Fskills-collections --skill ln-770-crosscutting-setup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-770-crosscutting-setup\u002FSKILL.md",true,[64,70,74],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"references\u002Fcors_configuration.md","REFERENCE","参考文档",5531,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-770-crosscutting-setup\u002Freferences\u002Fcors_configuration.md",{"path":71,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Ferror_handling_patterns.md",8338,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-770-crosscutting-setup\u002Freferences\u002Ferror_handling_patterns.md",{"path":75,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Flogging_patterns.md",5653,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-770-crosscutting-setup\u002Freferences\u002Flogging_patterns.md",[79,108,133,159,178,201],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":83,"licenseFileUrl":84,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":38},"01M6WNH92BHVFXHGPDZCPJ0AG0","web-access","Use Treg for public web or platform data only when existing search, browser and connected tools cannot cover the task, with explicit cost and data boundaries.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FSKILL.md",[],[88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,37,107],"web","access","web access","official","development","browser","search","data","Tools","read","fetch","only","youtube","free tools","platform","critical","free","cover","normal","2026",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":83,"licenseFileUrl":112,"sourceHtmlUrl":113,"categories":114,"keywords":118,"publishedAt":38},"01M6WNF9XAYAB2CZDDJBAKNM93","treg","Use the Treg CLI or MCP catalog to discover, price and call authorized external tools with team-scoped credentials and a user-approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[110,119,120,121,91,92,122,96,123,124,125,126,33,127,128,103,129,130,131,132,107],"MCP","cli","github","license","Budget","credentials","team","catalog","call","discover","external tools","with","scoped","blob",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":83,"licenseFileUrl":137,"sourceHtmlUrl":138,"categories":139,"keywords":145,"publishedAt":38},"01M6WN93MEAZ4E41DYAHJRPHQT","recruit","Turn a job description into an evidence-linked candidate shortlist through Treg, with job-related ranking and optional authorized business contact enrichment.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[135,121,91,122,146,147,148,149,150,151,103,152,153,154,130,155,156,157,158,132,110,107],"https","email","enrichment","business","evidence","phone","ranking","post","job description","for","person","candidate","reason",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":83,"licenseFileUrl":163,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":38},"01M6WN8R5RXSMHM9B4D9FAFX42","rea-growth","Analyze a company’s public growth and content through Treg, distinguish observations from hypotheses, and produce an evidence-linked playbook within an approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FSKILL.md",[],[167,168,169,121,91,122,170,171,146,172,123,173,174,175,150,103,176,177,132,110,107],"growth","rea","rea growth","produce","content","playbook","marketing","analyze","public","observations","company",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":83,"licenseFileUrl":182,"sourceHtmlUrl":183,"categories":184,"keywords":185,"publishedAt":38},"01M6WN2EVE3RQRGWAKBT4S7YT2","make-ugc","Create original AI UGC-style product videos through Treg: research hooks, approve a licensed presenter and voice, generate clips, add captions and report costs.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FSKILL.md",[],[186,187,121,188,91,189,122,190,191,192,193,194,103,195,196,197,198,199,200,132],"make","make ugc","research","create","Video","Captions","ads","short","hooks","head","style","niche","trending","talking-head","approve",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":83,"licenseFileUrl":205,"sourceHtmlUrl":206,"categories":207,"keywords":208,"publishedAt":38},"01M6WN10ARAA63Y8K1YNGXJ2RM","lead-signals","Find and qualify public buying signals through Treg, rank fitting business accounts and optionally enrich authorized business contact information.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FSKILL.md",[],[209,210,211,121,91,122,212,213,149,214,215,103,216,217,218,219,220,221,222,132],"signals","lead","lead signals","how","find","ready","as","how to","qualify","people","information","enrich","changes","funding"]