github
github.
GitHub — les dépôts : fiche, branches, commits, tags, releases.
setup & usage
crée un jeton dans GitHub (Settings → Developer settings → Personal access tokens), puis colle-le dans oto.
- classique — coche des *scopes* : repo (dépôts privés, issues, PR), read:org (organisations et équipes), workflow (GitHub Actions)
- fine-grained — coche des *permissions* (Contents, Issues, Pull requests, Actions, Members…) et la liste des dépôts auxquels le jeton s'applique. Un dépôt absent de cette liste est invisible, même avec la bonne permission
https://<votre-hôte>/api/v3github_repos(op="get") puis github_files(op="readme")github_files(op="read", path="src/x.py") — le contenu revient décodégithub_repos(op="compare", base="v1.2.0", head="main")github_issues(op="search", state="open")github_issues(op="create", fields={"title": "…", "body": "…"})github_pulls(op="search", state="open") puis op="reviews" sur un numérogithub_pulls(op="files", number=…)github_actions(op="runs", status="failure") → op="jobs" → op="logs"github_orgs(op="collaborators"), et op="permission" pour le niveau EFFECTIF d'une personne (héritages d'équipe compris)github_search(op="code", q="maFonction repo:org/dépôt")github_orgs(op="rate_limit") (ne consomme pas de quota) et op="me"⚠️ sur une ressource privée que le jeton n'a pas le droit de voir, GitHub répond 404, pas 403 — exprès, pour ne pas divulguer son existence.
« dépôt introuvable » veut donc dire, dans l'ordre de probabilité : le jeton n'a pas le scope repo ; ou (fine-grained) ce dépôt n'est pas dans la liste du jeton ; ou l'organisation impose une autorisation SSO que le jeton n'a pas encore reçue. Vérifier le nom vient en dernier.
⚠️ chez GitHub, les deux partagent la même numérotation et le même endpoint de liste. Conséquences :
github_issues(op="search") écarte les PR par défaut, sans quoi « combien de tickets ouverts ? » donne un nombre faux, souvent de beaucoup. include_pull_requests=true rend la réponse brute de l'APIgithub_issues avec son numérogithub_search(op="issues", q="repo:org/dépôt is:issue is:open")dry_run=false pour déclencher. Le workflow doit déclarer workflow_dispatch, sinon 404 (« pas déclenchable », pas « n'existe pas »), et la réponse ne rend pas l'exécution créée : la retrouver en listant les runs juste aprèsmerge ajoute un commit de fusion, squash écrase la branche en un seul commit, rebase réécrit les commits — trois effets différents sur l'historique. Passer sha protège de la course : si la tête a bougé depuis la lecture, GitHub refuse au lieu de fusionner autre chosePENDING) : rien n'est publié, personne n'est notifié, et elle n'est visible que de son auteur. APPROVE peut débloquer une fusion protégée — c'est un acte de gouvernanceop="list") : sans lui, 409. C'est le contrôle de concurrence de GitHub, qui garantit qu'on remplace bien la version lue. Chaque écriture est un commit réel, attribué au porteur du jeton⚠️ membre d'une organisation, membre d'une équipe, collaborateur d'un dépôt : retirer quelqu'un de l'une ne le retire pas des autres.
github_orgs(op="remove_member") sort de l'organisation et de toutes ses équipesop="remove_team_member" ne touche que l'équipeop="remove_collaborator" ne touche qu'un dépôt, et ne retire pas un accès hérité d'une équipe — vérifier ensuite avec op="permission"⚠️ op="members" ne montre que ce que le jeton a le droit de voir : sans read:org, seuls les membres publics sortent — une liste plus courte, sans erreur. Ce n'est pas un recensement. Et op="set_membership" / op="add_collaborator" envoient une invitation : l'accès n'est effectif qu'une fois acceptée.
pagetotal_count (qui est une estimation du corpus, pas un nombre de lignes récupérables). github_search remonte donc un bloc troncature, qui vaut vrai aussi quand GitHub a abandonné la recherche en routerepo:x seul ne suffit pas. Elle ne rend pas le contenu : le lire ensuite avec github_files(op="read")github_pulls(op="files") est plafonné à 3 000 fichiers (et omet les gros patch), op="commits" à 250 ; github_repos(op="commit") à 300 fichiers. Une PR ou un commit massif est rendu incomplet, sans erreuroutils
usage
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configured.pipx install oto-cli then oto github …