Opérations
Routes, portées, exigences d’idempotence et objectifs des 18 opérations de l’API HTTP.
Appelez chaque opération avec POST /api/v1/<operation> et un corps objet JSON. Dans les tableaux, le nom de l’opération est le suffixe exact après /api/v1/.
Cas de test
| Opération | Portée | Idempotence | Objectif |
|---|---|---|---|
test_case.list | autonomy:read | Aucune | Lister les cas de test de l’organisation, les plus récents d’abord. Filtrer par plateforme ou par recherche sur le nom. À utiliser avant de créer un cas afin de réutiliser la couverture existante. |
test_case.get | autonomy:read | Aucune | Récupérer un cas de test avec sa liste complète d’étapes. |
test_case.create | autonomy:test_cases:write | Requise | Créer un cas de test à partir d’étapes explicites. Les valeurs de saisie sont literal, agent (choisie par l’Agent à l’exécution) ou environment (valeur d’exécution nommée d’un environnement) ; les littéraux ayant la forme d’un identifiant sont refusés sauf s’ils sont explicitement déplacés vers un secret d’environnement. |
test_case.update_steps | autonomy:test_cases:write | Requise | Remplacer toute la liste d’étapes d’un cas de test. Exige confirm: true ; sans cela, la réponse décrit ce qui changerait et rien n’est écrit. |
Plans de test
| Opération | Portée | Idempotence | Objectif |
|---|---|---|---|
test_plan.list | autonomy:read | Aucune | Lister les plans de test de l’organisation, c’est-à-dire des sélections nommées de cas de test. |
test_plan.get | autonomy:read | Aucune | Récupérer un plan de test avec ses cas de test membres ordonnés. |
test_plan.create | autonomy:test_plans:write | Requise | Créer un plan de test et, éventuellement, ses premiers cas de test membres ordonnés. |
test_plan.set_members | autonomy:test_plans:write | Requise | Remplacer la composition ordonnée d’un plan de test. Retirer des cas exige confirm: true ; sans cela, la réponse liste les cas qui seraient retirés et rien n’est écrit. |
Exécutions
| Opération | Portée | Idempotence | Objectif |
|---|---|---|---|
run.trigger | autonomy:runs:write | Requise | Mettre des exécutions en file. Fournir exactement l’un de testCaseId ou testPlanId (un plan crée une exécution par cas membre). Cibler un environnement enregistré par slug ou fournir des cibles explicites pour un nouveau déploiement ou artefact. Renvoie immédiatement ; poursuivre avec run.get. |
run.list | autonomy:read | Aucune | Lister les exécutions récentes, les plus récentes d’abord. Filtrer par statut, cas de test, environnement ou branche. Vérifier ici avant de déclencher un doublon. |
run.get | autonomy:read | Aucune | Récupérer l’état d’une exécution. Fournir le cursor précédent et waitMs (≤ 25000) pour bloquer jusqu’à un changement ; timedOut: true signifie que rien n’a changé et n’est pas une erreur. next est un conseil, jamais une autorité. |
run.evidence | autonomy:read | Aucune | Obtenir les preuves externes d’une exécution : ce que le produit a montré et ce qui était attendu à chaque étape, le verdict et le diagnostic, les actions neutralisées et les liens média de courte durée. Les détails de modèle, prompt, token et runner ne sont jamais inclus. Filtrer avec step. |
Environnements
| Opération | Portée | Idempotence | Objectif |
|---|---|---|---|
environment.list | autonomy:read | Aucune | Lister les environnements, cibles de déploiement nommées, avec leurs cibles par plateforme. Les noms des valeurs d’exécution sont affichés, jamais les valeurs. |
environment.get | autonomy:read | Aucune | Récupérer un environnement par son slug. |
environment.upsert | autonomy:environments:write | Requise | Créer un environnement ou le mettre à jour par slug. La mise à jour d’un slug existant écrase les cibles données et exige confirm: true ; sans cela, la réponse décrit le changement et rien n’est écrit. |
Notes
Les Notes sont réservées à HTTP et n’apparaissent pas dans le catalogue d’outils MCP.
| Opération | Portée | Idempotence | Objectif |
|---|---|---|---|
note.list | autonomy:read | Aucune | Lister les Notes d’un environnement, les plus récentes d’abord. Filtrer par statut. |
note.create | autonomy:notes:write | Requise | Déposer une Note sur un environnement. Le corps est en texte brut, chaque retour à la ligne démarrant un paragraphe. Citer les exécutions avec runIds. |
note.comment | autonomy:notes:write | Requise | Ajouter un commentaire en texte brut à l’activité d’une Note. |
Mutations idempotentes
Toute mutation marquée Requise doit inclure une chaîne idempotencyKey dans son corps JSON. Réutilisez la même clé pour réessayer la même mutation voulue ; utilisez une nouvelle clé pour une autre mutation. Les opérations de lecture n’utilisent pas de clé d’idempotence.
Créer un cas de test
Cette requête n’utilise que les champs acceptés par test_case.create. Les objets valueSpec distinguent une valeur littérale ordinaire d’une valeur d’environnement résolue à l’exécution.
curl --request POST "$AUTONOMY_API_BASE/api/v1/test_case.create" \
--header "Authorization: Bearer $AUTONOMY_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"idempotencyKey": "ci-test-case-checkout-smoke-v1",
"name": "Checkout smoke",
"description": "A customer can complete checkout.",
"platforms": ["web"],
"tags": ["checkout", "smoke"],
"steps": [
{ "action": "navigate", "target": "/checkout" },
{
"action": "fill",
"target": "Email",
"valueSpec": { "kind": "literal", "text": "qa@example.com" }
},
{
"action": "fill",
"target": "Password",
"valueSpec": { "kind": "environment", "variable": "LOGIN_PASSWORD" }
},
{ "action": "click", "target": "Place order" }
]
}'Définissez AUTONOMY_API_BASE avec NEXT_PUBLIC_CONVEX_SITE_URL et stockez la clé aut_ dans AUTONOMY_API_KEY.
Déclencher une exécution
Fournissez exactement l’un de testCaseId ou testPlanId. Cet exemple cible une prévisualisation web récente ; utilisez plutôt environmentSlug lorsque la cible est enregistrée.
curl --request POST "$AUTONOMY_API_BASE/api/v1/run.trigger" \
--header "Authorization: Bearer $AUTONOMY_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"idempotencyKey": "ci-run-pr-128-checkout-smoke-9f3a2c1",
"testCaseId": "jh7exampletestcaseid",
"platforms": ["web"],
"targets": {
"web": { "baseUrl": "https://preview-128.example.com" }
},
"branch": "feature/checkout-copy",
"pr": "128",
"deployment": { "commitSha": "9f3a2c1d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b" },
"scope": "changed",
"changedFiles": ["src/checkout/page.tsx"]
}'La réponse contient runIds et, pour un plan de test, peut contenir planGroupRunId. Le déclenchement renvoie immédiatement ; suivez chaque identifiant avec run.get.
Confirmation avant remplacement
confirm: true n’est jamais requis pour une création ni pour run.trigger. Il l’est uniquement lorsqu’une opération remplacerait une configuration existante :
test_case.update_stepsl’exige toujours, car toute la liste d’étapes est remplacée.test_plan.set_membersl’exige seulement si des cas seraient retirés.environment.upsertl’exige lorsqu’un slug existant serait mis à jour avec les champs ou cibles fournis.
Sans confirmation, l’API renvoie INVALID_ARGUMENT avec details.confirmRequired: true et un aperçu details.wouldChange. Examinez-le avant de réessayer ; n’ajoutez pas confirm: true automatiquement.
Pagination par curseur
Chaque requête *.list accepte un limit et un cursor opaque facultatifs :
1{2 "limit": 20,3 "cursor": "<nextCursor from the previous response>"4}limit vaut 20 par défaut et doit être un entier de 1 à 100. Chaque réponse a la forme { items, nextCursor }. Transmettez nextCursor sans le modifier pour obtenir la page suivante ; null signifie qu’il n’y a plus de page. Les filtres restent dans le même corps et doivent rester inchangés entre les pages.