Skip to content

Release: next → main#49

Draft
iamfj wants to merge 197 commits intomainfrom
next
Draft

Release: next → main#49
iamfj wants to merge 197 commits intomainfrom
next

Conversation

@iamfj
Copy link
Collaborator

@iamfj iamfj commented Feb 20, 2026

This is the release collection PR for the next version of Linearis.
It tracks all changes, linked PRs, resolved issues, and open items before merging next into main.
Use this thread for feedback, review, and release coordination.


Overview

214 files changed | +23,877 | -38,394 (net reduction of ~14.5k lines)

This release is a comprehensive overhaul: new architecture, new features, new tooling, and streamlined developer experience. Every layer of the codebase has been touched.


Changes by Category

Architecture — Five-Layer Redesign

The entire source tree was reorganized from a flat utils/ directory into a strict five-layer architecture with enforced separation of concerns:

Layer Directory Responsibility Client
Client src/client/ API wrappers
Resolver src/resolvers/ Human ID → UUID LinearSdkClient
Service src/services/ Business logic & CRUD GraphQLClient
Command src/commands/ CLI orchestration Both via createContext()
Common src/common/ Shared utilities

Key rules enforced: ID resolution happens exactly once in resolvers; services accept only UUIDs; commands are thin orchestrators.

GraphQL Codegen Migration

Replaced all manually maintained TypeScript type definitions and runtime GraphQL string loading with graphql-codegen. Every client.request<T>() call is now fully typed from codegen output.

Features

Authentication System

Full linearis auth command group with interactive login, encrypted AES-256-GCM token storage, token validation via GetViewer query, and structured auth error detection. Backwards-compatible with env var and legacy plaintext file.

Issue Relations

New issue-relation-service with create/find/delete operations. Relation flags (--blocks, --blocked-by, --related, --duplicate) on both issues create and issues update.

Cursor-Based Pagination

All list commands now support cursor-based pagination via --after <cursor> and --limit <n>. Service layer returns PaginatedResult<T> with pageInfo containing endCursor and hasNextPage. Includes per-service tests for pagination behavior.

Assignee ID Resolution

--assignee now accepts human-readable names and emails in addition to UUIDs. New resolveUserId resolver handles the lookup.

Two-Tier Usage System

Token-optimized usage output designed for LLM agents. Tier 1 overview (~200 tokens) and Tier 2 domain detail (~300-500 tokens). USAGE.md auto-generated on every build.

Developer Tooling

Documentation & Agent Instructions


Upstream Issues Addressed


Open Issues (tracked, not yet resolved)

These are known but not addressed in this release:


Breaking Changes

  • Command renames: project-milestonesmilestones, embedsfiles
  • Option renames: Standardized across all commands (e.g., --issues-first--limit)
  • search subcommands merged into list with filter flags
  • Source reorganization: Complete restructuring of src/ (relevant for contributors)

All Included PRs (chronological)

# PR Category
1 iamfj#2 — Setup GraphQL codegen infrastructure codegen
2 iamfj#3 — Migrate GraphQL queries to separate files codegen
3 iamfj#4 — Migrate issues service to codegen types codegen
4 iamfj#5 — Fix command parameter types for codegen codegen
5 iamfj#6 — Migrate documents and attachments to codegen types codegen
6 iamfj#7 — Migrate cycles and milestones to codegen types codegen
7 iamfj#8 — Remove manual types, finalize codegen migration codegen
8 iamfj#9 — Add Claude Code GitHub workflow ci
9 iamfj#10 — Five-layer architecture redesign architecture
10 iamfj#12 — CLI naming redesign + two-tier usage system feature
11 iamfj#14 — Remove obsolete src/queries loaders refactor
12 iamfj#23 — Update CI workflow ci
13 iamfj#26 — Authentication system with encrypted storage feature
14 iamfj#27 — Claude Code agent skills dx
15 iamfj#28 — AGENTS.md documentation dx
16 iamfj#29 — Biome, lefthook, and commitlint tooling dx
17 iamfj#30 — Issue relations support feature
18 iamfj#31 — Codebase simplification refactor
19 #50 — Resolve --assignee to UUID fix
20 #53 — Cursor-based pagination for all list commands feature
21 #54 — README rewrite for current CLI surface docs

Merge Checklist

iamfj and others added 30 commits February 4, 2026 10:07
Add GitHub Actions workflow for automated PR assistance using Claude.
This workflow provides intelligent PR reviews and suggestions.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add GitHub Actions workflow for automated code reviews using Claude.
This workflow analyzes code changes and provides detailed feedback.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add concurrency configuration to the Claude code review workflow to manage simultaneous runs and cancel in-progress jobs for pull requests.
Changes GetIssueById and GetIssueByIdentifier to use
CompleteIssueWithCommentsFields fragment instead of CompleteIssueFields,
restoring comment data that was inadvertently removed during the GraphQL
file migration.

This fixes a data regression where reading issues by ID or identifier
would no longer return comment data as expected.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Creates query loader modules in src/queries/ that read GraphQL operations
from .graphql files and export them as string constants. This bridges the
gap between the new .graphql file structure and existing service imports.

The loaders:
- Read .graphql files at runtime using Node.js fs module
- Extract individual operations with fragment dependencies
- Export query/mutation strings with the same names services expect
- Enable existing code to work without modification

Fixes TypeScript compilation errors where services imported from deleted
src/queries/*.ts files. Services now successfully import from the new
loader modules which dynamically load from graphql/queries/ and
graphql/mutations/ directories.

Files added:
- src/queries/issues.ts
- src/queries/documents.ts
- src/queries/attachments.ts
- src/queries/project-milestones.ts

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updates AGENTS.md (CLAUDE.md) to reflect the new GraphQL architecture:

- Documents the dual structure of graphql/ directory (source .graphql files)
  and src/queries/ (runtime query loaders)
- Updates "Query Definitions" section to explain both components
- Rewrites "Adding GraphQL Queries" workflow to document the new process:
  1. Define operations in .graphql files
  2. Run npm run generate for codegen
  3. Query loaders automatically extract operations
- Changes references from src/queries/common.ts to graphql/queries/issues.graphql
- Explains the separation between human-written .graphql files and
  generated TypeScript types in src/gql/

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add type aliases for GraphQL query/mutation return types to improve
readability in method signatures.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Return raw codegen types directly instead of transforming to manual
types.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Return union type of raw codegen types instead of transforming.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Return raw codegen type directly.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Return raw codegen type directly.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Use QuerySearchIssuesArgs instead of full query type. Remove
transformation.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Delete transformIssueData and doTransformIssueData - no longer needed
since services return raw codegen types.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Line 166 referenced undefined variable 'id' instead of 'input.id'.
This caused a ReferenceError when resolving non-UUID issue identifiers.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Line 572 referenced non-existent 'input.milestoneId' instead of
'input.projectMilestoneId'. This would show 'undefined' in error
messages when milestone resolution fails.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Lines 670-677 spread entire searchArgs object into GraphQL variables,
but SearchIssues query only accepts 'term' and 'first' parameters.
This caused GraphQL validation errors when extra properties like
'limit' were passed through.

Now destructures only 'term' from searchArgs and passes it explicitly
along with 'first' parameter.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Pass QuerySearchIssuesArgs fields directly instead of wrong type.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Ensure parameters match IssueUpdateInput type from codegen.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add type aliases, remove transformations, return raw GraphQL types.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add type aliases, remove transformations, return raw GraphQL types.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Define CycleListOptions and CycleReadOptions locally. Replace
LinearCycle with codegen type alias.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add missing option interfaces (MilestoneListOptions, MilestoneReadOptions,
MilestoneCreateOptions, MilestoneUpdateOptions) and replace
LinearProjectMilestone with ProjectMilestoneUpdateInput from codegen.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Delete linear-types.d.ts - all types now generated from GraphQL
schema via codegen.

- Add type aliases in linear-service.ts for LinearLabel, LinearComment,
  and CreateCommentArgs
- Replace LinearProject with inline type definition
- Fix bug in graphql-issues-service.ts: use input.projectMilestoneId
  instead of input.milestoneId
- Remove dead code for milestone fallback lookup

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
iamfj and others added 8 commits February 10, 2026 00:11
feat(issues): add issue relations support (blocking/blocked by/related/duplicate)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Consolidates duplicate regex loops in embed-parser, simplifies
URL parsing, and removes redundant documentation comments.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extracts shared SOURCE_LABELS constant in auth, inlines arrow
functions, uses ternary for optional ID resolution, and removes
unused ErrorResponse interface.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor: remove verbose JSDoc and simplify codebase
feat!: complete architecture redesign with GraphQL codegen, auth system, and developer tooling
@iamfj iamfj added the help wanted Extra attention is needed label Feb 20, 2026
iamfj and others added 19 commits February 20, 2026 11:40
Resolves user identifiers (display name, email, or UUID) to UUIDs via
the Linear SDK, following the same pattern as existing resolvers.

Lookup order: UUID passthrough → display name (case-insensitive) →
email (case-insensitive). Throws multipleMatchesError when name is
ambiguous, notFoundError when no match exists.

Closes #47

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
The --assignee option was passed directly to assigneeId without
resolution, causing GraphQL validation errors when given a name or
email instead of a UUID. Wire both create and update through the new
resolveUserId resolver.

Closes #47

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
Add command-level tests that drive the CLI through Commander and
verify resolveUserId is called with the correct input and its result
flows into the service layer. Covers create with name, create with
email, update with name, and omitted-assignee cases.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
fix(commands): resolve --assignee to UUID in issues create/update
Add $after variable and pageInfo { hasNextPage endCursor } selection
to all 10 list queries for cursor-based pagination support.
Add PageInfo, PaginatedResult<T>, and PaginationOptions types to
src/common/types.ts.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
Accept PaginationOptions with optional after cursor. Return
{ nodes, pageInfo } instead of flat arrays.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
…nt services

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
Wire all list commands to updated service signatures that accept
PaginationOptions and return PaginatedResult.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
Local filtering makes server pageInfo misleading. Set hasNextPage
to false since cursor pagination is incompatible with --window.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
…ases

Fix existing tests for new PaginationOptions signatures and
PaginatedResult return types. Add cursor passthrough and pageInfo
assertions.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
…ct --window with --after

Ensure documents list --issue returns { nodes, pageInfo } like all
other list commands. Prevent --after with --window in cycles since
local filtering is incompatible with cursor pagination.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
Ties PageInfo to the GraphQL schema instead of maintaining a
separate interface that could drift from the generated types.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
…dation

Replace 9 unvalidated parseInt calls across 7 command files with a
shared parseLimit() that rejects NaN and non-positive values.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
…stone services

Cover all public functions with happy path and error cases.
Include pagination-specific assertions for all list functions.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
Cover createComment with success and failure cases. Cover FileService
download and upload with happy paths and error conditions.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
feat(pagination): add cursor-based pagination to all list commands
Introduced a new skill for crafting effective README files, including
various templates for open source, personal, internal projects, and
configuration directories. Added a section checklist for project types
and style guide to enhance documentation quality.

New files include:
- section-checklist.md
- SKILL.md
- style-guide.md
- using-references.md
- multiple reference documents
- templates for different project types

This skill aims to provide comprehensive guidance for creating
informative and user-friendly README files.
Update all command examples to match renamed commands (files, --label-mode,
--window, --issue, --query). Add missing features: issue relations,
milestones, cursor pagination. Expand LLM agent section with
discover-then-act workflow, MCP comparison table, and optimized example
prompt. Add maintainer section for Fabian Jocks alongside original author
Carlo Zottmann.

Co-Authored-By: claude-opus-4-6 <noreply@anthropic.com>
docs: rewrite README for current CLI surface and agent optimization
@iamfj iamfj self-assigned this Feb 20, 2026
@iamfj iamfj requested a review from czottmann February 20, 2026 12:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

help wanted Extra attention is needed

Projects

None yet

1 participant

Comments