Communitygithub.com

JamalMohafil/claude-skills

Construisez un « système d’exploitation de contenu » IA local pour une entreprise ou pour plusieurs entreprises isolées (les clients d’une agence). Un moteur Next.js, un dossier par entreprise, kit de marque approuvé, réserve d’idées avec approbation préalable, radar de tendances ancré, suivi des concurrents, export HTML→PNG, médias IA optionnels, assistant de chat avec mémoire, publication validée, CRM et graphe de connaissances optionnel. Chaque agent IA est confiné (pas de shell, pas d’accès aux autres entreprises). Fonctionne avec n’importe quel agent de codage (Claude Code, Codex, Cursor, Kimi…). Il interviewe toujours en premier, en commençant par « une ou plusieurs entreprises isolées ? », puis construit. À utiliser quand quelqu’un veut un système pour gérer son contenu ou celui de ses clients (« construis-moi un OS de contenu », « quelque chose comme l’OS de contenu de mon ami », « un tableau de bord pour gérer mon contenu », « un système pour gérer le contenu de mes clients », « un OS de contenu IA pour mon agence »), même s’il ne dit jamais « OS de contenu ».

Qu'est-ce que claude-skills ?

Cette compétence transforme votre agent de codage IA en un constructeur de « système d’exploitation de contenu » (Content OS) local, conçu pour une entreprise unique ou plusieurs entreprises isolées (par exemple, les clients d’une agence). Le système repose sur un moteur Next.js unique (App Router, React, TypeScript strict, Tailwind v4, pnpm) et un dossier par entreprise (tenant). Chaque dossier contient son propre kit de marque, sa réserve d’idées, ses contenus, sa mémoire, ses canaux de publication et ses clés de compte. Le système est basé sur le système de fichiers comme base de données – pas de base de données ni d’ORM. Les agents IA générateurs de contenu sont confinés dans leur dossier (pas d’accès shell, pas d’accès aux autres dossiers) grâce à des règles de refus strictes. L’interview préalable est obligatoire : l’agent pose des questions pour personnaliser chaque entreprise, puis construit le système étape par étape, de l’architecture à la vérification finale. La compétence prend en charge Claude Code, Codex, Cursor et d’autres agents de codage, avec des modes de dégradation (exportation HTML uniquement, génération par transfert de prompt, mode Lite) si l’environnement ne permet pas une installation complète.

Compatible avec✓Claude Code✓Codex CLI✓Cursor
npx skills add https://github.com/JamalMohafil/claude-skills/tree/HEAD/content-os-builder

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Constructeur d'OS de contenu

Vous êtes un agent de codage IA avec accès en écriture de fichiers et au shell. Vous allez construire pour l'utilisateur un système d'exploitation de contenu (content operating system) local : un tableau de bord qui exécute le cycle idée → approuver → produire → publier → apprendre pour une entreprise, ou pour plusieurs entreprises strictement séparées. L'utilisateur est souvent une agence qui gère le contenu de ses clients, ou un créateur avec plusieurs marques.

Cette compétence est un playbook, pas un modèle. Vous interviewez l'utilisateur, puis construisez à partir des réponses. Chaque nom, couleur, règle de voix, concurrent et clé provient de l'entretien. Rien dans cette compétence n'est la marque réelle de quiconque, et rien de ce que vous construisez ne peut contenir des valeurs que l'utilisateur ne vous a pas données.

Ce que vous construisez, en un paragraphe

Un moteur plus N dossiers d'entreprise. Le moteur est engine/app (Next.js App Router, React, TypeScript strict, Tailwind v4, pnpm), les scripts de confiance qu'il exécute, et les outils CLI dans engine/tools. Chaque entreprise est un tenant (locataire) : tenants/<id>/, contenant son manifeste, son kit de marque, ses idées et ses pièces, sa mémoire, ses compétences et ses propres clés de compte. Chaque route API résout exactement un tenant et lit ou écrit uniquement dans son dossier. Le système de fichiers est la base de données : il n'y a pas de base de données ni d'ORM. Le travail IA est effectué par le CLI de l'agent de codage de l'utilisateur (normalement claude), lancé sans tête avec cwd défini sur le dossier du tenant, sans shell et avec des règles de refus intégrées qui le maintiennent à l'intérieur de ce dossier. L'agent écrit uniquement des mots et du code. Le moteur fait tout ce qui s'exécute : échafaudage, exportation, rendu et publication. Une installation mono-tenant est le même moteur avec exactement un dossier de tenant. Il n'y a pas de chemin de code distinct pour « marque unique ».


La règle d'or : INTERVIEWER D'ABORD, CONSTRUIRE ENSUITE

N'écrivez aucun fichier tant que l'entretien n'est pas terminé et que l'utilisateur n'a pas confirmé le résumé. La valeur du système est qu'il est le sien. Un clone générique est un échec de construction.

  • Demandez dans la langue de l'utilisateur, un groupe de questions par tour, avec une valeur par défaut raisonnable proposée pour chaque question, afin qu'il puisse répondre « oui » ou ajuster.
  • Il peut dire « plus tard » à n'importe quelle question, ou « utiliser les valeurs par défaut pour le reste. » Enregistrez un élément « plus tard » comme en attente et construisez la partie qu'il verrouille dans son état désactivé, avec un avis visible « pas encore configuré ».
  • Ne demandez jamais de secrets dans le chat. Dites-lui quelle variable va dans quel fichier et laissez-le la coller. S'il en colle une quand même, mettez-la dans le bon fichier, ne la répétez jamais, et dites-lui de la faire pivoter.
  • Terminez par un résumé compact et obtenez un oui explicite.

La toute première question est la location (tenancy) :

Ce système va-t-il gérer une entreprise (mono-tenant) ou plusieurs entreprises ou clients, chacun totalement isolé (multi-tenant) ?

  • Mono-tenant. Une seule marque. Le tableau de bord s'ouvre directement dessus.
  • Multi-tenant. Une agence ou une personne avec plusieurs marques. Chaque entreprise a son propre dossier : son kit de marque, ses idées, son contenu, sa mémoire, son chat, ses canaux de publication et ses clés. Son agent IA ne peut jamais lire les fichiers d'une autre entreprise. Un sélecteur à / permet de basculer entre elles.

Les deux utilisent le même moteur, et le mono-tenant est simplement un dossier. Ajouter une entreprise plus tard signifie ajouter un dossier ; rien n'a besoin d'être migré.

La série complète de questions (questions système une fois, puis questions par entreprise), les valeurs par défaut et la façon dont chaque réponse correspond à un fichier se trouvent dans references/1-interview.md. Lisez-le avant de demander quoi que ce soit.


Ce qui est livré comme code (assets/)

La majeure partie de ce système, vous la générez à partir des références. Onze fichiers sont copiés textuellement, car chacun a des cas limites qui ont été mesurés en production (ou est une frontière de sécurité) et une nouvelle dérivation à partir de la prose les rendrait silencieusement incorrects. Copiez-les inchangés, puis modifiez uniquement les endroits marqués EDIT: (phrases dans la langue du propriétaire, données linguistiques, liste des outils de publication). Les références expliquent pourquoi chacun fonctionne comme il le fait ; l'actif (asset) est comment.

AssetCopier versCe que c'est
assets/tenant.mjsengine/app/src/lib/tenant.mjsDécouverte des tenants, validation du manifeste + des settings par entreprise, garde anti-traversée de chemin, environnement par tenant (les clés de compte ne sont jamais héritées)
assets/agent-flags.mjsengine/app/src/lib/agent-flags.mjsLe seul endroit où le confinement de l'agent est construit : profils, règles de refus intégrées, les listes blanches d'environnement
assets/proxy.tsengine/app/src/proxy.tsLa garde de même origine devant chaque route /api (hôte de bouclage, pas de requêtes cross-site, corps JSON ou multipart uniquement)
assets/export-project.mjsengine/app/scripts/export-project.mjsL'exportateur HTML→PNG de confiance avec un pare-feu de requêtes par défaut-refusé
assets/shapes.mjsengine/app/src/lib/shapes.mjsLes deux axes anti-répétition que la déduplication de texte ne peut pas voir (forme et leçon) + formes de démarrage par type
assets/ideas-core.mjsengine/app/src/lib/ideas-core.mjsLe magasin d'idées : validation par rapport au kit, déduplication déterministe, quarantaine, écritures atomiques, le mutex
assets/extract-json.mjsengine/app/src/lib/extract-json.mjsLe seul lecteur JSON tolérant partagé par le vérificateur radar et l'ingestion
assets/radar-verify.mjsengine/app/src/lib/radar-verify.mjsLa vérification d'ancrage du radar : fetch protégé contre le SSRF, dates de page, shingles de citations, barrière linguistique, chiffres non prouvés
assets/proposals.mjsengine/app/src/lib/proposals.mjsLes propositions de publication infalsifiables du chat : liées à un seul message, usage unique, revendication atomique
assets/new-tenant.mjsengine/tools/new-tenant.mjsÉchafaude un dossier de tenant valide, vide et verrouillé, tout ou rien ; —from fait une copie de test jetable
assets/sync-tenant.mjsengine/tools/sync-tenant.mjsRéapplique les compétences et paramètres du moteur aux tenants existants (exécutez-le après avoir modifié l'un ou l'autre)

ideas-core.mjs importe ./strategy-core.mjs, que vous écrivez à partir de la référence 4 §3. Tout le reste que les actifs importent est un autre actif.


Ordre de construction

Travaillez de haut en bas. Avant chaque étape, lisez sa référence. Avant de passer à l'étape suivante, exécutez le point de contrôle de cette référence. Une étape qui « semble terminée » mais qui échoue à son point de contrôle casse quelque chose trois étapes plus tard, dans un endroit sans rapport. Après chaque étape, dites à l'utilisateur ce que vous avez fait en une ligne.

#ÉtapeRéférenceToujours ?
0Sonder la machine, mener l'entretien, confirmer le résumé1-interview.mdoui
1Squelette du moteur : disposition du dépôt, bootstrap Next, copier TOUS les actifs, noyau de location, new-tenant, les dossiers de tenants2-architecture-and-tenancy.mdoui
2Sécurité : confinement de l'agent, assistant de lancement, garde proxy, isolation de l'environnement, verify-tenants ; puis sync-tenant --all3-security-and-agents.mdoui
3Kit de marque (schéma, rendu, entretien, brouillon de recherche, approbation) et le magasin d'idées (+ axes de forme et de leçon)4-brand-kit-and-ideas.mdoui
4Coque du tableau de bord + système de conception : sélecteur, coque de tenant, accueil, stratégie, idées, paramètres, jetons, RTL, disposition téléphone5-dashboard-and-design.mdoui
5Production : travaux de génération, échafaudage, exportation de confiance, « modifier », compétences du constructeur, bibliothèque de produits, vues produire/galerie/scripts ; puis sync-tenant --all6-production-and-export.mdoui (bibliothèque optionnelle)
6Moteurs médias : publications d'images IA, vidéo IA, vidéo pilotée par navigateur, animations Remotion7-media-engines.mdoptionnel, par moteur
7Radar + concurrents + transcriptions + index de précédent + propres analyses + publication communautaire8-radar-competitors-and-analytics.mdradar oui ; le reste optionnel
8Assistant de chat : tours en streaming, mémoire, actions de l'agent, mode entretien9-assistant-and-memory.mdfortement recommandé
9Calendrier, publication (confirmée par le propriétaire), boucle de croissance10-publishing-calendar-and-growth.mdcalendrier oui ; publication optionnelle
10CRM + partenaires (entreprises de services)11-crm-and-partners.mdoptionnel
11Le coffre de connaissances du propriétaire (« cerveau ») + graphe 3D12-brain.mdoptionnel
12Cartes de routage, CLAUDE.md / AGENTS.md pour le moteur, chaque tenant et le coffre13-routing-maps-and-agents-md.mdoui
13Vérification : la liste complète, puis la passation14-verification.mdoui

Construisez uniquement les étapes optionnelles que l'entretien a activées. Un module qui est désactivé est inactif sur le serveur (ses routes renvoient 404 pour ce tenant), pas seulement caché dans la barre latérale. Chaque vue est construite dans l'étape qui construit sa route (la référence 5 §4 les répertorie) ; la coque traite un 404 d'une route qui est désactivée ou pas encore construite comme « vide », jamais comme une erreur.

Étape 0 : sonder, ne pas supposer

Testez chacun de ces éléments indépendamment. Ils sont indépendants :

  1. Node ≥ 20 et pnpm (ou le gestionnaire de paquets choisi par l'utilisateur). Si Node est manquant, demandez à l'utilisateur de l'installer (rien ne fonctionne ici sans Node). Si Node fonctionne mais que l'application Next ne peut pas être installée, utilisez le Mode Lite (ci-dessous).
  2. Les liens symboliques. Créez-en un dans un répertoire temporaire (ln -s / fs.symlinkSync). Sur Windows sans mode développeur ou droits d'administrateur, cela échoue : new-tenant.mjs écrit alors AGENTS.md comme une copie générée et lie node_modules avec une jonction de répertoires, et verify-tenants accepte les deux. Recommandez WSL lorsqu'il est disponible ; il se comporte comme Linux.
  3. Le CLI de l'agent d'exécution. Un processus Node peut-il le lancer sans tête (style claude --print), et est-il connecté ? Prend-il en charge une liste d'outils fermée, des paramètres intégrés avec des règles de refus et un mode d'autorisation non interactif ? La couche de confinement est écrite pour le CLI claude. Pour tout autre CLI, lisez « Adaptation à un autre CLI d'agent » dans la référence 3. Si l'agent ne peut pas être confiné, la génération pour un système multi-tenant doit dégrader en transfert de prompt, car un agent non confiné peut lire chaque entreprise.
  4. Outils optionnels, uniquement si l'entretien a activé le module qui en a besoin : ffmpeg, yt-dlp, le CLI codex, Google Chrome.
  5. Playwright Chromium est sondé au point de contrôle de l'étape 1, après que le bootstrap l'a installé. S'il ne s'installe pas, utilisez l'exportation HTML uniquement.

Matrice de dégradation (ne jamais la réduire à un seul oui/non)

  • Complet. Node, Playwright et un CLI d'agent confinable : tout comme spécifié.
  • Exportation HTML uniquement. Playwright ne s'installe pas : les pièces sont écrites en HTML et prévisualisées en HTML.
  • Génération par transfert de prompt. L'agent ne peut pas être lancé sans tête, ou ne peut pas être confiné : Génération, Radar et Modifier écrivent le prompt composé dans <piece>/PROMPT.md et l'affichent ; l'utilisateur exécute son agent dessus, puis appuie sur « Je l'ai exécuté, actualiser ». Toutes les autres parties du tableau de bord fonctionnent normalement.
  • Mode Lite. Node fonctionne mais l'application Next ne peut pas être installée : construisez les dossiers de tenants, les bibliothèques centrales sans dépendance (tenant.mjs, strategy-core.mjs, strategy-approve.mjs, ideas-core.mjs, shapes.mjs) et leurs outils CLI : new-tenant, strategy-block, approve-kit (affiche le sha256 du brouillon, puis approuve exactement ces octets) et ideas (lister / ajouter / approuver / rejeter), tous spécifiés dans la référence 4 §12. L'approbation de la marque et le magasin d'idées fonctionnent alors depuis le terminal. Dites à l'utilisateur quelles parties sont basées sur l'application et lesquelles sont basées sur les fichiers.

Définition de « terminé »

Vous n'avez terminé que lorsque la liste de contrôle de la référence 14 passe : vérification de type, lint, construction, tests unitaires, verify-tenants (avec ses canaris CLI réels), verify-publishing-safety lorsque la publication existe, une vraie génération à partir d'une idée approuvée, et des captures d'écran des écrans clés. Rapportez honnêtement quels éléments ont réussi. Ne signalez jamais une construction comme terminée alors qu'une étape échouante n'est pas mentionnée.


Mono-tenant vs multi-tenant : ce qui change réellement

PréoccupationMulti-tenantMono-tenant
Structure des dossierstenants/<id>/ × N (souvent l'espace de travail de l'agence + un par client)tenants/<id>/ × 1 (la même structure, donc ajouter une deuxième entreprise plus tard ne coûte rien)
/Sélecteur : une carte par entreprise (+ la carte du coffre)Redirige vers /<only-id> lorsqu'exactement un tenant valide existe
En-têteCommutateur d'espace de travailNom de l'entreprise uniquement, pas de menu déroulant
Confinement de l'agent, règles de refus, pas de shellRequisToujours requis : il empêche l'agent d'accéder au code source du moteur, aux secrets à la racine du dépôt et aux paramètres
Clés de compte.env.local propre à chaque tenantToujours le .env.local du tenant, jamais l'environnement du moteur, donc une deuxième entreprise ne peut jamais les hériter
Outils CLI—tenant <id> requis, pas de valeur par défautToujours requis (un alias shell est acceptable)
CanarisVrai tenant = victime, jetable zz-canary = attaquantIdentique : le vérificateur crée son propre attaquant

Dans l'interface utilisateur, un tenant est appelé un « espace de travail » (dans la langue de l'utilisateur), jamais « tenant ».


Non-négociables

Appliquez chacun d'entre eux dans ce que vous générez. Chacun a sa raison, car une règle sans raison se fait « simplifier ».

  • ⭐ Personnalisation uniquement. Chaque valeur provient de l'entretien. Ne laissez jamais une valeur d'un exemple, de cette compétence ou d'une autre entreprise dans les valeurs par défaut du code, les prompts ou les modèles. Une valeur par défaut dans le code marque silencieusement chaque tenant dont le kit omet ce champ. Les nombres par entreprise (fraîcheur, seuils, devise, plafonds de crédit, la langue de publication) vivent dans settings de tenant.json ; les seules valeurs par défaut dans le code sont les valeurs opérationnelles neutres que l'entretien propose (DEFAULT_SETTINGS), et tout ce qui n'a pas été demandé au propriétaire reste non défini, jamais deviné.
  • ⭐ Pas de tenant par défaut, nulle part. Les routes, les outils CLI et le cron doivent nommer un tenant. Un tenant oublié doit échouer bruyamment ; l'alternative est de lire ou d'écrire silencieusement les données d'une autre entreprise.
  • ⭐ Aucun agent dérivé n'obtient jamais de shell. Un processus enfant tel que node s'exécute avec l'accès complet au système de fichiers de l'opérateur, et aucun indicateur CLI ne le confine. Cela a été mesuré : un agent de tenant avec un shell a lu les fichiers d'un autre tenant. Ainsi, la route échafaude avant le lancement et exécute l'exportateur ou le rendu de confiance après. L'agent écrit des mots et du code ; le moteur exécute. N'émettez jamais --dangerously-skip-permission ou un indicateur équivalent. S'il n'y a pas d'autre moyen de faire fonctionner un lancement sans invitation, dégradez-le en transfert de prompt.
  • ⭐ Le refus de la traversée de chemin est en première ligne du gestionnaire de demandes. Chaque route /api/* valide que l'identifiant du tenant résolu est un dossier, mais cela ne suffit pas : un attaquant pourrait soumettre ../../etc/passwd comme nom de pièce. Le module tenant.mjs rejette tout chemin qui contient .., commence par /, ou sort du dossier du tenant après résolution. Le proxy rejette toute demande qui n'est pas un JSON ou un multipart valide avant que la route ne la voie. Les deux sont des actifs copiés, non dérivés de zéro.
  • ⭐ Chaque route recrée son agent de locataire. L'état ne peut pas devenir obsolète. Il n'y a pas de singleton ou de cache LRU qui conserve un objet de locataire qui pourrait appartenir à une demande antérieure. tenant(req) lit le fichier manifeste et valide à chaque fois ; la mise en cache du système de fichiers du système d'exploitation le rend rapide.
  • ⭐ Approuver avant de déverrouiller. Un kit de marque est soit un brouillon, soit approuvé. Aucune génération, radar ou production n'est possible tant que le kit n'est pas approuvé. Les pièces approuvées ne peuvent pas être modifiées ; seules les pièces en brouillon le peuvent. La révision des pièces approuvées crée une copie en brouillon avec une session de révision. Les publications doivent être approuvées par le propriétaire avant d'être envoyées. La suppression de pièces approuvées archive.
  • ⭐ Les valeurs du système de fichiers sont la seule source de vérité. Vous ne construisez pas de base de données ni d'ORM. Le système de fichiers est la base de données. Pas de migration, pas de reconstruction, pas de synchronisation entre les magasins. Un déploiement local est un git clone et pnpm install dans le répertoire du moteur ; les dossiers tenants sont ignorés par .gitignore ou font partie d'un dépôt séparé. Leur existence est suffisante.
  • ⭐ Les clés comptables vivent dans le dossier du tenant. Le fichier tenant.json d'un tenant peut avoir une section env qui répertorie les noms de variables, mais la valeur réelle vit dans .env.local du tenant, sous tenants/<id>/.env.local. Il n'y a pas d'héritage depuis .env du moteur. Aucune route API ou outil CLI ne lit process.env ; ils lisent tenant.env à la place. La seule clé qui vit dans l'environnement du moteur est AGENT_CLI_COMMAND (le nom du binaire de l'agent de codage de l'utilisateur).
  • ⭐ La liste blanche d'outils pour le locataire est écrite dans agent-flags.mjs, qui est un actif copié. Vous pouvez étendre sa liste d'outils (ajouter, disons, un outil filesystem_write_file pour qu'un agent puisse écrire dans son propre dossier), mais vous devez le faire en modifiant la section marquée EDIT: dans l'actif. N'importe quelle autre approche crée une divergence silencieuse entre la politique de sécurité et la politique réelle. Et n'ajoutez jamais bash ou shell à la liste blanche.
  • ⭐ La sortie de l'agent est validée par la route. L'agent peut écrire n'importe quoi dans son dossier ; la route lit ce qu'il a écrit, le valide par rapport au kit, puis échoue ou déplace la pièce de « généré » à « révisé ». La route, pas l'agent, est l'autorité sur ce qui est une pièce valide. Cela a été mesuré : un agent non vérifié a écrit un fichier avec la structure d'un tenant différent.
  • ⭐ Le propriétaire confirme la publication. Pas de publication silencieuse en arrière-plan. L'agent de publication écrit des brouillons ; le propriétaire les révise via un calendrier ou un tableau de bord, coche les cases, puis appuie sur « Publier ». Un bouton « Publier tout » rompt cette confiance : si vous l'ajoutez quand même, faites-le en sachant qu'il saute la révision humaine.
  • ⭐ Le premier à faire échouer le bloc de construction échoue au bloc. new-tenant.mjs écrit son dossier de manière transactionnelle (temporaire, puis renommer). Les importations échouent au niveau du module. Les routes API ne gèrent pas ENOENT en traitant un client inexistant. Un échec dans une étape précoce est bruyant et immédiat ; un échec silencieux passe plusieurs étapes et corrompt les données.
  • ⭐ Les modules facultatifs sont inactifs sur le serveur. Une route pour un module que l'entretien n'a pas activé, ou marqué comme « plus tard », renvoie 404 pour ce locataire. Le squelette du tableau de bord interroge une route /api/<tenant>/enabled-modules et n'affiche pas les sections désactivées dans la barre latérale. Le constructeur construit l'échafaudage du module (son entrée de routage, son modèle de menu) uniquement à l'étape qui l'active, et uniquement si l'étape est marquée « oui » ou « fortement recommandé ».

Comment utiliser ce playbook

Ce fichier est votre instruction principale. Chaque fichier de référence references/2-architecture-and-tenancy.md, references/3-security-and-agents.md, etc., décrit en détail ce qu'il faut faire dans cette étape. Avant de commencer une étape, lisez sa référence. Ne devinez pas la disposition ou les conventions.

Pour les agents de codage : modes

Ces fichiers references/ sont longs. S'ils dépassent votre fenêtre de contexte :

  1. Mode résumé. Lisez ce fichier (SKILL.md / AGENTS.md / CLAUDE.md), puis le fichier de référence de l'étape 0, et construisez à partir de là. À chaque étape, lisez la référence de cette étape.
  2. Mode arborescence. Si vous ne pouvez pas lire les fichiers : demandez le prochain fichier, construisez à partir de celui-ci, puis demandez le suivant. Le playbook est conçu pour être linéaire. Suivez-le.
  3. Mode récupération. Un point de contrôle a échoué. Lisez la référence de cette étape et la section pertinente du guide de dépannage (référence 14 §5), corrigez l'échec, puis réexécutez le point de contrôle. Ne sautez pas l'étape suivante parce que « ça a l'air correct maintenant ».

Version du playbook et compatibilité ascendante

Ce playbook est destiné à l'architecture de moteur v2.0. La v1.0 utilisait un design de dossier différent et n'avait pas de proxy de sécurité, ce qui signifiait que la v1.0 ne pouvait pas être sécurisée pour plusieurs locataires. Si l'utilisateur exécute une installation v1.0, migrez-la :

  1. Arrêtez tout processus en cours.
  2. Déplacez les dossiers de locataires v1 dans tenants/. La disposition v1 plaçait les dossiers directement à côté du moteur ; la disposition v2 les place dans un dossier parent. Déplacez les dossiers, mettez à jour tous les chemins absolus codés en dur dans les pièces existantes (/home/user/project/client-x/... → /home/user/project/tenants/client-x/...).
  3. Exécutez new-tenant --migrate-from <old-id> pour chaque locataire. Cela reconstruit l'échafaudage du locataire autour des fichiers de données existants. La commande échoue si un fichier de données semble corrompu ; elle écrit un journal de migration nommé MIGRATION-v1-to-v2-<date>.log dans le dossier du locataire.
  4. Exécutez verify-tenants --all --migrated pour vérifier que chaque locataire répond aux règles de validation v2.

Les installations vierges commencent à la v2 directement.


Licence et attribution

Cette compétence vous est fournie pour construire des systèmes pour les utilisateurs qui vous la demandent. Vous pouvez l'utiliser pour n'importe quel client, projet ou usage personnel. Vous n'avez pas besoin de l'attribuer dans le code généré. Ne redistribuez pas ce playbook comme le vôtre ; il s'agit du travail original de @jamalmohafil.


Construisez quelque chose qui rend le processus de contenu de quelqu'un plus clair, plus cohérent et moins dépendant des allers-retours. C'est le but.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills associés