Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Deploy docs to GitHub Pages

on:
push:
branches: [master]
paths: &doc-paths
- "docs/**"
- ".github/workflows/docs.yml"
pull_request:
paths: *doc-paths
workflow_dispatch:

permissions:
contents: read

concurrency:
group: pages-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- uses: jdx/mise-action@dba19683ed58901619b14f395a24841710cb4925 # v4.1.0

- run: pnpm install --frozen-lockfile --filter omnibot-docs

- run: pnpm --filter omnibot-docs build
env:
DOCS_BASE: /OmniBot/

- if: &deploy-condition github.event_name == 'push' && github.ref == 'refs/heads/master'
uses: actions/upload-pages-artifact@v5
with:
path: docs/site/.vitepress/dist

deploy:
needs: build
if: *deploy-condition
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/deploy-pages@v5
id: deployment
28 changes: 17 additions & 11 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ pnpm prisma:consolidate # merge *.prisma module files → src/prisma/schema.pr
pnpm prisma:generate # generate Prisma client (required before build)
pnpm prisma:migrate # create and apply a migration
pnpm prisma:studio # open Prisma Studio

# Documentation (in docs/)
pnpm --filter omnibot-docs dev # start VitePress dev server
pnpm --filter omnibot-docs build # build static site
```

Run the whole stack in one command with [pitchfork](https://github.com/jdx/pitchfork) (pinned in `.mise.toml`, so `mise install` provides it):
Expand All @@ -30,17 +34,19 @@ Daemons are defined in `pitchfork.toml` (`bot` depends on `db`). Requires Docker

OmniBot is a modular Discord bot. The core loads modules dynamically — **no registration needed outside the module directory**, modules are auto-discovered at startup. Each module is a self-contained plugin installed/uninstalled per guild.

See [`docs/`](docs/README.md) for the full developer guide:

| Topic | Doc |
| -------------------------- | -------------------------------------------- |
| Creating a module | [docs/modules.md](docs/modules.md) |
| Slash commands | [docs/commands.md](docs/commands.md) |
| Event listeners | [docs/listeners.md](docs/listeners.md) |
| Buttons / modals / selects | [docs/interactions.md](docs/interactions.md) |
| Services | [docs/services.md](docs/services.md) |
| Prisma multi-file schema | [docs/prisma.md](docs/prisma.md) |
| Functional behavior | [docs/functional.md](docs/functional.md) |
See [`docs/site/`](docs/site/README.md) for the full developer guide:

| Topic | Doc |
| -------------------------- | ---------------------------------------------------------------------------------- |
| Creating a module | [docs/site/en/guide/creating-a-module.md](docs/site/en/guide/creating-a-module.md) |
| Slash commands | [docs/site/en/guide/commands.md](docs/site/en/guide/commands.md) |
| Event listeners | [docs/site/en/guide/listeners.md](docs/site/en/guide/listeners.md) |
| Buttons / modals / selects | [docs/site/en/guide/interactions.md](docs/site/en/guide/interactions.md) |
| Services | [docs/site/en/guide/services.md](docs/site/en/guide/services.md) |
| Prisma / database | [docs/site/en/guide/database.md](docs/site/en/guide/database.md) |
| Functional behavior | [docs/functional.md](docs/functional.md) |

The docs are also published as a VitePress site (sources in `docs/site/`) — run `pnpm --filter omnibot-docs dev` to preview.

## Key rules

Expand Down
17 changes: 14 additions & 3 deletions AUDIT.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
🔍 Audit OmniBot
# 🔍 Audit OmniBot

> Les items portent un ID stable `**#N**` (référencé par les commits, ex.
> « fixed in #26 »). Ils sont en **puces** à dessein : oxfmt renumérote les listes
Expand Down Expand Up @@ -79,9 +79,15 @@
- **#26** — Permission des interactions — défaut _fail-open_ (dette de conception, faible). Le flag `requiresAdmin?: boolean` sur `InteractionHandler` (enforcé par le dispatcher) est **optionnel** : un handler sans flag est public. Sûr aujourd'hui (tous les handlers sont admin et explicitement marqués), mais repose sur l'humain pour ne pas oublier `requiresAdmin: true` sur un futur handler sensible.
- **Évolution possible (option C, safe-by-construction)** : remplacer le flag optionnel par un champ **requis** type `access: "admin" | "everyone"` (aucun défaut) → le typage force chaque handler à déclarer son niveau d'accès, impossible d'oublier.
- **Déclencheur** : à faire quand le nombre de handlers grandit, ou dès l'apparition du premier handler volontairement non-admin (le risque d'oubli devient alors réel).
- **#28** — CI : remplacer le grep de version Node par `jdx/mise-action`. `ci.yml` fait `pnpm/action-setup` + `grep '^node = ' .mise.toml` + `setup-node` ; maintenant que `.mise.toml` est la source de vérité (node + pnpm + pitchfork), `mise install` via l'action officielle ferait tout en une étape, sans grep fragile. (Caveat : installerait aussi pitchfork en CI — bénin.)
- **#28** — ~~CI : remplacer le grep de version Node par `jdx/mise-action`~~ 🚫 _non retenu (décidé)_. L'idée : `mise install` en une étape à la place de `pnpm/action-setup` + `grep '^node = ' .mise.toml` + `setup-node`. **Raisons du refus** : (1) perte du cache pnpm automatique fourni par `setup-node` (`cache: pnpm`) — il faudrait le re-câbler à la main (cf. #32) ; (2) `mise install` installerait aussi des outils inutiles en CI (pitchfork…) ; (3) le grep actuel, bien que peu élégant, est explicite et fonctionne. Le ratio bénéfice/inconvénient n'est pas favorable. (`docs.yml` garde `mise-action` car le build docs est peu fréquent et non sensible à ces points.)
- **#29** — Branch protection `master` avec `lint` + `build` en _required status checks_ (réglage GitHub, hors repo). Prérequis pour que l'auto-merge Renovate (`platformAutomerge`) attende réellement la CI ; sans ça il pourrait fusionner sans gate.
- **#30** — `pnpm dev` ne fait pas de hot-reload alors que `CLAUDE.md` annonce « tsx watch » : le script est `node --import tsx src/index.ts` (sans `watch`). À réconcilier (passer le script en `tsx watch`, ou corriger la doc).
- **#31** — Docs VitePress : logo manquant. Le hero de `docs/site/index.md` référençait `/logo.svg`, absent de `docs/site/public/` (image 404 sur le site publié). La référence `image:` a été retirée temporairement. À rétablir une fois qu'un logo existe : ajouter `docs/site/public/logo.svg` puis remettre le bloc `image: { src: /logo.svg, alt: OmniBot }` dans le frontmatter du hero.
- **#32** — CI docs : pas de cache du store pnpm. `docs.yml` utilise `jdx/mise-action` (qui ne cache que les outils, pas le store pnpm), contrairement à `ci.yml` qui bénéficie de `cache: pnpm` via `setup-node`. Le workflow ne tournant que sur changements de `docs/`, le ROI est faible — délayé. À traiter si le build docs devient lent : ajouter un `actions/cache` sur `pnpm store path` (clé sur `hashFiles('pnpm-lock.yaml')`), ou activer le cache pnpm de `mise-action`.
- **#33** — Docs VitePress : la home racine `docs/site/index.md` est entièrement en français (hero + features). **Décidé** : chaque locale est autonome — la nav `Accueil`/`Home` pointe désormais vers `/fr/` et `/en/` (et plus vers `/`), donc la racine `/` n'est plus qu'un point d'entrée rarement visité. Priorité **rétrogradée** : la bilinguiser/neutraliser devient optionnel ; alternative possible : la réduire à une simple redirection vers la locale par défaut.
- **#34** — CI : `permissions: contents: read` est répété à l'identique dans les jobs `lint` et `build` de `ci.yml`. Pourrait remonter au niveau workflow (top-level) pour éviter la duplication. Cosmétique / moindre privilège.
- **#35** — CI (_incertain_) : le bloc de setup (checkout + `pnpm/action-setup` + lecture version Node + `setup-node`) est dupliqué à l'identique entre `lint` et `build`. Factorisation possible **via ancres YAML** (privilégié), mais les ancres ne savent pas concaténer une séquence de steps + des steps supplémentaires ; l'alternative propre est une **composite action** `.github/actions/setup` — dont la complexité induite reste à valider pour seulement 2 jobs.
- **#36** — CI (_incertain_) : incohérence d'install entre `lint` (`pnpm ci`) et `build` (`pnpm install --frozen-lockfile`). Uniformiser, mais **vérifié** : sans filtre, `pnpm ci` comme `pnpm install` font un (clean-)install de **tout le workspace**, vitepress (dép. d'`omnibot-docs`) compris — inutile pour linter/builder/tester le bot. Le vrai gain serait de **scoper l'install CI au paquet du bot** (filtre excluant `docs/site`) plutôt que de choisir `ci` vs `install`. `pnpm ci` n'aide pas sur ce point (il ignore `--filter`, cf. essais docs).

---

Expand All @@ -105,6 +111,11 @@ Récapitulatif des actions restantes
| 🔵 | Extraire client/modules dans un context.ts (#14) — délayé |
| 🟣 | Accès interactions : champ requis (option C, #26) — évol. |
| 🟠 | Enum >25 options : warn + doc (#27) |
| 🟣 | CI : `jdx/mise-action` au lieu du grep (#28) |
| 🔵 | Branch protection : `lint`+`build` required (#29) — GitHub |
| 🟣 | `pnpm dev` : hot-reload vs doc (#30) |
| 🟢 | Docs : ajouter un logo + rétablir le hero image (#31) |
| 🟢 | CI docs : cache du store pnpm (#32) — délayé |
| 🟢 | Docs : home racine FR-only (#33) — optionnel |
| 🟢 | CI : `permissions` au niveau workflow (#34) |
| 🟢 | CI : factoriser le setup dupliqué (#35) — incertain |
| 🟢 | CI : uniformiser/scoper l'install (#36) — incertain |
49 changes: 0 additions & 49 deletions docs/README.md

This file was deleted.

80 changes: 0 additions & 80 deletions docs/commands.md

This file was deleted.

11 changes: 6 additions & 5 deletions docs/functional.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,12 @@ Dès qu'un message est posté dans le salon configuré :
2. Si un message de bienvenue est configuré, le bot le poste dans le fil

**Variables disponibles dans le template de nom :**
| Variable | Valeur |
|---|---|
| `{messageAuthor}` | Nom d'affichage ou pseudo de l'auteur |
| `{messageContent}` | 50 premiers caractères du message |
| `{timestamp}` | Heure au format `JJ/MM HH:MM` (locale française) |

| Variable | Valeur |
| ------------------ | ------------------------------------------------ |
| `{messageAuthor}` | Nom d'affichage ou pseudo de l'auteur |
| `{messageContent}` | 50 premiers caractères du message |
| `{timestamp}` | Heure au format `JJ/MM HH:MM` (locale française) |

**Template par défaut :** `Discussion - {messageAuthor}`
**Message de bienvenue par défaut :** `💬 Utilisez ce fil pour discuter de ce sujet !`
Expand Down
53 changes: 0 additions & 53 deletions docs/listeners.md

This file was deleted.

Loading