478 Commits

Author SHA1 Message Date
Peter Schilling 3619837c5e chore: Release linear-cli version 1.10.0 v1.10.0 2026-02-17 04:56:09 +00:00
Sergio Francisco 265a37f760 fix: correct API key creation URL in auth login (#146)
## Summary

- Replace incorrect URL `https://linear.app/settings/api` with
`https://linear.app/settings/account/security` in the `auth login`
command prompt and error message
- The old URL isn't the correct one where you can create those API keys.
The new one correctly redirects to the API key management page.

## Test plan

- `deno task check` isn't passing due to pre-existing failures on `main`
- [x] `deno lint` passes
- [x] `deno task dev auth login` shows the corrected URL in the prompt
hint


## Test evidence:
<img width="759" height="134" alt="CleanShot 2026-02-16 at 17 05 16"
src="https://github.com/user-attachments/assets/a8d7813b-f609-4599-93f5-cc9a20e71bad"
/>
2026-02-16 19:47:47 -08:00
Peter Schilling 6df2efd320 feat: use heredoc for GraphQL queries in skill and add search example 2026-02-13 20:37:29 -08:00
Peter Schilling f8efda78d8 Add best practices for markdown content to Linear CLI skill
- Regenerate skill documentation with file-based flag guidance
- Update test snapshots to reflect new --description-file and --body-file flags
- Add section explaining why file-based flags prevent markdown formatting issues

Addresses: https://github.com/schpet/linear-cli/issues/133
2026-02-12 15:50:21 -08:00
Peter Schilling 1a6dcb0fb4 Add CI check for skill docs and update documentation
- Add CI workflow step to verify generated skill docs are up-to-date
- Add development section to README with instructions for:
  - Updating skill documentation with deno task generate-skill-docs
  - Running code formatting with deno fmt
- Update generate-docs.ts to automatically format generated files
- Regenerate skill docs to ensure they match current CLI version

Fixes #135
2026-02-12 08:03:29 -08:00
Peter Schilling d640db8b1a fix: don't create new commit after describing in issue start
Previously,  with jj would:
1. Prepare working state (create empty commit if needed)
2. Describe the commit with issue details
3. Create a new empty commit to work on

This left the user on an empty commit with the described commit as parent.

Now it stops after step 2, leaving the user on the described commit itself.
This matches the expected behavior where you work directly on the commit
associated with the issue.
2026-02-11 12:36:27 -08:00
Ben Drucker 3582fc5700 feat: add api subcommand for raw GraphQL access (#121)
Adds a `linear api` subcommand for making raw GraphQL requests,
mirroring [`gh api`](https://cli.github.com/manual/gh_api) conventions.

## Changes

- Accepts a GraphQL query as a positional arg, from stdin with `-`, or
via auto-detected piped input
- `--variable key=value` for typed variable coercion (booleans, numbers,
null, `@file` for file reads, `@-` for stdin)
- `--variables-json '{"key": "value"}'` for passing all variables as a
JSON object (merged with `--variable`, which takes precedence)
- `--paginate` walks `pageInfo.endCursor` automatically and outputs
concatenated `nodes` array
- `--silent` suppresses response output while exit code still reflects
errors
- Pretty-prints JSON when stdout is a TTY, raw JSON otherwise for piping
to `jq`
- Exits with code 1 on HTTP errors (status >= 400) and GraphQL-level
errors
- Uses raw `fetch` so users see the exact server response including both
`data` and `errors` fields

## Testing

- Snapshot tests using `MockLinearServer` cover query resolution,
variable handling (type coercion, `@file`, `--variables-json`,
precedence), output modes, pagination (multi-page, single-page,
non-connection), auth errors, and `--silent` behavior for both
successful and HTTP error responses
- Manual testing against live Linear API: cycles, workflow states,
notifications (with `--paginate`), non-existent issue lookup, variable
type mismatch errors, stdin piping

## Related

- Closes #123
2026-02-09 09:36:55 -08:00
Paymahn Moghadasian 338ce75299 feat: increase sub-issues limit from 50 to 250
The children query defaulted to 50 items, which truncated issues with
many sub-issues (e.g., INFRA-823 has 179 sub-issues but only showed ~50).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 09:25:28 -08:00
Ben Drucker 4dd3878f2a feat: add --sort-order flag to milestone update command
Expose the sortOrder field (already in the GraphQL schema) as a CLI
option for updating milestone ordering within a project.
2026-02-02 20:58:14 -08:00
Peter Schilling 430ac0402d feat: add user-friendly error handling with LINEAR_DEBUG support
Fixes #116

Error messages are now clean and user-friendly by default. Stack traces
are only shown when LINEAR_DEBUG=1 is set, similar to RUST_BACKTRACE.

Changes:
- Add src/utils/errors.ts with error handling infrastructure:
  - CliError base class with user-facing messages and suggestions
  - NotFoundError for entity lookups
  - ValidationError for invalid input
  - AuthError for authentication issues
  - handleError() for consistent error display
  - extractGraphQLMessage() to parse Linear API errors
- Update all commands to use handleError() for consistent error display
- Error output goes to stderr with ✗ prefix
- GraphQL errors show userPresentableMessage when available

Example before:
  Error: Entity not found: Issue: {"response":{"data":null...

Example after:
  ✗ Issue not found: FAKE-9999
2026-02-01 22:51:12 -08:00
Peter Schilling 59dce3cf19 fix: use centralized shouldShowSpinner() for all spinner checks
Updated bulk.ts to use the centralized shouldShowSpinner() function instead
of directly checking Deno.stdout.isTerminal(). This ensures progress display
during bulk operations also respects the NO_COLOR environment variable.

Fixes #113
2026-02-01 20:38:23 -08:00
Peter Schilling 5e845e2ee3 fix: disable spinners in non-TTY environments
Add shouldShowSpinner() utility that checks both Deno.stdout.isTerminal()
and the NO_COLOR environment variable before showing spinners. This
prevents garbled spinner output when the CLI is used with tools that
capture output (e.g., AI assistants, scripts).

Removes --no-color flags from commands where they only controlled spinner
visibility, since spinners now automatically disable in non-TTY
environments.

Fixes #113
2026-02-01 20:38:23 -08:00
Paymahn Moghadasian 23d20f77d7 feat: show sourceType for attachments in issue view
Adds sourceType field (e.g., github, githubCommit, zendesk) to attachment
display so users can identify what kind of link they're looking at.

Closes #21

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 11:32:13 -08:00
Zach Trayner bd007f378d feat: add issue relation command for managing dependencies (#115)
## Summary

Adds `linear issue relation` command with subcommands for managing issue
relations/dependencies:

- **`add`** - Create relations between issues
- **`remove`** - Remove existing relations  
- **`list`** - List all relations for an issue

## Supported Relation Types

| Type | Description | Example |
|------|-------------|---------|
| `blocks` | Issue blocks another | `linear issue relation add ENG-123
blocks ENG-456` |
| `blocked-by` | Issue is blocked by another | `linear issue relation
add ENG-123 blocked-by ENG-100` |
| `related` | Issues are related | `linear issue relation add ENG-123
related ENG-456` |
| `duplicate` | Issue is duplicate of another | `linear issue relation
add ENG-123 duplicate ENG-100` |

## Examples

```bash
# Mark ENG-123 as blocked by ENG-100
linear issue relation add ENG-123 blocked-by ENG-100

# Mark ENG-123 as blocking ENG-456
linear issue relation add ENG-123 blocks ENG-456

# List all relations for an issue
linear issue relation list ENG-123

# Remove a relation
linear issue relation remove ENG-123 blocked-by ENG-100
```

## Implementation Notes

- The `blocked-by` relation type is implemented by reversing the issue
order with the `blocks` API type, providing a more intuitive CLI
experience
- Uses existing utilities (`getIssueIdentifier`, `getIssueId`) for
consistent issue resolution
- Follows the existing command structure and patterns in the codebase

## Motivation

This enables CLI users to manage issue dependencies, which is useful
for:
- Automating issue management in scripts
- AI agents that need to set up dependency relationships
- Quick dependency management without leaving the terminal
2026-01-30 09:17:19 -08:00
Peter Schilling aff8f82e8f chore: remove auth login warning and sync plugin versions to 1.9.1
The auth login command is now stable, so remove the warning from README.
Regenerated skill docs and updated marketplace.json and plugin.json
versions to match deno.json.
2026-01-30 07:10:46 +00:00
Peter Schilling 923a63cb85 note installation of skills for other agents 2026-01-29 21:55:21 -08:00
Peter Schilling 17ddb7802c chore: Release linear-cli version 1.9.1 v1.9.1 2026-01-29 17:07:47 +00:00
Peter Schilling af20b0f310 use --allow-all instead of fine grained permissions
this thing runs exec loosely so i don't think they afford me mcuh, and they frequently cause problems
2026-01-29 16:33:18 +00:00
Peter Schilling 65d07f329f chore: Release linear-cli version 1.9.0 v1.9.0 2026-01-29 05:55:40 +00:00
Peter Schilling 1e4c6e354d chore: fix formatting in publish.yaml 2026-01-29 05:53:25 +00:00
Peter Schilling 39b6405c37 fix: trigger JSR publish on version tags instead of every push 2026-01-29 05:53:03 +00:00
Peter Schilling c752abaf24 chore: remove duplicate ci.yml (ci.yaml already exists) 2026-01-29 05:51:19 +00:00
Peter Schilling 992f05afe1 fix: add type annotations and CI workflow for type checking
- Add explicit type annotations to team-list.ts and project-list.ts to fix implicit any errors
- Add CI workflow (.github/workflows/ci.yml) that runs type check, format, lint, and tests on PRs
- Update justfile to use 'deno check src/main.ts' instead of '--all' to avoid npm dependency type errors
2026-01-29 05:48:54 +00:00
Andrew Kline 86bdd3744f fix: add pagination to project-list 2026-01-28 15:00:28 -08:00
andrew-kline ae305250c0 fix: add pagination to team-list (#107)
team-list currently caps at 50 team responses. this adds pagination to
list all teams in the workspace.
2026-01-28 09:55:36 -08:00
Peter Schilling 908bae467f fix: error when --workspace flag specifies unknown workspace
Previously, --workspace would silently fall back to other credential
sources when the specified workspace wasn't found. Now it errors with
a helpful message suggesting `linear auth login` or `linear auth list`.

Also errors when both LINEAR_API_KEY env var and --workspace are set,
since these are conflicting ways to specify credentials.

Added error handling guidelines to CLAUDE.md to prevent silent failures.
2026-01-27 13:02:46 -08:00
Peter Schilling 1b4135ba59 feat: add file attachment support for issues and comments
- Add `issue attach` command to attach files to issues
- Add `--attach` flag on `issue comment add`
- Show attachments section in `issue view` with auto-download
- Add `attachment_dir` and `auto_download_attachments` config options
- Add network permission for storage.googleapis.com (upload destination)
2026-01-27 12:51:59 -08:00
Peter Schilling 01d92b706b add changelog entry 2026-01-27 10:29:56 -08:00
Temirlan ab13420293 Fix lookupUserId to handle 'self' keyword (#104)
## Problem

`--assignee self` fails with:
```
Could not determine user ID for assignee self
```

## Root Cause

The code in `issue-create.ts` uses `"self"` as the keyword for
auto-assigning to the current user (lines 184, 389, 648), but
`lookupUserId()` only checks for `"@me"`.

When `"self"` is passed, it falls through to the user search query which
looks for a user literally named "self" - which doesn't exist.

## Fix

Add `"self"` as an alias alongside `"@me"` in `lookupUserId()`:

```typescript
if (input === "@me" || input === "self") {
```

Now both `--assignee self` and `--assignee @me` work correctly.
2026-01-27 09:14:09 -08:00
Peter Schilling f633f5b6e3 feat: support multi-workspace auth in config command
When no LINEAR_API_KEY is set, the config command now uses stored
credentials. Single workspace is auto-selected; multiple workspaces
prompt the user to choose.
2026-01-26 14:17:44 -08:00
Peter Schilling df59898938 docs: add warning about new auth login command in README
Add a warning callout in the setup section noting that `linear auth login` is new and may have issues, with a link to the v1.8.1 README for stable setup instructions.
2026-01-23 14:37:31 -08:00
Peter Schilling 540818c0b1 feat: add multi-workspace authentication support
Add built-in credential storage for managing multiple Linear workspaces:
- ~/.config/linear/credentials.toml stores API keys by workspace slug
- auth login: add credentials (auto-detects workspace from API)
- auth logout: remove credentials
- auth list: show configured workspaces with org/user info  
- auth default: set the default workspace
- global -w/--workspace flag to target specific workspace

API key precedence: CLI flag > env var > config > workspace flag > project workspace > default
2026-01-23 14:28:45 -08:00
Paymahn Moghadasian 1f11e946ad fix: pass sort parameter to fetchIssuesForState (#96)
- Fixes a bug where `--sort` flag was ignored after interactive prompts
(like project selection)
- The sort option was validated in `issue-list.ts` but
`fetchIssuesForState` independently read sort from config only, causing
the CLI flag to be lost
2026-01-23 13:25:43 -08:00
Peter Schilling 2a49427f4f chore: Release linear-cli version 1.8.1 v1.8.1 2026-01-23 10:57:00 -08:00
Peter Schilling 88ecf1bd51 fix: sync deno permissions across config files
- Add public.linear.app to --allow-net in deno.json and dist-workspace.toml
- Add uploads.linear.app to dist-workspace.toml (was missing)
- Add XDG_CONFIG_HOME, HOME, APPDATA to dist-workspace.toml --allow-env
- Add --allow-sys=hostname to dist-workspace.toml
- Add permissions section to CLAUDE.md
- Add docs/deno-permissions.md documenting all permission locations
2026-01-23 10:54:38 -08:00
Peter Schilling 5bbbbc5bab fix changelog 2026-01-23 10:54:38 -08:00
Peter Schilling 72cc3634fb docs: add plugin update instructions and move why section to bottom 2026-01-22 12:10:37 -08:00
Peter Schilling 2dc1d14684 docs: add AI agent emphasis to README intro 2026-01-22 11:11:30 -08:00
Peter Schilling e1c95228db fix: link organization-features.md in skill template 2026-01-22 19:03:06 +00:00
Peter Schilling ca5407e3d0 chore: bump plugin version to 1.8.0 2026-01-22 10:59:21 -08:00
Peter Schilling 8a4688c3b9 chore: Release linear-cli version 1.8.0 v1.8.0 2026-01-22 10:58:20 -08:00
Peter Schilling 4d3a4bb2f1 feat: add auto-generated skill documentation from CLI help output 2026-01-22 10:56:33 -08:00
Peter Schilling c6c7086a0e Split up new organization features skill doc 2026-01-22 10:56:33 -08:00
Peter Schilling cf770acf9d test: remove non-deterministic snapshot tests
Remove tests with inherently non-deterministic output:
- document-list: 3 tests displaying relative timestamps (e.g., '3 days ago')
- document-delete: 1 test with stack traces containing line numbers
- document-create: 1 test with stack traces containing machine-specific paths
- document-update: 2 tests with stack traces containing machine-specific paths
- document-view: 1 test with stack traces containing machine-specific paths

The fakeTime solution causes hangs with mock servers (known issue).
Stack traces contain machine-specific file paths that differ across environments.
2026-01-21 09:40:06 -08:00
Peter Schilling 507b536947 add changelog entries for initiative, label, and bulk operation support
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 09:40:06 -08:00
Peter Schilling b32381308a fix: add TTY checks before interactive prompts to prevent hanging in non-interactive mode
Commands with confirmation prompts now exit with a helpful error message
when stdin is not a TTY, directing users to use the appropriate flag
(--force, --yes, --confirm, or --team) instead of hanging forever.

Affected commands:
- initiative remove-project, archive, delete, unarchive
- document delete
- issue delete
- label delete
- team delete
- milestone delete
2026-01-21 09:40:06 -08:00
Sam Gbafa cd45a8a6aa Add initiative, label, and bulk operation support (#95)
This PR adds several major features to linear-cli:

- **Initiative management**: Full CRUD support for initiatives including
list, view, create, archive, unarchive, update, and delete commands
- **Initiative-project linking**: Commands to add and remove projects
from initiatives
- **Label management**: List, create, and delete commands for labels
with team filtering
- **Project creation**: New `project create` command with interactive
mode and initiative linking
- **Team deletion**: New `team delete` command with confirmation
- **Bulk operations**: New utility supporting bulk operations across
commands (issue delete now supports multiple IDs)

## New Commands

### Initiatives
- `linear initiative list` - List all initiatives with filtering options
- `linear initiative view <id>` - View initiative details including
linked projects
- `linear initiative create` - Create new initiative (interactive or via
flags)
- `linear initiative archive <id>` - Archive an initiative
- `linear initiative unarchive <id>` - Unarchive an initiative  
- `linear initiative update <id>` - Update initiative properties
- `linear initiative delete <id>` - Delete an initiative (with
confirmation)
- `linear initiative add-project` - Link a project to an initiative
- `linear initiative remove-project` - Remove project from initiative

### Labels
- `linear label list` - List labels with optional team filter
- `linear label create` - Create a new label
- `linear label delete <id>` - Delete a label

### Projects
- `linear project create` - Create a new project with team, lead, dates,
status, and optional initiative linking

### Teams
- `linear team delete <id>` - Delete a team (with confirmation)
2026-01-21 08:45:54 -08:00
Paymahn Moghadasian 3ceb8bdca8 feat: add --project filter to issue list command
Adds the ability to filter issues by project name when listing issues.
If the project name does not match exactly, it fuzzy-searches and prompts
the user to select from matching projects.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 08:54:24 -08:00
Peter Schilling 9a091bc022 add User-Agent header to GraphQL requests 2026-01-09 13:33:55 -08:00
Peter Schilling 6c37bc306f remove AGENTS.md and update CLAUDE.md 2026-01-09 13:30:09 -08:00