.claude/skills/deploy-metering/SKILL.md
Déployer le système de métriques et facturation sur une app cliente Supabase. TRIGGERS : metering, facturation, métriques, billing, deploy-metering, tracking tokens, usage metrics Déploie les tables, le helper trackTokenUsage, les Edge Functions, le cron et valide le pipeline complet.
npx skillsauth add SomtechSolutionMAxime/somtech-pack deploy-meteringInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Déployer automatiquement le pipeline complet de métriques sur une application Supabase existante, pour que ses données de consommation soient collectées par le hub central et facturées.
Avant toute action, lire intégralement la documentation de référence dans le somtech-pack :
features/metering-billing/overview.md → Architecture et décisions
features/metering-billing/database.md → Tables, RPCs, enums, indexes
features/metering-billing/backend.md → Helper, patterns d'instrumentation, Edge Functions
features/metering-billing/implementation-guide.md → Guide pas-à-pas complet
Si le dossier features/metering-billing/ n'est pas dans le projet courant, le chercher dans le somtech-pack synchronisé ou demander à l'utilisateur de faire un somtech_pack_pull.sh.
# Vérifier que c'est un projet Supabase
ls supabase/config.toml
# Vérifier les migrations existantes
ls supabase/migrations/
# Vérifier les Edge Functions existantes
ls supabase/functions/
Scanner le projet pour trouver TOUS les appels AI :
grep -rn "completions.create\|messages.create\|embeddings.create\|chat\.create\|anthropic\.\|openai\." src/ supabase/functions/ lib/ app/ --include="*.ts" --include="*.tsx" --include="*.js"
Lister les résultats et les présenter à l'utilisateur pour validation avant de continuer.
Identifier si l'app utilise :
Présenter à l'utilisateur :
BILLING_PROJECT_ID (ou utiliser le UUID temporaire 00000000-0000-0000-0000-000000000000)Attendre la validation avant de continuer.
TIMESTAMP=$(date -u +"%Y%m%d%H%M%S")
echo "Migration: ${TIMESTAMP}_create_metering_tables.sql"
Créer supabase/migrations/${TIMESTAMP}_create_metering_tables.sql avec le contenu exact de database.md (tables, enum, indexes, RPCs).
Inclure :
ai_token_usage avec RLSusage_metrics_daily avec contrainte UNIQUE et RLSmetric_type_localaggregate_daily_usageget_monthly_ai_usageexec_sqlsupabase db reset
Exécuter les requêtes de validation de implementation-guide.md étape 1.4.
Créer lib/track-token-usage.ts avec la variante appropriée (Deno ou Node.js) depuis backend.md.
Si l'app a des Edge Functions ET du code Node.js, créer :
lib/track-token-usage.ts → Node.jssupabase/functions/_shared/track-token-usage.ts → DenoPour CHAQUE point détecté en phase 0.2 :
trackTokenUsage() (SANS await) avec le bon module et modèlestream_options: { include_usage: true } est présentUtiliser les noms de modules standardisés (voir database.md section "Convention de nommage des modules").
Demander à l'utilisateur de faire un appel AI de test, puis vérifier :
SELECT module, model, input_tokens, output_tokens, created_at
FROM ai_token_usage ORDER BY created_at DESC LIMIT 5;
METERING_KEY="mtr_$(openssl rand -hex 32)"
echo "🔑 Clé API metering : ${METERING_KEY}"
echo "⚠️ NOTER CETTE CLÉ — nécessaire pour Orbit"
supabase secrets set METERING_API_KEY="${METERING_KEY}"
supabase secrets set BILLING_PROJECT_ID="<valeur-fournie-ou-uuid-temporaire>"
Créer les deux fichiers depuis implementation-guide.md :
supabase/functions/collect-usage-metrics/index.tssupabase/functions/get-metering-data/index.tssupabase functions deploy collect-usage-metrics
supabase functions deploy get-metering-data
# Test collect
curl -X POST \
-H "Authorization: Bearer $(supabase status --output json | jq -r '.SERVICE_ROLE_KEY // empty')" \
"$(supabase status --output json | jq -r '.API_URL // empty')/functions/v1/collect-usage-metrics"
# Test get-metering-data
curl -H "X-Metering-API-Key: ${METERING_KEY}" \
"$(supabase status --output json | jq -r '.API_URL // empty')/functions/v1/get-metering-data?action=summary"
Exécuter via MCP Supabase ou SQL Editor :
SELECT vault.create_secret('<SUPABASE_URL>', 'supabase_url');
SELECT vault.create_secret('<ANON_KEY>', 'anon_key');
On utilise l'
anon_key(publishable key) — pas leservice_role_key. L'Edge Function crée son propre client interne avecSUPABASE_SERVICE_ROLE_KEY(auto-injecté). Le JWT sert uniquement à passer la validation d'accès.
SELECT cron.schedule(
'collect-usage-metrics-daily',
'0 2 * * *',
$$
SELECT net.http_post(
url := (SELECT decrypted_secret FROM vault.decrypted_secrets WHERE name = 'supabase_url')
|| '/functions/v1/collect-usage-metrics',
headers := jsonb_build_object(
'Authorization', 'Bearer ' ||
(SELECT decrypted_secret FROM vault.decrypted_secrets WHERE name = 'anon_key'),
'Content-Type', 'application/json'
),
body := '{}'::jsonb
);
$$
);
SELECT jobid, jobname, schedule, active FROM cron.job
WHERE jobname = 'collect-usage-metrics-daily';
Exécuter la checklist complète de implementation-guide.md étape 5.
✅ METERING DÉPLOYÉ
──────────────────
Tables : ai_token_usage, usage_metrics_daily
RPCs : aggregate_daily_usage, get_monthly_ai_usage, exec_sql
Helper : lib/track-token-usage.ts
Points AI : X points instrumentés
Edge Funcs : collect-usage-metrics, get-metering-data
Cron : collect-usage-metrics-daily (2h UTC)
Clé API : mtr_***
📋 À TRANSMETTRE À L'ÉQUIPE ORBIT :
URL metering : https://<projet>.supabase.co/functions/v1/get-metering-data
Clé API : mtr_<clé-complète>
| Symptôme | Cause | Solution |
|----------|-------|---------|
| cron.schedule échoue | pg_cron non activé | Dashboard → Extensions |
| net.http_post échoue | pg_net non activé | Dashboard → Extensions |
| Secrets vault absents | Vault mal configuré | Re-exécuter vault.create_secret |
| Edge Function 500 | Env var manquante | supabase secrets list |
| Tokens à 0 (streaming) | Manque stream_options | Ajouter stream_options: { include_usage: true } |
| Métriques à 0 | Pas de données | L'instrumentation n'est pas encore active / pas d'appel AI de test |
await le trackTokenUsage() — fire-and-forget uniquementstream_options: { include_usage: true }supabase db push --linkedsupabase db reset avant de pousser en prodtools
Documentation de référence SomCraft — DMS Markdown-native avec AI, MCP server, et Studio. À consulter pour toute question sur l'architecture, les APIs, les concepts, ou l'exploitation d'une instance SomCraft. TRIGGERS : somcraft, dms, document management, workspace somcraft, studio somcraft, mcp somcraft, api somcraft
tools
Déployer une instance SomCraft pour un client existant (migrations Supabase + Fly.io + skills). Orchestre 7 phases : pré-flight, plan, migrations, seed, déploiement, smoke tests, installation des skills. TRIGGERS : deploy-somcraft, déployer somcraft, installer somcraft, somcraft client, setup somcraft, upgrade somcraft, status somcraft
tools
Génère l'intégralité de la configuration d'un silo SomTech : docker-compose, services Fly.io, constitutions d'agents, et templates d'environnement. Valide les métadonnées d'application avant génération. À utiliser après validation initiale du client et avant déploiement.
development
Exécute le déploiement complet d'une silo après sa génération : conteneurs Docker, environnement de développement Fly.io, branche Git, et configuration Netlify. Transforme les configs générées en infrastructure active avec URLs stables et builds automatisés.