You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#21 — Agent UX: state-by-name, command aliases, prep/pr-ready, list guardrail
What to build
Introduce a reusable workflow-state resolver in linear-core that maps a state reference (a UUID or a human name) to a stateId for a given team, and wire it into issues update so an issue's state can be set by name.
End-to-end behavior:
linear issues update ANN-1 --state "In Progress" sets the issue's state.
linear issues update ANN-1 --input '{"stateName":"In Progress"}' and --input '{"state":"In Progress"}' resolve the same way.
linear issues update ANN-1 --input '{"stateId":"<uuid>"}' is unchanged.
Resolution is scoped to the target issue's team (fetch the issue to read its teamId). Source precedence: explicit stateId in --input > --state flag (already a global option) > state/stateName key in --input. The state/stateName keys are stripped before the payload reaches GraphQL. On an unknown or ambiguous name, the command fails with an error listing the team's valid states as name (type).
Resolver contract: if the reference is a UUID, return it unchanged; otherwise exact case-insensitive name match; support an optional preferred type fallback (consumed by later slices). The resolver depends only on an injected "list workflow states for a team" capability so it is testable in isolation.
Acceptance criteria
issues update <id> --state "<name>" sets the issue to the matching state
--input '{"stateName":"<name>"}' and --input '{"state":"<name>"}' resolve to a stateId
--input '{"stateId":"<uuid>"}' continues to work unchanged
Resolution is scoped to the target issue's team
Unknown/ambiguous name errors with the team's valid state names listed
state/stateName keys never reach GraphQL
Resolver unit tests cover UUID passthrough, name match, type fallback, not-found, ambiguous
Shipped in #31 (commit 6e22fba), merged to main. All acceptance criteria implemented and tested: state-by-name resolver in linear-core (state-resolver.ts) wired into issues update via normalizeIssueUpdateStatePayload, with unit tests for both.
Activity
docs(cli): document state-by-name across help, skill, and README
feat(cli): resolve issue workflow state by name on issues update (#31)
chore(release): 1.6.0-alpha.1 [skip ci]
dubscode commentedon May 30, 2026
Shipped in #31 (commit 6e22fba), merged to main. All acceptance criteria implemented and tested: state-by-name resolver in linear-core (state-resolver.ts) wired into
issues updatevia normalizeIssueUpdateStatePayload, with unit tests for both.chore(release): 1.6.0 [skip ci]