Commandes personnalisées OpenCode

Les commandes personnalisées vous permettent d'encapsuler des prompts couramment utilisés dans une commande courte. Dans la TUI,/command namevous pouvez l'exécuter d'une seule frappe, évitant la saisie répétée du même prompt.

Par exemple, encapsulez le prompt complexe "exécuter les tests et analyser les causes d'échec" comme/testChaque fois, il vous suffit de saisir deux caractères pour le déclencher.

Les commandes personnalisées sont/init、/undo、/redo、/share、/helpdes extensions au-delà des commandes intégrées, etc.

Si votre commande personnalisée porte le même nom qu'une commande intégrée,la commande personnalisée remplacera la commande intégrée.Veuillez éviter d'utiliserinit、undo、redo、share、helpcomme nom de commande personnalisée, sauf si vous avez explicitement besoin de remplacer le comportement intégré.


Deux méthodes de définition

Les commandes personnalisées prennent en charge deux méthodes de définition avec exactement le même effet. Vous pouvez choisir selon votre préférence personnelle :

Méthode Fichier Scénario applicable
Configuration JSON opencode.jsondecommandChamp Moins de commandes, préférez la gestion centralisée de toutes les configurations
Fichier Markdown commands/dans le répertoire.mdfichier Contenu de commande plus long, préférez gérer chaque commande séparément

Méthode 1 : Configuration JSON

Dansopencode.jsondecommandDéfinissez-le dans le champ ; le nom de la clé est le nom de la commande :

Exemple

{
  "$schema": "https://opencode.ai/config.json",
  "command": {
    "test": {                           // Nom de la commande, invoquée via /test dans la TUI
      "template": "Exécutez la suite de tests complète avec un rapport de couverture et affichez les échecs éventuels.\nConcentrez-vous sur les tests en échec et proposez des corrections.",
                                        // template : le contenu du prompt envoyé au LLM (obligatoire)
      "description": "Exécuter les tests avec couverture",
                                        // description : la description affichée dans la liste des commandes de la TUI (facultative)
      "agent": "build",                 // agent : l'agent qui exécute cette commande (facultatif)
      "model": "anthropic/claude-3-5-sonnet-20241022"
                                        // model : remplace le modèle utilisé par cette commande (facultatif)
    }
  }
}

Une fois la configuration terminée, saisissez dans la zone de saisie de la TUI/testet appuyez sur Entrée pour exécuter la commande.


Méthode 2 : fichiers Markdown

Danscommands/Créez dans le répertoire.mdun fichier pour définir la commande.Le nom du fichier est le nom de la commande.Le contenu du fichier est divisé en deux parties :

  • Frontmatter(---la section YAML encadrée par ---) : définit les attributs de la commande
  • Corps(contenu sous le Frontmatter) : devient le modèle de prompt envoyé au LLM

Les fichiers Markdown prennent en charge deux emplacements de stockage :

  • Niveau projet :.opencode/commands/命令名.md(valide uniquement pour le projet actuel)
  • Global :~/.config/opencode/commands/命令名.md(valide pour tous les projets)
<!-- 文件路径:.opencode/commands/test.md -->
---
description: Run tests with coverage
agent: build
model: anthropic/claude-3-5-sonnet-20241022
---

Run the full test suite with coverage report and show any failures.
Focus on the failing tests and suggest fixes.

Le nom du fichier esttest.md, donc le nom de la commande esttest, et dans le TUI, elle est invoquée via/test.


Syntaxe des modèles d'invite

L'invite de la commande (templatechamp ou corps Markdown) prend en charge la syntaxe spéciale suivante, permettant à l'invite de répondre dynamiquement aux arguments, d'injecter la sortie de commande en temps réel ou de référencer le contenu des fichiers.

1. Passage d'arguments ($ARGUMENTS)

Utilisez la$ARGUMENTSespace réservé pour recevoir les arguments passés lorsque la commande est invoquée, inséré sous forme de chaîne complète :

<!-- 文件路径:.opencode/commands/component.md -->
---
description: Create a new React component
---

Create a new React component named $ARGUMENTS with TypeScript support.
Include proper typing and basic structure.

Lors de l'invocation, ajoutez les arguments après le nom de la commande :

/component Button

$ARGUMENTSsera remplacé parButtonLe prompt réellement exécuté devient :

Create a new React component named Button with TypeScript support.
Include proper typing and basic structure.

2. Paramètres positionnels ($1, $2, $3...)

Lorsque vous devez passer plusieurs arguments indépendants, vous pouvez utiliser des paramètres positionnels$1、$2、$3pour référencer chaque argument séparément, en les séparant par des espaces ; mettez entre guillemets les arguments contenant des espaces :

<!-- 文件路径:.opencode/commands/create-file.md -->
---
description: Create a new file with content
---

Create a file named $1 in the directory $2
with the following content: $3

Exemple d'invocation (les arguments contenant des espaces sont mis entre guillemets) :

/create-file config.json src "{ \"key\": \"value\" }"

Résultats de remplacement pour chaque espace réservé :

Espace réservé Remplacé par
$1 config.json
$2 src
$3 { "key": "value" }

3. Injection de la sortie d'une commande Shell (!`command`)

En utilisant la!`shell命令`syntaxe, vous pouvez exécuter une commande Shell lorsque la commande est exécutée et insérer sa sortie directement dans le prompt. La commande Shell s'exécute dans lerépertoire racine du projet. C'est très utile lorsque vous avez besoin que le LLM analyse des données en temps réel (comme les résultats de tests, les journaux git, etc.) :

<!-- 文件路径:.opencode/commands/analyze-coverage.md -->
---
description: Analyze test coverage
---

Here are the current test results:
!`npm test`

Based on these results, suggest improvements to increase coverage.
<!-- 文件路径:.opencode/commands/review-changes.md -->
---
description: Review recent git changes
---

Recent git commits:
!`git log --oneline -10`

Review these changes and suggest any improvements or potential issues.

Lorsque la commande est exécutée,!`git log --oneline -10`il sera remplacé par la sortie réelle de git log, puis envoyé au LLM avec le prompt.

4. Référencement du contenu des fichiers (@file_path)

En utilisant la@file pathsyntaxe, le contenu du fichier spécifié peut être automatiquement inclus dans le prompt sans copier-coller manuel :

<!-- 文件路径:.opencode/commands/review-component.md -->
---
description: Review a component for performance issues
---

Review the component in @src/components/Button.tsx.
Check for performance issues and suggest improvements.

Lorsque la commande est exécutée,@src/components/Button.tsxil sera remplacé par le contenu complet du fichier, ce qui permet au LLM d’analyser directement le code du fichier.


Options de configuration détaillées

Voici toutes les options de configuration prises en charge par les commandes personnalisées. Dans les fichiers Markdown, écrivez-les dans le frontmatter ; dans la configuration JSON, écrivez-les sous l’objet command :

Option Requis Type Description
template Obligatoire (méthode JSON) String Le contenu du prompt envoyé au LLM. Dans la méthode Markdown, le corps lui-même est le modèle ; aucune déclaration séparée n’est nécessaire.
description Optional String Une brève description de la commande. Lorsque vous tapez/, elle s’affiche dans la liste des commandes de la TUI, ce qui aide à identifier rapidement l’objectif de la commande.
agent Optional String Le nom de l’agent qui exécute cette commande. S’il n’est pas spécifié, l’agent actuellement sélectionné est utilisé. Si un sous-agent est spécifié, la commande déclenche par défaut un appel de sous-agent.
subtask Optional Boolean Défini àtruepeut forcer la commande à s’exécuter en tant que sous-agent, évitant la pollution du contexte de la session principale. Défini surfalsepeut interdire le comportement d'invocation de sous-agent.
model Optional String Remplace le modèle utilisé par cette commande, au formatprovider/model-idtel queanthropic/claude-3-5-sonnet-20241022

La relation entre agent et subtask

agentetsubtaskIls contrôlent conjointement la manière dont la commande est exécutée :

  • ifagentSi l'agent spécifié est un sous-agent (le mode est subagent), la commandedéclenche par défaut un appel à un sous-agentet s'exécute dans un contexte indépendant sans affecter la session principale.
  • Si vous ne souhaitez pas ce comportement, définissezsubtaskàfalsepour forcer l'exécution dans la session principale.
  • Si vous définissezsubtaskàtrue, indépendamment desmodeparamètres de l'agent, la commande s'exécute toujours comme un sous-agent, adapté aux scénarios nécessitant un isolement complet du contexte.

Exemple

{
  "$schema": "https://opencode.ai/config.json",
  "command": {
    "analyze": {
      "template": "Analyser la base de code pour détecter d'éventuelles vulnérabilités de sécurité.",
      "description": "Analyse de sécurité (s'exécute indépendamment, ne pollue pas la session principale)",
      "subtask": true,            // Forcer son exécution en tant que sous-agent ; les résultats de l'analyse n'occupent pas le contexte de la session principale
      "model": "anthropic/claude-3-5-sonnet-20241022"
    },
    "review": {
      "template": "Passer en revue les modifications de code actuelles.",
      "description": "Revue de code (s'exécute dans l'agent actuel)",
      "agent": "plan",            // Utiliser l'agent plan pour exécuter
      "subtask": false            // Désactiver l'invocation du sous-agent et exécuter dans la session principale
    }
  }
}

Exemples d'utilisation complets

Exemple 1 : Commande de génération de code multi-paramètres

<!-- 文件路径:.opencode/commands/gen-api.md -->
---
description: Generate a REST API endpoint
agent: build
---

Generate a $1 REST API endpoint for the resource "$2".
Place the file in the $3 directory.
Include input validation, error handling, and JSDoc comments.

<!-- 调用示例:/gen-api POST user src/api -->
<!-- $1 = POST,$2 = user,$3 = src/api -->

Exemple 2 : Commande de revue de code combinant la sortie shell et les références de fichiers

<!-- 文件路径:.opencode/commands/pr-review.md -->
---
description: Review changes in current branch against main
agent: plan
subtask: true
---

Please review the following changes for code quality, potential bugs, and security issues.

## Recent commits
!`git log main..HEAD --oneline`

## Changed files
!`git diff main --name-only`

## Diff content
!`git diff main`

## Project coding guidelines
@.opencode/AGENTS.md

Provide structured feedback with severity levels (critical / warning / suggestion).

Exemple 3 : Commande planifiée d'instantané de données (méthode JSON)

{
  "$schema": "https://opencode.ai/config.json",
  "command": {
    "healthcheck": {
      "description": "Check project health status",
      "template": "Analyze the project health based on the following data:\n\nDependency vulnerabilities:\n!`npm audit --json`\n\nOutdated packages:\n!`npm outdated`\n\nTest results:\n!`npm test -- --passWithNoTests 2>&1 | tail -20`\n\nSummarize the issues by severity and suggest a prioritized action plan.",
      "model": "anthropic/claude-3-5-sonnet-20241022",
      "subtask": true
    }
  }
}
Autres extensions