CommunityRédaction et éditiongithub.com

croct-tech/agent-skills

À utiliser lors de l'écriture, la lecture, la revue ou le débogage du langage de requête contextuel (CQL) de Croct : critères d'audience, `croct.evaluate()` / `useEvaluation` / `<Personalization query>` / requêtes Next.js avec `cql`, corps de requête de l'API Evaluation (`/client/web/evaluate`, `/external/web/evaluate`), et valeurs de contenu dynamiques (`"type": "dynamic"`, `"expression"`). Couvre les variables de contexte (utilisateur, session, page, emplacement, campagne, panier, appareil, navigateur, contexte, maintenant/aujourd'hui), les types de données et conversions, les accesseurs et sélecteurs (`'s`, `property X of`, `[1st]`, `[*]`, `[...]`), les tests (`is`, `matches`, `is like`, `contains either`, `is between`, `is defined`, `is returning`), les quantifieurs (`some ... satisfies`), les macros, les modificateurs, les expressions d'événement (`l'utilisateur a consulté une page`, `l'utilisateur a abandonné un panier`, `l'utilisateur a atteint un objectif`), l'estimation d'audience et les recettes. Déclencheurs : "écrire une audience", "cibler les utilisateurs mobiles à New York", "erreur de syntaxe CQL", "l'audience ne correspond jamais", "estimation indisponible".

Qu'est-ce que agent-skills ?

Cette compétence spécialisée permet aux agents IA (comme Claude Code, Cursor, ou Codex) d'écrire, lire, réviser et déboguer le langage de requête contextuel (CQL) de Croct. CQL est un langage de requête pseudo-naturel utilisé pour définir des audiences, évaluer des expressions en temps réel via les SDK et l'API HTTP, et créer des valeurs de contenu dynamiques. La compétence couvre tous les aspects clés : syntaxe, variables de contexte (utilisateur, session, page, etc.), types de données et conversions, accesseurs et sélecteurs, tests et quantifieurs, macros et modificateurs, et expressions d'événement. Elle intègre une anti-sèche, des patrons d'utilisation courants, un guide de débogage pour les pièges fréquents, et des références vers la documentation officielle en direct. Utile pour toute tâche impliquant CQL, que ce soit pour écrire une condition d'audience, résoudre une erreur de syntaxe, ou estimer la taille d'une audience, elle garantit que l'agent produit des requêtes correctes et optimisées en évitant les constructions non documentées ou invalides.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/croct-tech/agent-skills/tree/HEAD/skills/croct-cql

Installed? Explore more Rédaction et édition skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Demander à votre IA préférée

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

Documentation

Écrire et déboguer CQL

CQL est le langage de requête pseudo-naturel de Croct. La même syntaxe d'expression alimente les audiences, l'évaluation en temps réel depuis les SDK et l'API HTTP, ainsi que les valeurs de contenu dynamiques. Tout ce qui se trouve ici provient de docs.croct.com ; lorsqu'un point n'est pas couvert, consultez la documentation en direct (en bas de ce fichier) au lieu de deviner.

Flux de travail

  1. Identifiez où la requête s'exécute : audience (doit être booléenne), evaluate/API (toute valeur JSON, 500 caractères maximum), ou valeur dynamique (le résultat doit correspondre au type d'attribut, sinon default).
  2. Choisissez la source de données : contexte actuel (page, panier, emplacement, campagne, appareil), profil stocké (de l'utilisateur ..., statistiques de l'utilisateur), session (de la session ...), ou historique (l'utilisateur a ... expressions d'événement, plan Scale).
  3. Vérifiez que les données sont collectées : tout ce qui est marqué intégration requise (attributs de profil, panier, centres d'intérêt, objectifs, état de connexion) ne correspond jamais à moins que l'application ne l'envoie.
  4. Écrivez avec l'anti-sèche ci-dessous ; recherchez les propriétés exactes dans context-and-data-types.md.
  5. Passez en revue la liste des pièges, puis testez avec croct.evaluate() ou l'estimateur du tableau de bord.

Anti-sèche

// Les styles naturel, technique et mixte sont interchangeables
le score de l'utilisateur est supérieur à 90
user.score > 90
le score de l'utilisateur > 90
BesoinSyntaxe
Propriétéde l'utilisateur l'adresse de la ville, de l'utilisateur les statistiques des commandes, la propriété ville de l'adresse de l'utilisateur, user.address.city
Clé étrange / indicepage.query['code-coupon'], liste[0], (centres d'intérêt de l'utilisateur)[0]
Sélecteurspanier.articles[1er], [:premier], [:dernier(2)], articles[*].prix, données[...].prix
Littérauxnull, true, 42, 3.14 (décimal), 3.14f, 51%, "str", 'raw', ~/re/i, [1, 2], ["k": "v"]
DatesPas de littéral : "2026-01-01" as date, "2026-01-01T12:00" as datetime ; today + 1 day
Logiqueet ou non (&& || !) ; et se lie plus fortement que ou
Comparaison== != > >= < <= ; 1 < x < 3 ; est égal à X en ignorant la casse
Raccourci littéralX est "valeur", X n'est pas 0 (le côté droit doit être un littéral)
Chaînescommence par, finit par, correspond à "sous" / correspond à ~/re/i (sensible à la casse), est comme "sous" (insensible à la casse)
Collectionscontient X, X est dans [..], contient tous les [..], contient soit [..], ne contient ni [..]
Présenceest défini / est connu, est vide
Utilisateur/sessionl'utilisateur revient, l'utilisateur est anonyme, l'utilisateur est identifié, la session commence
Datesest avant, est après, est à "12:00", est entre A et B [exclusif], le jour de la semaine d'aujourd'hui est "lundi"
Quantifieurscertains x dans C satisfont P, chaque, aucun, pas tous, au moins 2 de tous [distincts] x dans C satisfont P
Macroscompte de, somme de, moyenne de, min de, max de, premier de, dernier de, clés de, longueur de, nombre de jours entre A et B, ce mois-ci
Modificateursen nombre, arrondi [vers le bas], en titre, trié par ordre décroissant, sans doublons, en remplaçant "a" par "b", aujourd'hui à "12:00"
Valeur de replile nom de l'utilisateur ou alors "Anonyme" (??)
Conditionnel"A" si condition sinon "B", condition ? "A" : "B"
Variablessoit commandes = les statistiques de l'utilisateur des commandes ; commandes >= 5
Événements (Scale)l'utilisateur a <événement> [avec valeur de propriété] [au moins N fois] [au cours des 7 derniers jours]
Commentaires// ligne, # ligne, /* bloc */

Les mots-clés et identifiants sont insensibles à la casse ; les littéraux de chaîne sont sensibles à la casse.

Contexte en un coup d'œil

VariablePropriétés courantes
userid, firstName, email, age, company, jobTitle, interests, activities, stats' sessions, stats' orders, tout attribut personnalisé
sessionstart, duration, landingPage, referrer, stats' pageviews, stats' orders, audiences, experiences, experiments, attributs personnalisés
page (web)title, url, path, query, anchor, referrer
locationcontinentCode, countryCode, countryName, stateCode/regionCode (alias de state's code), stateName, cityName, timeZone, tags
device / browsercategory (desktop, tablet, mobile, bot, ...), vendor, name, os ; browser's name, type
campaignname, source, medium, content, term (UTM)
cartstage (browsing, shopping, checkout), items, total, subtotal, coupon, discount
contexttimeZone, attributs passés lors de l'évaluation
now, today, yesterday, tomorrowweekday, day, month, year, hour...

Patrons les plus utiles

l'utilisateur revient
l'utilisateur ne revient pas
la session commence
la catégorie de l'appareil est "mobile"
la catégorie de l'appareil n'est pas "bot"
le code pays de l'emplacement est "US"
le code de l'état de l'emplacement est dans ["NY", "CA"]
le nom de la ville de l'emplacement est "New York" et le jour de la semaine d'aujourd'hui est "lundi"
la source de la campagne est "google" et le support de la campagne est "cpc"
le nom de la campagne correspond à "sale"
le chemin de la page est dans ["/pricing", "/plans"]
la newsletter de la requête de la page est "daily-news"
page.query['code-coupon'] est défini
le référent de la session correspond à "google"
la page d'atterrissage de la session commence par "https://example.com/promo"
la durée de la session > 5 minutes et les commandes des statistiques de la session est 0
les centres d'intérêt de l'utilisateur contiennent soit ["marketing", "sales"]
l'âge de l'utilisateur est entre 18 et 30
les commandes des statistiques de l'utilisateur est 0
le plan de l'utilisateur est "premium"
l'étape du panier est "checkout" et le total du panier est supérieur à 100
certain article dans les articles du panier satisfait la marque de l'article est "Apple"
(aucun article dans les articles du panier ne satisfait le nom de l'article est comme "smartphone") et l'utilisateur revient
l'utilisateur a abandonné un panier au moins 2 fois
l'utilisateur a consulté un produit avec la catégorie "Chaussures" au cours des 7 derniers jours
l'utilisateur a atteint l'objectif "demo-requested" la dernière session
le prénom de l'utilisateur ou alors "là"

Plus par cas d'utilisation (campagne, emplacement, technologie, session, profil, panier, commandes, requêtes de valeur) : references/recipes.md.

Évaluer depuis le code

import croct from '@croct/plug';

const revient = await croct.evaluate<boolean>("l'utilisateur revient").catch(() => false);
const dansListe = await croct.evaluate<boolean>(
  "les pays du contexte incluent le nom du pays de l'emplacement",
  {attributes: {countries: ['États-Unis', 'Canada']}}, // lu comme `pays du contexte`
);

Serveur Next.js : await evaluate(requête) ou await cql`le persona de l'utilisateur est dans ${roles}` depuis @croct/plug-next/server. React : useEvaluation(requête). HTTP : POST https://api.croct.io/client/web/evaluate avec {"query": "..."}. Détails, limites d'attributs, valeurs dynamiques et estimation : references/evaluation.md.

Pièges et débogage

SymptômeCause probableCorrectif
Erreur de syntaxe sur x est yLe raccourci est nécessite un littéral à droitex est égal à y ou x == y
Erreur de syntaxe sur emplacement ville est "Berlin"Accesseur manquant : mots nus entre une variable et sa propriétéle nom de la ville de l'emplacement, la propriété nom de la ville de l'emplacement, ou location.cityName
Erreur en comparant "1" > 0 ou début de session > "2026-01-01"Les opérateurs relationnels ne convertissent jamais les typesConvertir : "1" en nombre > 0, ... > "2026-01-01" en datetime, ou utiliser est après
L'emplacement/le code ne correspond jamaisMauvaise casse : les codes sont en majuscules ("US", "NA", "CA") et les chaînes sont sensibles à la casseUtiliser des majuscules, est comme, est égal à ... en ignorant la casse, ou ~/.../i
correspond à "Solde" ne trouve pas "solde"correspond à, commence par, finit par sont sensibles à la casseest comme "solde" ou correspond à ~/solde/i
Un quantifieur absorbe la condition suivanteLe prédicat du quantifieur s'étend jusqu'à la finMettre tout le quantifieur entre parenthèses
a ou b et c se comporte bizarrementet se lie plus fortement que ouAjouter des parenthèses
Le résultat conditionnel est multiplié de manière incorrecteLes conditionnels sont gourmands(A si condition sinon B) * prix
La condition de profil/panier/intérêt n'est jamais vraieDonnées nécessitant une intégration non envoyéesSuivre l'événement ou définir l'attribut (voir la compétence croct-track-events)
À la fois X est supérieur à 30 et X n'est pas supérieur à 30 sont fauxValeur non définie : la tolérance d'erreur booléenne donne fauxUtiliser X est défini et ..., ou X ou alors 0
l'utilisateur est identifié toujours fauxÉvénements de connexion/déconnexion non suivisLes suivre ; sinon les utilisateurs sont toujours anonymes
Erreurs sur panier.articles[2e], premier de, moyenne de, min deÉlément manquant ou collection videAjouter ou alors null / ou alors 0
ne contient aucun de [] vs ne contient ni []Côté droit vide : aucun faux, ni vraiUtiliser ne contient ni pour "aucun chevauchement"
Erreur en mélangeant 's avec des crochetsLa possession/le possessif plus les crochets nécessitent des parenthèses(les articles du panier)[1er] ou notation par point panier.articles[*]
Expressions d'événement indisponiblesC'est une fonctionnalité du plan ScaleUtiliser les statistiques de profil/session lorsque possible (les commandes des statistiques de l'utilisateur)
"Estimation indisponible"Utilise page, contexte actuel, ou maintenant/aujourd'hui/hierAttendu ; l'audience fonctionne toujours à l'exécution
Erreur de plageLes plages .. ont un maximum de 30 élémentsRéduire la plage
Erreur de nom de variable/paramètreLes variables ne peuvent pas être redéfinies ; les noms doivent être des identifiantsRenommer ; éviter les mots réservés (utilisateur, page) et les mots génériques

À faire :

  • Privilégier est égal à, est supérieur à explicites dans les audiences partagées avec des non-développeurs ; utiliser le style technique lorsqu'il se lit mieux.
  • Protéger les données optionnelles avec est défini ou ou alors.
  • Placer les conditions peu coûteuses en premier dans les chaînes et (le court-circuit ignore le reste).
  • Utiliser contient soit / ne contient ni plutôt que de nier contient tous / ne contient aucun.

À ne pas faire :

  • N'inventez pas de tests, de variables ou de formulations d'événements. Des exemples comme l'utilisateur est nouveau ou l'utilisateur a effectué un achat apparaissent dans la prose de la documentation mais ne sont pas des constructions documentées ; utilisez l'utilisateur ne revient pas et les commandes des statistiques de l'utilisateur n'est pas 0 (ou l'utilisateur a passé une commande).
  • Ne comparez pas le nom du pays de l'emplacement avec un code ; utilisez countryCode pour "US".
  • Ne vous fiez pas à la conversion implicite de date dans l'arithmétique : "2021-01-01" en date + 1 jour.

Références

FichierLire quand
references/syntax.mdRègles lexicales, let, fonctions, littéraux, accesseurs et sélecteurs, table de précédence, conditionnels, durées
references/context-and-data-types.mdChaque variable et propriété, indicateurs de disponibilité, énumérations (catégorie d'appareil, étape de panier, continent, balises d'emplacement), conversions
references/expressions.mdTous les tests, opérateurs, tolérance d'erreur, quantifieurs, macros, modificateurs
references/events.mdExpressions d'événement, opérateurs de critères, quantifieurs de comptage, fenêtres de temps, exigences de suivi
references/evaluation.mdSDK evaluate / cql / hooks, API Evaluation, attributs de contexte, valeurs dynamiques, estimation d'audience
references/recipes.mdAudiences prêtes à l'emploi et requêtes de valeur par cas d'utilisation

Compétences connexes : croct-integrate-sdk (configuration SDK), croct-track-events (envoi des événements et attributs lus par les requêtes), croct-use-api (API HTTP), croct-model-content (valeurs dynamiques dans les définitions de contenu), croct-personalize-and-test (expériences et expérimentations qui utilisent les audiences), croct-use-croct (concepts et orientation).

Documentation en direct

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

croct-tech/agent-skills

>- Use when connecting Croct to a third-party platform or migrating to Croct from another personalization or experimentation tool. Covers Storyblok (Optimize by Croct app, @croct/plug-storyblok, Storyblok withCroct, resolveContent, croct/plug-storyblok, CroctStoriesApi), Sanity and Strapi (slot fallback, dynamic zones, metadata.contentSource), Shopify Hydrogen storefront events, Shopify custom pixel (croctPixel, PUBLIC_CROCT_SHOPIFY_PIXEL, checkout and order tracking), VTEX, Google Tag Manager data layer, Microsoft Clarity tags, HubSpot forms (hbspt.forms.create, hs-form-event), firmographic providers 6sense, Demandbase, Clearbit Reveal, and ZoomInfo WebSights (firmographics attributes, account-based audiences in CQL), and migrations from Mutiny and Ninetailed (Experience component, Contentful sunset). Triggers include cdn.croct.io/plug-integration scripts, "personalize Storyblok blocks", "track Shopify checkout", "send VTEX events", "ABM personalization", "replace Mutiny".

croct-tech/agent-skills

>- Use when installing or using a Croct SDK in application code: rendering slot content, evaluating CQL queries, server or client fetching, prerendering, identifying users, app ID / API key env vars, testing, or debugging. Covers JavaScript (`@croct/plug`, `croct.fetch`, `croct.evaluate`), React (`@croct/plug-react`, `<CroctProvider>`, `useContent`, `<Slot>`, `useEvaluation`, `useCroct`), Next.js (`@croct/plug-next`, `fetchContent`, `cql`, middleware/proxy, `NEXT_PUBLIC_CROCT_APP_ID`, `CROCT_API_KEY`), Vue (`@croct/plug-vue`), Nuxt (`@croct/plug-nuxt`), Shopify Hydrogen (`@croct/plug-hydrogen`), PHP (`croct/plug-php`), Laravel, Symfony, and Drupal. Triggers: slot IDs like `home-hero@1`, `SlotContent`, "Croct is not plugged in", "initial content is required for server-side rendering", "Did you forget to configure Croct's middleware?", CORS errors.

croct-tech/agent-skills

>- Use when designing or changing Croct content models: regular vs union components, what becomes a component, slot, structure, or primitive attribute; writing component schema JSON (`structure`, `union`, `reference`, `text`, `number`, `boolean`, `list`, `@croct/file`, `@croct/richText` rich text, `format`, `choices`, `optional`, `private`, `position`); writing content definition JSON (`static`/`dynamic` values, `nullable`, `default`, `{{placeholder}}` paths); slot default, localized, experience, experiment, or content group content; schema limit errors (30 attributes, 6 nesting levels, 10 union members, complexity score 50); component versioning and breaking changes (`home-hero@2`); refactoring (duplicate and modify, duplicate and replace, flatten and merge); Markdown in text attributes with `@croct/md-lite`. Phrasings: "model content for a hero", "add an attribute to the banner component", "support variations", "component is too complex", "localize the hero", "translations", `preferredLocale`.

croct-tech/agent-skills

>- Use when planning or implementing personalization or A/B testing with Croct: creating an experience (audience, slots, content, priority, scheduling, drafts), adding an experiment (A/B/n, primary goal ID, traffic allocation, variants, cross-device consistency), wiring the code it needs (slots, `croct.track('goalCompleted', {goalId})`, `orderPlaced`, `leadGenerated`, `userSignedUp`), server-side feature-flag experiments, redirect experiments, personalization recipes (UTM campaigns, ABM, search terms, location, free shipping, interests, blog readers, leads, customers, organic intent, HubSpot forms), or reading the experience, experiment, application, or workspace dashboards (probability to be best, potential loss, "Experiment in progress", "Recommended winner", "No clear winner", "Track your goal"). Phrasings: "personalize the hero for LinkedIn visitors", "A/B test this CTA", "which variant won?", "why does my experiment show no conversions?".

Skills associés