productlane
productlane.
Productlane — les fils de retour client : ce que les clients ont dit.
setup & usage
crée une clé dans Productlane (Settings → API), puis colle-la dans oto.
threads:read, threads:write, contacts:*, companies:*, projects:*, issues:*, changelogs:*, docs:*, tags:*, snippets:*, portal:read) : un refus 403 veut dire qu'il en manque un, pas que la clé est mauvaiseproductlane_threads(op="search", status="open"), ou productlane_roadmap(op="projects", sort="total_score") pour classer par poids des retours rattachés plutôt que par dateproductlane_threads(op="get", thread_id="…", expand=["messages","comments"])productlane_threads(op="send", thread_id="…", content="…") — ⚠️ cela part vraiment, par le canal d'où vient le filproductlane_threads(op="comment", …) : visible des coéquipiers seulement, rien ne sortproductlane_threads(op="link", thread_id="…", issue_ids=[…]) : c'est ce geste qui fait monter le score d'un projetproductlane_contacts(op="search", …) puis op="issues" / op="projects" sur le contactproductlane_changelogs(op="create", fields={…}), puis op="update" avec {"published": true} pour la rendre visibleproductlane_changelogs(op="broadcast", changelog_id="…", email=true, dry_run=false)productlane_docs(op="articles", title_contains="…")productlane_workspace(op="me") : il rend les scopes accordés et ne demande aucun droit⚠️ `op="broadcast"` n'a AUCUN effet sur `published` — c'est écrit noir sur blanc côté éditeur. Les deux gestes sont indépendants, et les confondre coûte cher dans les deux sens :
publier = productlane_changelogs(op="update", fields={"published": true}). diffuser = op="broadcast", qui est en dry-run par défaut : il faut dry_run=false pour que quelque chose parte, et il n'y a ni annulation ni rappel.
⚠️ une écriture peut réussir ici pendant que la synchro Linear échoue : l'éditeur la journalise de son côté et ne la remonte pas dans la réponse. Un succès sur update_project / update_issue ne prouve donc pas que Linear a suivi.
team_id, state_id, assignee_id, linear_status_id sont des identifiants Linear — les lire par productlane_roadmap(op="workflows", team_id="…") et op="statuses", jamais les coder en durstatus n'est pas une énumération fixe : ce sont les workflow states de l'équipe Linear, propres à chaque espace de travailpriority suit la numérotation Linear : `0` = aucune priorité, `1` = urgente, puis 2, 3, 4 par urgence décroissante. Ce n'est pas une échelle croissante"EMAIL" ne vise qu'une adressecompany_id survit, celle de source_id est suppriméeaccepted : le brouillon ne s'applique plus proprement, l'article ayant bougé sous lui. C'est un succès HTTP qui n'a rien appliqué — lire le statut rendu, pas seulement l'absence d'erreuroutils
utilisation
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.pipx install oto-cli puis oto productlane …