glhd/linearavel
Linearavel is a Laravel client for Linear's GraphQL API. Query issues, projects, teams, and cycles from your app with an expressive interface, config-driven auth, and typed responses built on Laravel's HTTP client, so you can sync Linear data or build integrations without hand-writing GraphQL.
Architecture fit. This package is a schema-derived client for Linear's GraphQL API, regenerated wholesale from the upstream schema snapshot dated 2026-10-16. It sits in the "external SaaS integration" layer of a Laravel application — not in the domain core — so it should be treated as an anti-corruption boundary: wrap it behind an application-owned interface (a LinearClient port with DTOs) rather than letting generated types leak into controllers, jobs, or Eloquent models. Because generated code is disposable and version-coupled, the wrapper is what makes future version bumps a one-file change instead of a codebase-wide refactor.
Integration feasibility. Low friction. Release 0.2.9 is purely additive and non-breaking: three new optional input fields (inlineAnchorFrom and inlineAnchorTo on CommentCreateInput, origin on IntegrationSettingsInput) and four new enum members (addedToMergeQueue and removedFromMergeQueue on WorkflowTrigger; comment and view on DocumentShareRole). Optional input fields require no consumer changes whatsoever — existing mutation payloads remain valid. Enum widening is also backward compatible at the wire level. The realistic integration effort is near zero; the meaningful work is in the enum-consuming paths (see risk below).
Technical risk. Two risks dominate, neither severe:
match expression, switch, or enum-mapping layer in our codebase that enumerates WorkflowTrigger or DocumentShareRole without a default arm will now throw \UnhandledMatchError or silently fall through when Linear returns addedToMergeQueue or view. This is the single most likely production incident from this upgrade, and it is caused by our code, not the package.Notably absent from the notes are any deprecations, removals, or type narrowings — a good signal, but the notes are terse and do not state whether the schema regeneration touched anything outside the listed delta. Verify against the diff rather than trusting the summary.
Key questions.
CommentCreateInput payloads where inlineAnchorFrom/inlineAnchorTo would materially improve comment anchoring quality (inline review comments), or is this capability we would not use?Stack fit. Standard Composer dependency for a Laravel app; no framework-version coupling is implied by the release notes. The relevant fit question is not Laravel compatibility but GraphQL transport: confirm the package's HTTP layer (Guzzle vs. Laravel Http, retry/backoff, timeout config) matches our existing outbound-integration conventions, and that authentication (Linear API keys / OAuth tokens) flows through our existing secrets management rather than package-local config.
Migration path. There is nothing to migrate. Install/upgrade to 0.2.9, then run the two containment checks: (a) grep for exhaustive match/switch over WorkflowTrigger and DocumentShareRole, and (b) confirm the new optional inputs are opt-in only and not defaulted to non-null values that would alter existing mutation behavior. If we do not yet consume WorkflowTrigger (merge-queue events) or DocumentShareRole (document sharing), the upgrade is a no-op and can ride the next routine dependency bump.
Compatibility. Backward compatible with all prior 0.2.x consumers. Forward compatibility is conditional: pin the minor version (^0.2.9 is acceptable; ^0.2 risks absorbing a future regeneration with removals) and treat 0.3.0 as a reviewed upgrade rather than an automatic one.
Sequencing.
default arms (or an explicit "unknown enum member" passthrough) to all enum-mapping code before enabling any feature that reads WorkflowTrigger or DocumentShareRole.origin on IntegrationSettingsInput as a low-priority nicety for integration attribution.Maintenance. The package is a generated artifact, so maintenance cost concentrates in upgrade cadence, not in code we own. Budget a recurring review per release: diff the schema delta, re-run the enum exhaustiveness check, re-verify the wrapper contract. This is cheap (minutes) as long as step 2 above is in place, and expensive (production error paths) if it is not. Because we do not control the upstream schema, schedule these reviews on the package's releases rather than on a calendar.
Support. Support burden is asymmetric: Linear's GraphQL API can begin returning a new enum member or field before we upgrade, and our deserialization layer will fail on values it does not recognize. Mitigation is client-side tolerance — never hard-fail on unknown enum members; map them to an Unknown case and log. The package cannot provide this for us; it is a wrapper responsibility. Internally, designate one owner for the Linear integration so that "package bumped, enum broke" has a clear first responder.
Scaling. GraphQL integrations scale on request shape and rate limits, not on the package. Two practical concerns: query complexity/cost if we fan out per-record calls, and Linear's rate-limit headers. Ensure the package surfaces HTTP status and rate-limit metadata so our jobs can implement backoff and queue-level throttling. If merge-queue triggers (addedToMergeQueue/removedFromMergeQueue) become a webhook-driven feature, the scaling profile shifts from polling to event handling — a meaningfully different operational shape worth planning before adoption.
Failure modes.
default arms.Ramp-up. Minimal for any Laravel developer already comfortable with GraphQL clients, but there is a real learning step in the generated-code idiom: which classes are safe to touch, which are regenerated and must never be hand-edited, and where the wrapper boundary sits. Document that boundary explicitly — one page in the integration runbook covering the wrapper interface, the enum-tolerance rule, the upgrade checklist, and the schema snapshot date. Without it, the first engineer to hit an enum crash will patch the generated code and create a merge conflict with the next release.
How can I help you explore Laravel packages today?