MY PIXEL COMPANY
Documentation Technique

Guide complet pour installer, configurer et contribuer à My Pixel Company — la plateforme de gestion de workforce IA avec une identité visuelle pixel art rétro.

Getting Started

Prérequis

🟩Node.js 18 – 22 (LTS)
$ node -v
📦npm 9+
$ npm -v
🔧Git
$ git --version
⚠ NODE 26 INCOMPATIBLE — UTILISER NODE 18–22
better-sqlite3 ne supporte pas Node.js 26 (bindings natifs incompilables). Utilisez Node.js ≥ 18 et ≤ 22 — LTS recommandé : Node 20 ou 22. Ajoutez un fichier .nvmrc contenant 20 à la racine pour que nvm/fnm détectent automatiquement la bonne version.
Installer et utiliser Node 20 via nvm :
bash
# Installer nvm si absent
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# Installer et utiliser Node 20 LTS
nvm install 20
nvm use 20

# Vérifier
node -v  # doit afficher v20.x.x
Alternative avec fnm (plus rapide) :
bash
fnm install 20 && fnm use 20

Configuration SSH

🔑 SSH OBLIGATOIRE
Le clonage SSH est obligatoire. Une clé SSH est nécessaire pour accéder à GitLab/GitHub sans mot de passe. Doc GitLab → / Doc GitHub →
1. Vérifier si une clé SSH existe déjà :
bash
ls ~/.ssh/id_*.pub
Si un fichier s'affiche (ex. id_ed25519.pub), vous avez déjà une clé — passez à l'étape 3.
2. Générer une nouvelle clé SSH (si absente) :
bash
ssh-keygen -t ed25519 -C "ton@email.com"
Appuyez sur Entrée pour accepter l'emplacement par défaut, puis définissez une passphrase.
3. Ajouter la clé publique à votre compte GitLab/GitHub :
bash
cat ~/.ssh/id_ed25519.pub
Copiez la clé affichée et collez-la dans GitLab → Préférences → SSH Keys (ou équivalent GitHub).
4. Tester la connexion SSH :
bash
ssh -T git@gitlab.com
# ou pour GitHub :
ssh -T git@github.com
Résultat attendu : Welcome to GitLab, @username!

Installation

bash
# 1. Cloner le dépôt (SSH)
git clone git@gitlab.com:Safronix/my-pixel-company.git
cd my-pixel-company

# 2. Lancer le projet
npm start

Variables d'environnement

VariableValeur défautDescription
DATABASE_URL./db.sqliteChemin SQLite
JWT_SECRET(généré)Secret JWT (32+ chars)
ANTHROPIC_API_KEYsk-ant-...Clé Anthropic (Claude)
PORT3001Port API Fastify
NEXT_PUBLIC_API_URLhttp://localhost:3001URL API pour le frontend

Démarrage

bash
npm start

Stack Technique

Next.js (App Router)
Frontend

Pages dans apps/web/src/app/. Composants dans src/components/. Hooks dans src/hooks/. Auth context dans src/lib/auth.tsx.

Fastify
API

Routes dans apps/api/src/routes/. DB queries dans src/db/. Services dans src/services/. Middleware auth dans src/middleware/auth.ts.

🗄SQLite (better-sqlite3)
Base de données

Accès synchrone, pas d'ORM. Toutes les queries dans apps/api/src/db/<resource>.ts.

🤖Claude Code CLI
Agents IA

Les agents sont des processus Claude Code CLI spawnés via child_process. Supervisés par l'AgentManager (singleton EventEmitter).

FLUX DE DONNÉES
BrowserNext.js (3000) → API calls → Fastify API (3001)
├─ → SQLite (queries synchrones)
├─ → Redis (cache / events)
└─ → AgentManager → child_process → Claude Code CLI
← SSE logs ← MCP Server

Structure du Monorepo

Le projet est organisé en npm workspaces. Un seul npm install à la racine installe tout.

text
my-pixel-company/
├── apps/
│   ├── api/                      # Fastify API (Node.js + TypeScript)
│   │   └── src/
│   │       ├── routes/           # Routes HTTP par ressource
│   │       ├── db/               # Queries SQLite (better-sqlite3)
│   │       ├── services/         # Logique métier
│   │       └── middleware/
│   │           └── auth.ts       # Vérification JWT
│   └── web/                      # Next.js App Router (TypeScript)
│       └── src/
│           ├── app/              # Pages (App Router)
│           ├── components/       # Composants React
│           ├── hooks/            # Hooks React
│           └── lib/
│               ├── api.ts        # Client API centralisé
│               └── auth.tsx      # Contexte d'authentification
└── packages/
    └── shared/
        └── src/
            └── types.ts          # Types partagés api ↔ web
apps/api/src/routes/<resource>.tsHandler HTTP (GET, POST, PUT, DELETE)
apps/api/src/db/<resource>.tsQueries SQLite synchrones
apps/api/src/services/<resource>.tsLogique métier & orchestration
packages/shared/src/types.tsTous les types partagés

Conventions de Code

TYPESCRIPT
✓ STRICT MODE PARTOUT
TypeScript strict activé dans tous les packages. Pas de any. Tous les types partagés dans packages/shared/src/types.ts.
typescript
// ✓ Correct — type explicite depuis packages/shared
import type { Agent, Task } from '@my-pixel-company/shared'

// ✗ Interdit — any implicite
const data: any = await fetchAgent(id)
VALIDATION DES INPUTS API
✓ ZOD OBLIGATOIRE
Toutes les inputs de routes API sont validées avec zod. Pas de req.body direct sans schéma.
typescript
import { z } from 'zod'

const CreateAgentSchema = z.object({
  name:     z.string().min(1).max(100),
  model:    z.string(),
  provider: z.enum(['anthropic', 'openai']),
})

// Dans la route Fastify
fastify.post('/agents', async (req, reply) => {
  const body = CreateAgentSchema.parse(req.body)
  // ...
})
FORMAT D'ERREUR HTTP
typescript
// Format standard : { error: string, code?: string }
reply.status(404).send({ error: 'Agent not found', code: 'AGENT_NOT_FOUND' })
reply.status(400).send({ error: 'Invalid input' })
VARIABLES D'ENVIRONNEMENT
⚠ TOUJOURS VIA process.env
Lire les variables depuis process.env, ne jamais hardcoder des valeurs sensibles.
typescript
// ✓ Correct
const jwtSecret = process.env.JWT_SECRET ?? throwMissingEnv('JWT_SECRET')

// ✗ Interdit
const jwtSecret = 'mon-secret-hardcode'
SÉCURITÉ
JWT vérifié via middleware sur toutes les routes sauf /auth/login et /auth/forgot-password
Pas de localStorage pour données sensibles (token JWT est l'exception tolérée)
Pas de requêtes DB dans les composants React — toujours via l'API
Pas de spawn d'agent sans validation de l'AgentType en DB d'abord
Pas de suppression d'AgentType builtin
OUTPUT MODE (AGENTS)
normal

Comportement par défaut — réponses structurées, Markdown.

caveman

Phrases courtes, directives, sans fioritures. Injecte le bloc CAVEMAN en fin de system prompt.

Fonctionnalités

My Pixel Company est une plateforme complète de gestion de workforce IA. Voici les fonctionnalités clés.

Gestion de projet
Board Kanban

Board Kanban avec colonnes personnalisables, drag & drop, commentaires et directives par colonne. Les colonnes peuvent avoir des instructions spécifiques pour guider les agents.

ex.Configurer une colonne 'Review' avec la directive : 'Vérifier la qualité du code et les tests avant de valider.'
Interface
Bureau Pixel Art

Interface visuelle rétro 2D construite avec Canvas 2D. Visualisez vos agents comme des personnages dans un bureau pixel art.

ex.Accéder à /projects/[id]/office pour voir tous les agents du projet dans le bureau virtuel.
Ask Pix

Chat IA génératif avec streaming temps réel, sessions persistantes et accès complet aux outils MCP.

ex.Demander à l'IA : 'Crée une tâche pour corriger le bug de login et assigne-la à l'agent Dev.'
Infrastructure
Crons et automatisations

Créez des tâches récurrentes avec des expressions cron standard pour déclencher des actions automatisées.

ex.Programmer un cron '0 9 * * 1-5' pour qu'un agent génère un rapport quotidien chaque matin de semaine.
Finance et coûts tokens

Suivez les coûts générés par chaque agent et par projet selon les tokens consommés par provider.

ex.Consulter /finance pour voir la répartition des coûts entre les différents providers IA.
Skills et repositories

Bibliothèque de compétences assignables aux agents. Repositories Git liés aux projets pour contextualiser le travail.

ex.Assigner la skill 'Code Review' à un agent pour qu'il sache qu'il doit reviewer le code.

🔧Troubleshoot — Déblocage d'agent

Procédure à suivre lorsqu'un agent est suspecté d'être bloqué (pas de progression, pas de réponse, tâche en attente depuis trop longtemps).

🔍 1. Détecter le blocage

  • Vérifier la dernière activité de l'agent dans le board (colonne, dernière mise à jour)
  • Consulter les logs ou outputs de l'agent si disponibles
  • Estimer si le silence est anormal selon la complexité de la tâche assignée

🛠️ 2. Demander le déblocage via Claude Code

  1. 1.Ouvrir une session Claude Code
  2. 2.Identifier l'agent concerné (nom, projet, tâche assignée)
  3. 3.Formuler une demande explicite de déblocage en précisant le contexte
  4. 4.Laisser Claude Code analyser l'état de l'agent et proposer une action corrective
bash
# Lancer Claude Code
claude
EXEMPLE DE PROMPT
ex.L'agent [NOM_AGENT] sur le projet [NOM_PROJET] semble bloqué sur la tâche [TÂCHE]. Peux-tu analyser son état et le débloquer si nécessaire ?

3. Vérifier le résultat

  • S'assurer que l'agent reprend son activité après intervention
  • Si le problème persiste, demander à Claude de faire une analyse plus approfondie pour correction

Contact

Pour toute question, retour ou collaboration, retrouvez Safronix sur LinkedIn ou consultez le code source sur GitLab.