Repository navigation
linear-strict/libraryexportsStrictLinear,linearGqlandOverlapRefusal, so a script that files tickets goes through the same checks as an agent. An overlap refusal carries the close tickets ascandidates.create_issueneedsparentorproject_id, and a sub-ticket goes in its parent's project; a parent with no project is refused until it has one, with the project its neighbours suggest. Refusals list the team's open projects, the ones closest to the ticket's text first. A team with no open projects is exempt. Each close ticket in an overlap refusal says why it was named. Without a parent it finds the open tickets on the team the new one overlaps: with a judge key set,claude-sonnet-5-5reads every open title and names them; otherwise Linear's semantic and keyword searches find the closest (LINEAR_STRICT_OVERLAP=searchkeeps the searches) and refuses until the filer files under one, widens one instead, or passesnew_becausewith each indistinct_from; the reason is posted on the new ticket. The result lists the filer's own tickets on the team still waiting with no delegate (your_unclaimed). Agents had been splitting one change into several tickets and leaving what they filed for nobody.linear-strict audit exportandaudit check: an offline check of thepath:lineand commit citations in a team's tickets against a git checkout. Each citation is dated by the description version or comment it first appeared in, and reported as holding, moved, changed or gone since.set_fieldscan move a delegation off another agent when the ticket is assigned to the human this identity acts for (LINEAR_PRINCIPAL_ID), since that human could do the same in Linear's UI. It needstake_over: trueand posts a "take over" comment naming the agent it was taken from. This is how a ticket comes back from an agent that has stopped running. Without a principal, or on anyone else's ticket, the refusal is unchanged.mark_principal_notifications_read: marks notifications in the principal's inbox read, by id or every unread one an agent or integration caused (only_agent_actors, optionallybeforea date). It only marks notificationsget_principal_notificationsreturned in the same server, since the principal token can otherwise write anything its human can. A read-only principal token is refused with linear-strict's own message.get_principal_notifications: a second, explicitly separate notifications tool reading the inbox of the human an identity acts for, rather than the identity's own. NeedsLINEAR_PRINCIPAL_TOKEN/LINEAR_PRINCIPAL_IDin the server's environment (pennon'sonboardwires both when aprincipals.jsonentry exists); refuses if either is missing, and refuses if the token resolves to a different user thanLINEAR_PRINCIPAL_IDnames, rather than silently serving whoever it belongs to.mark_principal_notifications_readabove is its write twin.set_statusrefuses a completed state when the ticket's linked PRs merged, and every one of them merged into a branch other than the main one. Before, this only showed up afterwards as anot_on_mainfinding on the next read. The refusal says to use a state that isn't completed, or to confirm with git that the work is on main and link the PR that took it there.set_fieldstakeslink_prs, GitHub pull request URLs to link to the ticket, such as a promotion PR.commentwrites one header. The server builds the header fromkind, so a header typed at the top ofbodyis now dropped, including one that names a different kind. The same goes for aDescription updatedline typed at the end of a call that carries a patch. Anauthor_labelthat is a whole header keeps only the name, and a body that is nothing but a header is refused. Anaskno longer turns a typed header into its question row.
Install: npm install -g https://github.com/justinstimatze/linear-strict/releases/download/v0.2.0/linear-strict-0.2.0.tgz, then linear-strict install. See the README for setup.