# Aptitudes personalizadas

Las capacidades son módulos de indicaciones reutilizables que amplían las capacidades de Copilot. Cargue aptitudes de directorios para proporcionar Copilot capacidades especializadas para dominios o flujos de trabajo específicos.

<!-- markdownlint-disable GHD046 GHD005 -->

<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

## Visión general

Una habilidad es un directorio con nombre que contiene un archivo `SKILL.md`: un documento Markdown que proporciona instrucciones a Copilot. Cuando se carga, el contenido de la habilidad se inyecta en el contexto de la sesión.

Las aptitudes le permiten:

* Empaquetar la experiencia de dominio en módulos reutilizables
* Uso compartido de comportamientos especializados entre proyectos
* Organizar las configuraciones complejas del agente
* Habilitación o deshabilitación de funcionalidades por sesión

## Aptitudes de carga

Especifique directorios que contengan aptitudes al crear una sesión:

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
const session = await client.createSession({
    model: "gpt-5.4",
    skillDirectories: [
        "./skills/code-review",
        "./skills/documentation",
    ],
    onPermissionRequest: async () => ({ kind: "approve-once" }),
});

// Copilot now has access to skills in those directories
await session.sendAndWait({ prompt: "Review this code for security issues" });
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
from copilot import CopilotClient, PermissionDecisionApproveOnce

async def main():
    client = CopilotClient()
    await client.start()

    session = await client.create_session(
        on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),
        model="gpt-5.4",
        skill_directories=[
            "./skills/code-review",
            "./skills/documentation",
        ],
    )

    # Copilot now has access to skills in those directories
    await session.send_and_wait("Review this code for security issues")

    await client.stop()
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
package main

import (
    "context"
    "log"
    copilot "github.com/github/copilot-sdk/go"
    "github.com/github/copilot-sdk/go/rpc"
)

func main() {
    ctx := context.Background()
    client := copilot.NewClient(nil)
    if err := client.Start(ctx); err != nil {
        log.Fatal(err)
    }
    defer client.Stop()

    session, err := client.CreateSession(ctx, &copilot.SessionConfig{
        Model: "gpt-5.4",
        SkillDirectories: []string{
            "./skills/code-review",
            "./skills/documentation",
        },
        OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
            return &rpc.PermissionDecisionApproveOnce{}, nil
        },
    })
    if err != nil {
        log.Fatal(err)
    }

    // Copilot now has access to skills in those directories
    _, err = session.SendAndWait(ctx, copilot.MessageOptions{
        Prompt: "Review this code for security issues",
    })
    if err != nil {
        log.Fatal(err)
    }
}
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
using GitHub.Copilot;
using GitHub.Copilot.Rpc;

await using var client = new CopilotClient();
await using var session = await client.CreateSessionAsync(new SessionConfig
{
    Model = "gpt-5.4",
    SkillDirectories = new List<string>
    {
        "./skills/code-review",
        "./skills/documentation",
    },
    OnPermissionRequest = (req, inv) =>
        Task.FromResult(PermissionDecision.ApproveOnce()),
});

// Copilot now has access to skills in those directories
await session.SendAndWaitAsync(new MessageOptions
{
    Prompt = "Review this code for security issues"
});
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

```java
import com.github.copilot.CopilotClient;
import com.github.copilot.rpc.*;
import java.util.List;

try (var client = new CopilotClient()) {
    client.start().get();

    var session = client.createSession(
        new SessionConfig()
            .setModel("gpt-5.4")
            .setSkillDirectories(List.of(
                "./skills/code-review",
                "./skills/documentation"
            ))
            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
    ).get();

    // Copilot now has access to skills in those directories
    session.sendAndWait(new MessageOptions()
        .setPrompt("Review this code for security issues")
    ).get();
}
```

</div>

</div>

## Deshabilitación de aptitudes

Deshabilite aptitudes específicas mientras mantiene a otros usuarios activos:

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
const session = await client.createSession({
    skillDirectories: ["./skills"],
    disabledSkills: ["experimental-feature", "deprecated-tool"],
});
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
from copilot.session import PermissionHandler

session = await client.create_session(
    on_permission_request=PermissionHandler.approve_all,
    skill_directories=["./skills"],
    disabled_skills=["experimental-feature", "deprecated-tool"],
)
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
session, _ := client.CreateSession(context.Background(), &copilot.SessionConfig{
    SkillDirectories: []string{"./skills"},
    DisabledSkills:   []string{"experimental-feature", "deprecated-tool"},
})
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
var session = await client.CreateSessionAsync(new SessionConfig
{
    SkillDirectories = new List<string> { "./skills" },
    DisabledSkills = new List<string> { "experimental-feature", "deprecated-tool" },
});
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

<!-- docs-validate: skip -->

```java
import com.github.copilot.rpc.*;
import java.util.List;

var session = client.createSession(
    new SessionConfig()
        .setSkillDirectories(List.of("./skills"))
        .setDisabledSkills(List.of("experimental-feature", "deprecated-tool"))
        .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
).get();
```

</div>

</div>

## Estructura del directorio de aptitudes

Cada aptitud es un subdirectorio con nombre que contiene un `SKILL.md` archivo:

```text
skills/
├── code-review/
│   └── SKILL.md
└── documentation/
    └── SKILL.md
```

La `skillDirectories` opción apunta al directorio primario (por ejemplo, `./skills`). La CLI detecta todos los `SKILL.md` archivos en subdirectorios inmediatos.

### formato SKILL.md

Un archivo `SKILL.md` es un documento Markdown con un frontmatter YAML opcional.

```markdown
---
name: code-review
description: Specialized code review capabilities
---

# Code Review Guidelines

When reviewing code, always check for:

1. **Security vulnerabilities** - SQL injection, XSS, etc.
2. **Performance issues** - N+1 queries, memory leaks
3. **Code style** - Consistent formatting, naming conventions
4. **Test coverage** - Are critical paths tested?

Provide specific line-number references and suggested fixes.
```

Los campos de frontmatter:

* **`name`**: identificador de la aptitud (que se usa con `disabledSkills` para deshabilitarla de forma selectiva). Si se omite, se usa el nombre del directorio.
* **`description`**: Una breve descripción de lo que hace la habilidad.

El cuerpo de Markdown contiene las instrucciones que se insertan en el contexto de sesión cuando se carga la aptitud.

## Opciones de configuración

### Campos de habilidades de SessionConfig

| Language | Campo               | Tipo           | Description                                  |
| -------- | ------------------- | -------------- | -------------------------------------------- |
| Node.js  | `skillDirectories`  | `string[]`     | Directorios desde los que cargar habilidades |
| Node.js  | `disabledSkills`    | `string[]`     | Habilidades para desactivar                  |
| Python   | `skill_directories` | `list[str]`    | Directorios desde los que cargar habilidades |
| Python   | `disabled_skills`   | `list[str]`    | Habilidades para desactivar                  |
| Ir       | `SkillDirectories`  | `[]string`     | Directorios desde los que cargar habilidades |
| Ir       | `DisabledSkills`    | `[]string`     | Habilidades para desactivar                  |
| .NET     | `SkillDirectories`  | `List<string>` | Directorios desde los que cargar habilidades |
| .NET     | `DisabledSkills`    | `List<string>` | Habilidades para desactivar                  |

## procedimientos recomendados

1. **Organizar por dominio** : agrupar aptitudes relacionadas (por ejemplo, `skills/security/`, `skills/testing/`)

2. **Usa metadatos preliminares** - Incluye `name` y `description` en los metadatos preliminares de YAML para mayor claridad

3. **Dependencias del documento**: indica las herramientas o servidores MCP que requiere una habilidad.

4. **Prueba de aptitudes de forma aislada** : compruebe que las aptitudes funcionan antes de combinarlas

5. **Utiliza rutas relativas** - Mantén las habilidades portátiles en distintos entornos

## Combinación con otras características

### Habilidades + agentes personalizados

Las habilidades enumeradas en el campo `skills` de un agente se **precargan de forma anticipada**: su contenido completo se inserta en el contexto del agente al iniciarse, por lo que el agente tiene acceso inmediato a las instrucciones de la habilidad sin necesidad de invocar una herramienta de habilidades. Los nombres de las aptitudes se resuelven a partir de `skillDirectories` de nivel de sesión.

```typescript
const session = await client.createSession({
    skillDirectories: ["./skills/security"],
    customAgents: [{
        name: "security-auditor",
        description: "Security-focused code reviewer",
        prompt: "Focus on OWASP Top 10 vulnerabilities",
        skills: ["security-scan", "dependency-check"],
    }],
    onPermissionRequest: async () => ({ kind: "approve-once" }),
});
```

> \[!NOTE]
> Las aptitudes son opcionales, cuando `skills` se omite, no se inserta ningún contenido de aptitudes. Los subagentes no heredan habilidades del agente principal; debe enumerarlas explícitamente para cada agente.

### Habilidades y servidores MCP

Las aptitudes pueden complementar las funcionalidades del servidor MCP:

```typescript
const session = await client.createSession({
    skillDirectories: ["./skills/database"],
    mcpServers: {
        postgres: {
            type: "local",
            command: "npx",
            args: ["-y", "@modelcontextprotocol/server-postgres"],
            tools: ["*"],
        },
    },
    onPermissionRequest: async () => ({ kind: "approve-once" }),
});
```

## Solución de problemas

### Las aptitudes no cargan

1. **Compruebe que la ruta existe** - Verifique que la ruta del directorio de habilidades es correcta y que contiene subdirectorios con archivos `SKILL.md`
2. **Comprobación de permisos** : asegúrese de que el SDK puede leer el directorio.
3. **Comprobar el formato de SKILL.md** - Verificar que el archivo Markdown esté bien formado y que cualquier encabezado YAML utilice una sintaxis válida.
4. **Habilitar el registro de depuración**: configure `logLevel: "debug"` para ver los registros de carga de habilidades

### Conflictos de aptitudes

Si varias aptitudes proporcionan instrucciones en conflicto:

* Use `disabledSkills` para excluir habilidades en conflicto
* Reorganización de directorios de aptitudes para evitar superposiciones

## Consulte también

* [Crea tu primera aplicación con tecnología Copilot](/es/copilot/how-tos/copilot-sdk/getting-started#create-custom-agents) - Definir perfiles de IA especializados
* [Crea tu primera aplicación con tecnología Copilot](/es/copilot/how-tos/copilot-sdk/getting-started#step-4-add-a-custom-tool) : crear sus propias herramientas
* [Uso de servidores MCP con el SDK de GitHub Copilot](/es/copilot/how-tos/copilot-sdk/features/mcp) : conexión de proveedores de herramientas externos