# @inwink-mcp/backoffice-extension-helpers

CLI pour **bootstrapper**, **packager** et **vérifier** les extensions backoffice inwink.

Une extension inwink est une SPA React/TypeScript 100 % client-side, qui s'authentifie en OIDC (Authorization Code + PKCE) et appelle les API inwink en Bearer token. Cette CLI génère le squelette conforme (auth, config Vite, manifest, packaging) pour éviter de le réécrire à la main, puis automatise le build + zip + contrôle de conformité.

S'utilise via `npx`, sans installation :

```bash
npx @inwink-mcp/backoffice-extension-helpers@latest <commande> [options]
```

## Commandes

### `bootstrap`

Génère le squelette d'une extension dans le dossier courant (ou `--dir`).

```bash
npx @inwink-mcp/backoffice-extension-helpers@latest bootstrap \
  --name mon-extension \
  --display-name "Mon Extension" \
  --description "Ce que fait l'extension." \
  --author moi@inwink.com \
  --event-api-url https://.../event \
  --community-api-url https://.../community \
  --customer-api-url https://.../customer
```

| Option | Description |
|--------|-------------|
| `--name <slug>` | **(requis)** Slug unique (minuscules, chiffres, tirets) |
| `--display-name <name>` | **(requis)** Nom affiché dans l'interface inwink |
| `--description <text>` | **(requis)** Description courte |
| `--author <email>` | **(requis)** Email de l'auteur |
| `--event-api-url <url>` | **(requis)** URL de base de l'API Event |
| `--community-api-url <url>` | **(requis)** URL de base de l'API Community |
| `--customer-api-url <url>` | **(requis)** URL de base de l'API Customer |
| `--template <id>` | Template à utiliser (défaut : `vite-extension`) |
| `--dir <path>` | Dossier cible (défaut : dossier courant) |
| `--force` | Écrire même si le dossier cible n'est pas vide |
| `--install` | Lancer `npm install` après la génération |

Fichiers générés : `extension.manifest.json`, `package.json`, `vite.config.ts`, `tsconfig*.json`, `index.html`, `src/` (auth OIDC, `api/endpoints.ts`, hooks `useInwink*Api`, `main.tsx`, `App.tsx`), `scripts/zip-build.mjs`, ainsi que `AGENTS.md` et `CLAUDE.md` pour guider les agents IA. Les URLs d'API sont injectées dans `src/api/endpoints.ts`.

### `package`

Build + zip `{name}-{version}.zip` + vérification de conformité, en une commande.

```bash
npx @inwink-mcp/backoffice-extension-helpers@latest package
```

| Option | Description |
|--------|-------------|
| `--dir <path>` | Dossier du projet (défaut : dossier courant) |

Lance `npm run build` dans le projet, zippe le **contenu** de `dist/`, puis vérifie la conformité. Sort en code ≠ 0 si la conformité échoue.

### `verify`

Vérifie la conformité **sans** rebuild (utile en CI ou après un build manuel).

```bash
npx @inwink-mcp/backoffice-extension-helpers@latest verify
```

| Option | Description |
|--------|-------------|
| `--dir <path>` | Dossier du projet (défaut : dossier courant) |
| `--zip <file>` | Chemin d'un zip à inspecter |

Contrôles effectués :

- `extension.manifest.json` présent, `name` (slug) et `version` (semver) valides ;
- `dist/` contient `index.html` + `extension.manifest.json` à la racine + `assets/` ;
- le zip contient `index.html` et `extension.manifest.json` à la racine, sans `node_modules/`, `src/` ni `dist/` ;
- avertissements : `base: './'` absent de `vite.config.ts`, usage de `BrowserRouter`.

## Templates

Les templates sont des sous-dossiers de [`templates/`](templates/). Le seul template actuel est [`vite-extension`](templates/vite-extension/). En ajouter d'autres : créer un nouveau sous-dossier (les fichiers `.tpl` voient leurs placeholders `__NAME__`, `__DISPLAY_NAME__`, `__DESCRIPTION__`, `__AUTHOR__` substitués et leur suffixe `.tpl` retiré ; les autres fichiers sont copiés tels quels).

## Développement

```bash
npm install
npm run build     # compile src/ → dist/cli.js (tsup, ESM, shebang)
npm run dev       # build en watch
```

Test local rapide :

```bash
node dist/cli.js bootstrap --name demo --display-name "Demo" --description "..." --author a@b.com --dir /tmp/demo
```
