Add support for loading `.linear.toml` from user's home directory as a
fallback when no project-level config exists:
- Unix: `~/.config/linear/linear.toml` or `$XDG_CONFIG_HOME/linear/linear.toml`
- Windows: `%APPDATA%\linear\linear.toml`
Config precedence (highest to lowest):
1. CLI flags
2. Environment variables
3. Project config (`.linear.toml` in cwd or repo root)
4. User home config
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## Summary
Adds comprehensive milestone management functionality to linear-cli,
enabling full CRUD operations for Linear project milestones.
## Motivation
The Linear API supports project milestones, but the CLI didn't expose
this functionality. This PR adds milestone management commands to
complement the existing project and issue commands.
## Changes
### New Commands
- `linear milestone list --project <id>` - List milestones for a project
- `linear milestone create` - Create new project milestones
- `linear milestone update <id>` - Update existing milestones
- `linear milestone delete <id>` - Delete milestones with confirmation
- Short alias: `linear m` for all milestone commands
### Features
- Full CRUD operations for project milestones
- Table-formatted output for list command
- Interactive confirmation prompts for deletion (with `--force` option
to skip)
- Support for milestone name, description, and target date
- Follows existing CLI patterns and conventions
### Implementation
- Uses GraphQL Code Generator for type-safe queries/mutations
- Built with Cliffy for command structure and prompts
- Leverages existing graphql client utilities
- Includes spinner for loading states
- Updated README with usage examples
## Testing
All commands have been tested with the Linear API:
- ✅ List milestones for a project (empty and populated)
- ✅ Create milestones with name, description, target date
- ✅ Update milestone properties
- ✅ Delete milestones with confirmation prompt
- ✅ Delete with `--force` flag (skip confirmation)
## Documentation
Updated README.md with:
- Milestone commands section
- Usage examples for all operations
- Command aliases
## Example Usage
```bash
# List milestones
linear milestone list --project abc123
linear m list --project abc123 # alias
# Create a milestone
linear milestone create --project abc123 --name "Q1 Goals" --target-date "2026-03-31"
linear m create --project abc123 # interactive mode
# Update a milestone
linear milestone update xyz789 --name "Q1 Objectives"
linear m update xyz789 --target-date "2026-04-15"
# Delete a milestone
linear milestone delete xyz789
linear m delete xyz789 --force # skip confirmation
```
Add the issue identifier (e.g., TEST-123) before the title in the
issue view command output. The title now displays as "TEST-123: Fix
authentication bug" instead of just "Fix authentication bug".
- Add identifier field to fetchIssueDetails return type
- Include identifier in both GraphQL queries
- Update issue-view.ts to prefix title with identifier
- Update all test mocks to include identifier field
Claude-session-id: a1d9f23b-b88b-4571-b44a-37003734e4a1
## Summary
- Add parent issue display to `linear issue view` output (when the issue
has a parent)
- Add sub-issues list to `linear issue view` output (when the issue has
children)
- Enables agents and users to easily navigate up and down the issue
hierarchy
Closes#84
## Example Output
```
# Implement user authentication
Add user authentication to the application.
Parent:
TEST-100: Epic: Security Improvements [In Progress]
Sub-issues:
TEST-457: Add login form [Done]
TEST-458: Add password reset flow [Todo]
TEST-459: Add OAuth support [In Progress]
```
## Test plan
- [x] Added new test case "With Parent And Sub-issues" to verify
hierarchy display
- [x] Updated existing tests to include parent/children fields in mock
data
- [x] All snapshot tests updated and passing
- [x] `deno check` passes
- [x] `deno lint` passes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
use case:
- you are addressing feedback on an issue ABC-123
- run `linear issue start 123` to re-start that issue
- fire up claude code
- run `! linear issue view` to drop the issue, and comments into context
- run `! linear issue commits` to dump the diff of previous work into
context
- ask claude to address the feedback (it will have a much better shot of
knowing what you are talking about)
Extend hyperlink support to work consistently for both issue descriptions
and comments by using charmd markdown rendering with OSC-8 extensions.
- Use renderMarkdown with extensions for comment body rendering
- Remove formatWrappedText function, replaced by markdown rendering
- Pass extensions array through captureCommentsForTerminal function
- Apply proper indentation to rendered reply comments
Claude-session-id: 49101792-03cc-423f-8162-4e8fd125d1b4
Implement local image caching for issue view command to avoid
exposing authenticated Linear URLs. Images are downloaded to a
temporary directory and cached for reuse.
- Add image download and caching system
- Update deno.json permissions for temporary directories and
uploads.linear.app domain access
- Add dependencies: remark, unified, mdast, valibot, sanitize-filename
- Add LINEAR_DOWNLOAD_IMAGES env var and download_images config option
(enabled by default, disable with --no-download flag)
Claude-session-id: 626af003-386f-486b-8357-db352b0b5766
Fix flaky test that was failing due to non-deterministic port numbers
in error messages and Docker listening on the hardcoded test port.
- Change test endpoint from port 3000 to 59123 to avoid Docker
conflicts that caused timeouts
- Normalize ephemeral port numbers in error messages to a stable
placeholder (127.0.0.1:PORT)
Claude-session-id: a1a55e89-c333-41b3-8034-b9cbe6514ad3
- Add GetIssuesForStateQuery type import
- Add explicit type annotation for result variable in pagination loop
- Update snapshot tests to reflect new --limit option in help text
- Fixes TypeScript type checking error (TS7022)
- Add state field to fetchIssueDetails GraphQL queries
- Include state (name and color) in JSON output
- Update tests and snapshots to include state field
- Remove separate commentReplyCommand and issue-comment-reply.ts
- Add --parent flag to comment add command for replying to comments
- Both issueId and parentId are now included in mutation input
- Fetch existing comment body for update command prompt default
- Update issue-comment.ts to remove reply command registration
- Delete orphaned issue-comment-reply.test.ts
- Add 'linear issue comment' subcommand group
- Implement add, reply, and update subcommands for managing issue comments
- Includes tests and snapshot files for all three subcommands
- Support for both interactive and flag-based input
- JSON output option for programmatic use
Implement a --json flag for the linear issue view command to output
issue data in JSON format, enabling better integration with scripts
and other tools.
- Add -j/--json flag to output raw issue data as formatted JSON
- Modify spinner logic to avoid interfering with JSON output
- Include comprehensive test coverage for JSON output scenarios
- Update snapshots to validate JSON output format
Fixes#25
Claude-session-id: 3f32bad3-84d3-42d5-84ce-77b7628ca1ce
Implement a new describe command that outputs the issue title and
Linear-issue trailer in a simple format, without markdown parsing or
description content. This complements the existing commit-message
command with a lightweight alternative.
- Create issue-describe.ts with new describe command
- Add describe to issue command routing
- Include comprehensive snapshot tests for help, successful output,
and error handling
Claude-session-id: 8f5b0675-298f-4694-8cd4-109cc46d8066
**Fixed:**
- state column is now dynamically sized with max 20 chars and
auto-truncation
**Changed:**
- linear issue list now sorts by workflow state first
- issue pr create no longer opens browser by default, added --web flag
- removed 'about' prefix from relative timestamps
**Added:**
- automatic paging for issue view command with --no-pager flag and pager
- pager support for issue list command with --no-pager option