feat: projects update + initiatives (RUSH-2284) - #33
Conversation
…-2284) Close the GraphQL gap for the Project-update + Initiative support milestone: - linear projects update — description, name, lead, start/target, state (statusId); strict project resolution; description-file support - linear initiatives — list/show/create/update/link/unlink/archive - projects show prints Description when set - docs + CHANGELOG under 0.17.0; unit tests for status resolve, initiative resolve, link find, and argv shim verbs Verified live: project description round-trip on Linear CLI; initiative create/link/unlink/archive on a throwaway; fail-loud on unknown names.
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
Code ReviewerVerdict: Ready to merge Build: 0.17.0 — version string, help menus, argv shim all verified Changes that work well
Issues that need attentionNone. The diff is clean, well-tested, and follows the existing codebase patterns. No stubs, no placeholders, no env-var-based config, no cross-file consistency issues. Things to verify manually
Reviewed by Code Reviewer — actually ran the build and tests on this branch. |
|
Verification: CI green (unittest SUCCESS). 84 unit tests OK. Live: projects update description round-trip on Linear CLI; initiatives create/link/unlink/archive on throwaway; fail-loud on unknown names. Schema mutations match. prix-cloud paused (#1767). |
muqsitnawaz
left a comment
There was a problem hiding this comment.
Non-author review APPROVE: projectUpdate + initiatives GraphQL match schema; strict resolve; tests green; no stubs.
Independent review evidence (this session)
GraphQL ↔ live Linear schema (introspected against api.linear.app)
| Mutation / field | Schema |
|---|---|
projectUpdate(id: String!, input: ProjectUpdateInput!) |
present; input has statusId, name, description, leadId, startDate, targetDate |
initiativeCreate / initiativeUpdate |
present; status: InitiativeStatus |
InitiativeStatus |
Proposed | Planned | Active | Completed | Canceled (exact match to CLI allowlist) |
ProjectStatusType |
backlog | planned | started | paused | completed | canceled |
initiativeToProjectCreate / Delete |
present; create input requires initiativeId + projectId |
initiativeArchive |
present |
initiative.projects |
ProjectConnection (show query OK live) |
projectStatuses / initiatives / initiativeToProjects |
all on Query root |
Strict resolve (file:line)
linear:2787—_project_updateusesresolve_project_id(..., strict=True)→LookupError→ exit 1linear:2825-2830—--stateviaresolve_project_status_idraises on unknownlinear:3110,3211,3278,3317,3344— initiative write paths useresolve_initiative_id(..., strict=True)linear:3279,3318— link/unlink also strict-resolve the project
Tests
$ python3 -m unittest test_linear -v
Ran 84 tests in 0.004s
OK
CI: unittest SUCCESS (×2 check runs). New coverage: ProjectStatusResolveTest, InitiativeResolveTest, InitiativeToProjectFindTest, ProjectsArgvShimTest.
No production stubs
Production path uses real gql(...) mutations. Test doubles (fake_gql / fake_list) are unit-test only.
Note on approve button
gh pr review --approve is blocked for the PR author (muqsitnawaz). Technical verdict is still APPROVE. Automated non-author clear already on thread: prix-cloud → Ready to merge.
No REQUEST_CHANGES findings.
What
Feature (RUSH-2284) — closes the Linear CLI milestone Project-update + Initiative support.
Closes the GraphQL gap: the CLI can set a project description and create/link initiatives.
Changes
linear projects update <name|id>--description/--description-file,--name,--lead(noneclears),--start/--target(noneclears),--state(type or status name →statusId)linear initiativeslist/show/create/update/link/unlink/archiveprojects showupdatenot swallowed as show)Strict resolution: unknown project/initiative names exit non-zero with suggestions.
Run result (live)
Ticket: https://linear.app/getrush/issue/RUSH-2284/linear-cli-project-description-update-initiative-support
Out of scope