> ## Documentation Index
> Fetch the complete documentation index at: https://www.chapterjs.org/llms.txt
> Use this file to discover all available pages before exploring further.

# chapterjs dev

> Faire tourner votre bot sur votre serveur de test pendant que vous l’écrivez, avec chaque fichier rechargé à l’enregistrement

`chapterjs dev` fait tourner le bot du dossier courant sur votre serveur de test, et recharge vos fichiers quand vous les enregistrez. C’est ce que lance le script `dev` de votre projet :

```bash pnpm theme={"theme":{"light":"github-light","dark":"vesper"}}
pnpm dev
```

```bash npm theme={"theme":{"light":"github-light","dark":"vesper"}}
npm run dev
```

```bash yarn theme={"theme":{"light":"github-light","dark":"vesper"}}
yarn dev
```

```bash bun theme={"theme":{"light":"github-light","dark":"vesper"}}
bun dev
```

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
✓ Connected to My Server as my-bot
ℹ Intents computed from your files: GUILDS, GUILD_MESSAGES, MESSAGE_CONTENT
✓ 1 command, 2 events loaded
✓ Commands updated on My Server
```

C’est tout : le bot est en ligne sur votre serveur de test, vos commandes y apparaissent, et chaque fichier de `src/` est surveillé. Tout ce dont la commande a besoin de Discord est déduit de vos fichiers : les intents de la deuxième ligne, ce dont le bot [se souvient](https://www.chapterjs.org/fr/memory.md), les commandes à enregistrer.

> [!NOTE]
>
> Les options, les variables d’environnement et les codes de sortie de la commande sont dans la [référence du CLI](https://www.chapterjs.org/fr/reference/cli.md#chapterjs-dev).

## Ce dont elle a besoin

Un fichier `.env` à la racine de votre projet, avec deux valeurs :

```bash .env theme={"theme":{"light":"github-light","dark":"vesper"}}
BOT_TOKEN=
DEV_GUILD_ID=
```

Où les trouver est dans [Votre application Discord](https://www.chapterjs.org/fr/setup/discord-application.md). Une valeur réglée dans le vrai environnement l’emporte sur le fichier.

> [!NOTE]
>
> **`BOT_TOKEN` est le token d’une application de dev, pas du bot qui est en ligne pour tout le monde.** Nous recommandons deux applications dès le départ : un bot pour votre ordinateur, un bot pour la production. Avec un seul bot pour les deux, votre serveur de test affiche en double chaque commande que vous modifiez, et la présence, les intents privilégiés et le token de production sont partagés avec ce que vous essayez. Comment la mettre en place : [Un second bot pour le développement](https://www.chapterjs.org/fr/run/start.md#un-second-bot-pour-le-développement).

Sans le fichier, la commande s’arrête avant toute autre chose :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
✗ There is no .env file in this folder.
  Copy .env.example to .env, then fill in BOT_TOKEN and DEV_GUILD_ID.
```

Et elle doit tourner dans le dossier de votre bot, celui qui contient `package.json` et `src/` :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
✗ There is no src folder here.
  Run this command in the folder of your bot (the one with package.json), or create a project with "pnpm create chapterjs".
```

## Ce qu’elle vérifie pour vous

Avant de se connecter, `chapterjs dev` s’assure que tout est en place. Quand quelque chose manque, elle dit quoi et comment le corriger, et quand vous êtes dans un terminal, elle attend la correction au lieu de vous faire tout recommencer :

> [accordion] Une valeur de .env est fausse
>
> Chaque problème est affiché d’un coup : une valeur vide, encore la valeur d’exemple, un token avec un espace dedans, un identifiant de serveur qui n’est pas fait de chiffres. La commande s’arrête ; corrigez `.env` et relancez-la.
>
> ```text theme={"theme":{"light":"github-light","dark":"vesper"}}
> ✗ .env: BOT_TOKEN is still the example value.
>   Copy the token of your bot from https://discord.com/developers/applications → your application → Bot → Reset Token.
> ✗ .env: DEV_GUILD_ID is empty.
>   In Discord, right-click your test server → Copy Server ID (enable Settings → Advanced → Developer Mode to see it).
> ```

> [accordion] Le token est refusé
>
> Discord ne reconnaît pas le token, généralement parce qu’il a été réinitialisé. La commande s’arrête.
>
> ```text theme={"theme":{"light":"github-light","dark":"vesper"}}
> ✗ Discord refused the bot token. Copy it again from the Developer Portal (your application → Bot → Reset Token) into BOT_TOKEN in your .env file.
> ```

> [accordion] Le bot n’est pas sur votre serveur de test
>
> Vous recevez un lien qui ajoute le bot à ce serveur, avec toutes les permissions : un serveur de test est un terrain de jeu. Ouvrez-le, confirmez, et la commande continue toute seule.
>
> ```text theme={"theme":{"light":"github-light","dark":"vesper"}}
> ⚠ Your bot is not in your dev server yet (DEV_GUILD_ID=123456789012345678).
>   Open this link to add it:
>   https://discord.com/oauth2/authorize?client_id=...&scope=bot+applications.commands&permissions=8&guild_id=123456789012345678&disable_guild_select=true
>   If the link shows another server, DEV_GUILD_ID is not the ID of a server you manage.
>   Waiting for the bot to be added...
> ✓ The bot joined My Server
> ```

> [accordion] Un intent privilégié n’est pas activé
>
> Certains [événements](https://www.chapterjs.org/fr/events.md#intents--rien-à-lister) ont besoin d’une option activée pour votre bot dans le Developer Portal. Vous recevez les fichiers qui en ont besoin et le lien vers la bonne page. Activez-la, enregistrez, et la commande continue toute seule.
>
> ```text theme={"theme":{"light":"github-light","dark":"vesper"}}
> ⚠ Your files need an option that is not enabled for your bot:
>   - Message Content Intent, needed by src/events/ping.ts
>   Enable it under "Privileged Gateway Intents", then save:
>   https://discord.com/developers/applications/123456789012345678/bot
>   Waiting for you to enable it...
> ✓ Privileged intents enabled
> ```
>
> Les trois options et les fichiers qui en ont besoin sont dans [Votre application Discord](https://www.chapterjs.org/fr/setup/discord-application.md#intents-privilégiés).

> [!NOTE]
>
> La commande n’attend que lorsqu’elle tourne dans un terminal. Lancée par un autre programme, les deux mêmes messages sont des erreurs (`✗`) et la commande s’arrête avec le code de sortie 1.

## Rechargement à l’enregistrement

Enregistrez un fichier et votre bot utilise la nouvelle version, sans se déconnecter :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
↻ Reloaded in 12 ms, 1 command, 2 events loaded
```

Chaque fichier de `src/` est surveillé : vos [commandes](https://www.chapterjs.org/fr/commands.md), vos [événements](https://www.chapterjs.org/fr/events.md) et les fichiers qu’ils importent. Un nouveau fichier ou un nouveau dossier est pris en compte dès qu’il est enregistré, et plusieurs fichiers enregistrés d’un coup font un seul rechargement. Un fichier enregistré pendant le démarrage de la commande n’est pas perdu : il est rechargé juste après.

Un fichier avec une erreur n’arrête jamais votre bot. L’erreur est affichée avec le fichier et la ligne, et **la dernière version qui fonctionnait continue de tourner** jusqu’à ce que vous la corrigiez :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
✗ src/events/ping.ts:4 Expression expected
⚠ Reloaded with an error: that file keeps running its last working version
```

Avec plusieurs fichiers cassés, le message les compte : `⚠ Reloaded with 2 errors: those files keep running their last working version`. Un fichier qui n’a jamais fonctionné est mis de côté jusqu’à ce qu’il fonctionne.

> [!NOTE]
>
> Recharger relance vos fichiers depuis zéro : une variable gardée dans un fichier (un compteur, une liste...) revient à sa première valeur à chaque enregistrement. Les paquets de `node_modules` ne sont pas rechargés.

### Quand vos fichiers ont besoin de plus de Discord

Les intents sont donnés à Discord à la connexion du bot. Quand un fichier que vous enregistrez a besoin d’un intent que la connexion n’a pas (un nouvel événement, un fichier qui écoute maintenant les messages privés), le bot se reconnecte tout seul :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
↻ Your files now need more from Discord (GUILD_MEMBERS): reconnecting...
✓ Reconnected, 3 events loaded
```

Si cet intent est privilégié et pas encore activé, vous recevez le même message et la même attente qu’avant la connexion. L’événement `ready` tourne une fois par démarrage, pas quand le bot se reconnecte.

## Vos commandes sur votre serveur de test

Vos commandes sont enregistrées sur votre serveur de test uniquement, où elles apparaissent immédiatement. Discord n’est prévenu à nouveau que quand quelque chose que les gens voient a changé (un nom, une description, une option, une traduction) : changer ce que *fait* une commande ne coûte aucune requête, et relancer le bot non plus.

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
✓ Commands updated on My Server
```

Lors d’un rechargement, la ligne est `↻ Commands updated on My Server`. Quand Discord refuse ce que déclarent vos fichiers, le bot continue de tourner avec les commandes que Discord a déjà :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
✗ Discord refused the commands of your project: Discord refused PUT /applications/{application.id}/guilds/{guild.id}/commands: Invalid Form Body (50035)
    [0].name: Command name is invalid
```

Une commande que la production affiche déjà pour tout le monde, exactement comme votre fichier la déclare, n’est pas ajoutée une seconde fois. Pendant que vous en modifiez une, votre serveur de test l’affiche en double et la commande vous le dit une fois :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
ℹ /poll is not the same here as in production, so My Server shows it twice: yours, and the one everyone has. It is shown once again when production runs your version.
```

Une application de dev n’affiche jamais cela : voir [Un second bot pour le développement](https://www.chapterjs.org/fr/run/start.md#un-second-bot-pour-le-développement).

## Seulement votre serveur de test

En dev, votre bot ne voit que le serveur de `DEV_GUILD_ID`. Ce qui se passe dans les autres serveurs où il se trouve, et en messages privés, est ignoré, et les intents qui ne servent qu’aux messages privés ne sont pas demandés. C’est le rôle de [`chapterjs start`](https://www.chapterjs.org/fr/run/start), qui peut faire tourner le même bot pour tout le monde en même temps.

Ce qui ne fonctionne qu’en messages privés ne peut pas être essayé en dev, et `chapterjs dev` nomme le fichier une fois :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
ℹ src/commands/settings.ts /settings only works in private messages, and chapterjs dev only runs your bot in My Server. Try it with chapterjs start.
ℹ src/events/inbox.ts this messageCreate file only works in private messages, and chapterjs dev only runs your bot in My Server. Try it with chapterjs start.
```

## Les types de votre projet

Au démarrage, `chapterjs dev` écrit les types de votre projet dans le dossier `.chapterjs/` : ce que votre projet ajoute aux types de `chapterjs`, les fichiers de `public/` que propose `asset()`, vos [langues](https://www.chapterjs.org/fr/translated-messages.md), qui typent `t`, et vos commandes. Le dossier est ignoré par git et supprimable.

[`chapterjs sync`](https://www.chapterjs.org/fr/reference/cli#chapterjs-sync) les écrit sans lancer le bot. Les projets créés avec `create chapterjs` le lancent après chaque installation, pour que votre éditeur connaisse les types tout de suite.

Pour vérifier les types de tout votre projet depuis un terminal, utilisez le script `typecheck` de votre projet :

```bash pnpm theme={"theme":{"light":"github-light","dark":"vesper"}}
pnpm typecheck
```

```bash npm theme={"theme":{"light":"github-light","dark":"vesper"}}
npm run typecheck
```

```bash yarn theme={"theme":{"light":"github-light","dark":"vesper"}}
yarn typecheck
```

```bash bun theme={"theme":{"light":"github-light","dark":"vesper"}}
bun typecheck
```

> [!WARNING]
>
> Il lance `tsc -b`. Un simple `tsc` ne vérifie rien dans un projet ChapterJS : vos fichiers sont vérifiés par les projets de `.chapterjs/`, que seuls `tsc -b` et votre éditeur suivent.

## Pendant que le bot tourne

La connexion à Discord est gardée en vie par le framework. Quand elle tombe, le bot se reconnecte tout seul et vos fichiers continuent de tourner :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
⚠ Connection to Discord lost, reconnecting...
↻ Reconnected to Discord
```

Une erreur dans une de vos fonctions est affichée avec le fichier et la ligne, et n’arrête rien d’autre : voir [quand votre fonction échoue](https://www.chapterjs.org/fr/commands/answering.md#quand-votre-fonction-échoue). Le bot s’occupe aussi de sa propre mémoire : voir [Mémoire](https://www.chapterjs.org/fr/memory.md).

## Une nouvelle version de ChapterJS

Une fois le bot en ligne, `chapterjs dev` vous prévient quand une version plus récente du paquet est sortie, avec la commande qui l’installe, écrite pour le gestionnaire de paquets de votre projet :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
ℹ A new version of chapterjs is out: 0.3.0 (you have 0.2.3). To update, run:
  pnpm update chapterjs --latest
  What changed: https://www.chapterjs.org/changelog
```

npm est interrogé au plus une fois par jour, après la mise en ligne du bot, et ne le retient jamais : sans internet, la ligne n’apparaît pas. Rien n’est installé à votre place : lancez la commande quand vous voulez, puis relancez `chapterjs dev`.

## Arrêter

Appuyez sur `Ctrl+C`. Le bot se déconnecte proprement et passe hors ligne immédiatement :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
✓ Disconnected
```

Un second `Ctrl+C`, une seconde plus tard, arrête le processus sans attendre ; Discord affiche alors le bot en ligne jusqu’à ce qu’il remarque que la connexion a disparu.

> [card] [chapterjs build](https://www.chapterjs.org/fr/run/build.md)
>
> Vérifier votre bot et le compiler pour la production.

> [card] [Dépannage](https://www.chapterjs.org/fr/run/troubleshooting.md)
>
> Chaque message, et quoi en faire.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.