Repository navigation
feat: add projects command and issues --project filter - #39
Closed
seraph-pixelperfect wants to merge 1 commit into
Closed
seraph-pixelperfect wants to merge 1 commit into
seraph-pixelperfect wants to merge 1 commit into
Conversation
List workspace projects via the root `projects` connection (name,
lifecycle state, progress, lead, target date), auto-paginated in 50-size
batches like fetchIssues. State is selected as `status { type }` —
Project.state is deprecated in favor of Project.status per @linear/sdk,
and status.type yields the same raw lowercase lifecycle values
(backlog, planned, started, paused, completed, canceled). Progress is
rendered as an integer percent (0-100).
Add `issues --project <name>`, composing project: { name: { eq: ... } }
into the shared IssueFilter builder so it works on both the issues and
searchIssues query paths; a missing/blank value is rejected loudly like
--search. Add resolveProjectId mirroring resolveTeamId (reserved for
v0.3 write-side project assignment).
Closes #20
This was referenced Aug 19, 2026
Collaborator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #20
Depends on #38 (this branch is stacked on
feat/multi-label-pagination, itself stacked on #37)What
linear-axi projects— lists workspace projects via the rootprojectsconnection:name,state,progress,lead,target(target date), most recently updated first, auto-paginated in 50-size batches exactly likefetchIssues(same cursor guards).linear-axi issues --project <name>— composesproject: { name: { eq: ... } }into the existingIssueFilterbuilder infetchIssues, so it works on both the plainissuesquery and thesearchIssuespath (composes with--team,--state,--label,--search). A missing/blank--projectvalue is rejected loudly (same guard class as--search), never silently dropped.resolveProjectId(name)helper insrc/linear.ts, mirroringresolveTeamId(projects(filter: { name: { eq: $name } })). Not wired into any command yet — reserved for v0.3 write-side project assignment per the issue; covered by tests now.Schema verification (source: generated types in
@linear/sdk90.0.0)Verified by
npm pack @linear/sdkand inspecting the generated documents (dist/index-zxW4m1xd.d.mts,dist/index.mjs):projectsquery exists with the same connection args asissues:filter: ProjectFilter, first: Int, after: String, orderBy: PaginationOrderBy(ProjectsDocumentindist/index.mjs;ProjectConnection { nodes, pageInfo }).IssueFilter.project?: NullableProjectFilter("Filters that the issues project must satisfy"), andNullableProjectFilter.name?: StringComparatorwitheq— this is the comparator behindissues --project. Same forProjectFilter.name(used byresolveProjectId).Project.progress: Float— "(completed estimate points + 0.25 * in progress estimate points) / total estimate points", i.e. a 0–1 float.Project.lead?: Maybe<User>— "Null if no lead is assigned";User.nameis what we select.Project.targetDate?: Maybe<TimelessDate>— null when unset; Linear serializesTimelessDateas aYYYY-MM-DDdate string (rendered raw).Ambiguities / decisions flagged
statevsstatus: the issue says "state is an enum (ProjectState)". In the current schemaProject.state: Stringis deprecated ("Use project.status instead"), and there is noProjectStatetype — the values live onProjectStatus.type: ProjectStatusType(backlog, planned, started, paused, completed, canceled). We querystatus { type }and render it asstatewith the raw lowercase value the issue asked for — same rendered output, no deprecated field. Renaming the output column tostatuslater would be a one-liner.0.42→42), documented inprojects --help("percent complete, 0-100"). Raw float was the alternative; percent reads better in TOON and is documented.leadandtargetDateare nullable; both render asnone(matching the repo's existing empty-render convention fromjoinArray).Demo (before/after)
pnpm exec tsx bin/linear-axi.ts ... --key lin_api_fake— the fake key is rejected by the real API, which proves the commands reach the API layer;LINEAR_AXI_DEBUG=1dumps the emitted document.Before (base
230c540):After:
Local gates (all run on the pushed commit
c8a0fbf)pnpm build— clean (tsc, exit 0)pnpm lint— clean (eslint ., exit 0)pnpm run build:skill -- --check—skills/linear-axi/SKILL.md is up to date.(TOP_HELP command list + skill description/workflow updated, regenerated)pnpm test:(63 → 78; +15 in the new
test/projects.test.ts)pnpm run format:check— RED pre-existing on the base branch (18 files) and unchanged by this PR (still exactly the same 18; the two new files passpnpm exec prettier --check). Not enforced in CI.Stacked-PR / CI note
Stacked on #38 (which is stacked on #37). No CI checks will appear on this PR —
ci.ymlonly triggers on PRs targetingmain. CI runs when retargeted to main after #38 and #37 merge; local gates pasted above are the evidence. Not retargeting.CI quota-block caveat: org billing/spending-limit rejections can look like check failures in
gh pr checks; if a check is red, checkgh run view <run-id>for a billing annotation or the jobs API for emptysteps+ ~3-4s duration before assuming breakage. Jobs are not retried.Identity
Automated agent dispatch authenticated as
seraph-pixelperfect, submitted for human review — not self-approved. Merge is a human decision.