Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
7b41178
fix: improve error message when config not found (#81)
Mar 12, 2026
e584e7e
feat: add default_project config option (#126)
Mar 12, 2026
30332c9
feat: add issue search command (#143)
Mar 12, 2026
dcfe4e6
feat: add cycle current and cycle add commands
Mar 12, 2026
a417ab7
docs: regenerate skill docs with cycle current/add commands
Mar 12, 2026
ea5655a
fix: correct GetIssueId query name in cycle-add test
Mar 12, 2026
6b33231
feat: add cycle remove command
Mar 12, 2026
5d3ddeb
feat: add issue move command
Mar 12, 2026
76bbe39
feat: add cycle next command
Mar 12, 2026
c797c2e
docs: regenerate skill docs with new commands
Mar 12, 2026
dbcef01
feat: add issue assign command
Mar 12, 2026
af0d6f7
feat: add issue label add/remove commands
Mar 12, 2026
49b94bb
feat: add cycle create command
Mar 12, 2026
f588d0e
docs: regenerate skill docs with all new commands
Mar 12, 2026
6364f2c
feat: add issue priority command
Mar 12, 2026
16d6d9c
feat: add issue estimate command
Mar 12, 2026
fdedf0d
docs: regenerate skill docs with priority and estimate commands
Mar 12, 2026
6119777
refactor: extract withSpinner utility
kyaukyuai Mar 12, 2026
f221ce7
style: format files for ci
kyaukyuai Mar 12, 2026
797f1f2
Merge pull request #1 from kyaukyuai/codex/kya-71-withspinner-utility…
kyaukyuai Mar 12, 2026
9ad3a05
refactor: extract resolveIssueInternalId helper
kyaukyuai Mar 13, 2026
41b83a6
Merge pull request #2 from kyaukyuai/codex/kya-72-resolveissueinterna…
kyaukyuai Mar 13, 2026
6dd9e26
refactor: deduplicate issue label setup
kyaukyuai Mar 13, 2026
7bd81a4
Merge pull request #3 from kyaukyuai/codex/kya-73-issue-label-dedupli…
kyaukyuai Mar 13, 2026
8988990
test: add issue command error path coverage
kyaukyuai Mar 13, 2026
afeffda
Merge pull request #4 from kyaukyuai/codex/kya-74-error-path-tests
kyaukyuai Mar 13, 2026
4ed1dd4
feat: add json output flags
kyaukyuai Mar 13, 2026
b9a9bd1
docs: regenerate skill references
kyaukyuai Mar 13, 2026
610e94d
Merge pull request #5 from kyaukyuai/codex/kya-75-json-output-flags
kyaukyuai Mar 13, 2026
cd55577
feat: support named issue priorities
kyaukyuai Mar 13, 2026
22e1a4f
Merge pull request #6 from kyaukyuai/codex/kya-76-issue-priority-name…
kyaukyuai Mar 13, 2026
59d654b
chore: rename package namespace
kyaukyuai Mar 13, 2026
5fe7958
ci: update generated release workflow
kyaukyuai Mar 13, 2026
c5c8ab4
Merge pull request #7 from kyaukyuai/codex/kya-77-package-namespace-r…
kyaukyuai Mar 13, 2026
a687091
chore: switch release recipe to git
kyaukyuai Mar 13, 2026
8870d6e
Merge pull request #8 from kyaukyuai/codex/kya-78-justfile-git-release
kyaukyuai Mar 13, 2026
9ddac80
docs: rewrite upstream references
kyaukyuai Mar 13, 2026
4bbfef8
Merge pull request #9 from kyaukyuai/codex/kya-79-upstream-reference-…
kyaukyuai Mar 13, 2026
f6285cf
ci: update checkout action versions
kyaukyuai Mar 13, 2026
c481267
Merge pull request #10 from kyaukyuai/codex/kya-82-ci-release-workflo…
kyaukyuai Mar 13, 2026
ec1d5b8
docs: summarize fork changes in changelog
kyaukyuai Mar 13, 2026
0229169
Merge pull request #11 from kyaukyuai/codex/kya-81-changelog-update
kyaukyuai Mar 13, 2026
a962495
docs: rewrite readme for fork
kyaukyuai Mar 13, 2026
d62f5ca
Merge pull request #12 from kyaukyuai/codex/kya-83-readme-rewrite
kyaukyuai Mar 13, 2026
9fcf6e0
docs: expand agent guidance for fork helpers
kyaukyuai Mar 13, 2026
f2de2be
Merge pull request #13 from kyaukyuai/codex/kya-84-agents-guide-expan…
kyaukyuai Mar 13, 2026
b3ba0d6
chore: Release linear-cli version 2.0.0
kyaukyuai Mar 13, 2026
0776341
ci: harden package publish workflows
kyaukyuai Mar 13, 2026
d3feaf1
ci: split npm publish from cargo-dist
kyaukyuai Mar 13, 2026
cfdd2c5
style: format publish workflow
kyaukyuai Mar 13, 2026
ad368af
Merge pull request #14 from kyaukyuai/codex/fix-release-publishing-wo…
kyaukyuai Mar 13, 2026
d3e5225
chore: Release linear-cli version 2.0.1
kyaukyuai Mar 13, 2026
3511e26
ci: fix npm release asset lookup
kyaukyuai Mar 13, 2026
aef780f
Merge pull request #15 from kyaukyuai/codex/fix-publish-npm-release-d…
kyaukyuai Mar 13, 2026
90d4c73
ci: publish npm after release succeeds
kyaukyuai Mar 13, 2026
6b2926c
Merge pull request #16 from kyaukyuai/codex/kya-87-publish-npm-withou…
kyaukyuai Mar 13, 2026
a1f93e2
ci: avoid node20-only github actions
kyaukyuai Mar 13, 2026
47342ff
Merge pull request #17 from kyaukyuai/codex/kya-88-node24-actions
kyaukyuai Mar 13, 2026
40cdf28
docs: add release operations runbook
kyaukyuai Mar 13, 2026
c5bb2a2
Merge pull request #18 from kyaukyuai/codex/kya-89-release-runbook
kyaukyuai Mar 13, 2026
1ab7e95
fix: deprecate issue search command
kyaukyuai Mar 13, 2026
df6b9ba
docs: regenerate skill references
kyaukyuai Mar 13, 2026
be4701a
Merge pull request #19 from kyaukyuai/codex/kya-90-issue-search-searc…
kyaukyuai Mar 13, 2026
dae17ab
feat: add notification commands
kyaukyuai Mar 13, 2026
0e2cd9f
Merge pull request #20 from kyaukyuai/codex/kya-91-notification-commands
kyaukyuai Mar 13, 2026
cae6fea
feat: add webhook commands
kyaukyuai Mar 13, 2026
32dfe30
Merge pull request #21 from kyaukyuai/codex/kya-92-webhook-commands
kyaukyuai Mar 13, 2026
1c4a4fb
chore: Release linear-cli version 2.1.0
kyaukyuai Mar 13, 2026
0e75e14
ci: fix npm publish tarball path
kyaukyuai Mar 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "linear-cli",
"owner": {
"name": "schpet"
"name": "kyaukyuai"
},
"description": "marketplace for linear-cli claude code plugin",
"version": "1.9.1",
Expand All @@ -11,9 +11,9 @@
"description": "skill for using the linear-cli to manage Linear issues",
"version": "1.9.1",
"author": {
"name": "schpet"
"name": "kyaukyuai"
},
"homepage": "https://github.com/schpet/linear-cli",
"homepage": "https://github.com/kyaukyuai/linear-cli",
"source": "./",
"skills": [
"./skills/linear-cli"
Expand Down
4 changes: 2 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
"description": "Manage Linear issues from the command line",
"version": "1.9.1",
"author": {
"name": "schpet"
"name": "kyaukyuai"
},
"homepage": "https://github.com/schpet/linear-cli",
"homepage": "https://github.com/kyaukyuai/linear-cli",
"skills": [
"./skills/linear-cli"
]
Expand Down
29 changes: 29 additions & 0 deletions .github/actions/setup-deno/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Setup Deno
description: Install Deno without relying on a Node-based GitHub Action runtime.
inputs:
deno-version:
description: The Deno version to install.
default: "2.7.5"
runs:
using: composite
steps:
- name: Install Deno (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
set -euo pipefail
curl -fsSL https://deno.land/install.sh | sh -s -- "v${{ inputs.deno-version }}"
echo "$HOME/.deno/bin" >> "$GITHUB_PATH"

- name: Install Deno (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$v = "${{ inputs.deno-version }}"
irm https://deno.land/install.ps1 | iex
"$env:USERPROFILE\\.deno\\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

- name: Verify Deno installation
shell: bash
run: deno --version
6 changes: 2 additions & 4 deletions .github/build-setup.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
- name: Setup deno
uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- name: Setup Deno
uses: ./.github/actions/setup-deno
- name: Generate GraphQL code
run: deno task codegen
12 changes: 4 additions & 8 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@ jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v6

- uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- uses: ./.github/actions/setup-deno

- name: Generate GraphQL code
run: deno task codegen
Expand Down Expand Up @@ -53,11 +51,9 @@ jobs:
- os: windows-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v6

- uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- uses: ./.github/actions/setup-deno

- name: Set up Secret Service
if: runner.os == 'Linux'
Expand Down
77 changes: 71 additions & 6 deletions .github/workflows/publish.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,83 @@ on:
push:
tags:
- "v*"
workflow_run:
workflows:
- "Release"
types:
- completed

jobs:
publish:
publish-jsr:
if: ${{ github.event_name == 'push' }}
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write # The OIDC ID token is used for authentication with JSR.
steps:
- uses: actions/checkout@v4
- uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- uses: actions/checkout@v6
- uses: ./.github/actions/setup-deno
- name: Generate GraphQL code
run: deno task codegen
- run: npx jsr publish
- name: Check whether this version already exists on JSR
id: jsr-version
run: |
NAME=$(jq -r '.name' deno.json)
VERSION=$(jq -r '.version' deno.json)
if curl -fsSL "https://jsr.io/${NAME}/meta.json" | jq -e --arg version "$VERSION" '.versions[$version]' >/dev/null; then
echo "published=true" >> "$GITHUB_OUTPUT"
else
echo "published=false" >> "$GITHUB_OUTPUT"
fi
- if: steps.jsr-version.outputs.published == 'true'
run: echo "JSR package version already published; skipping"
- if: steps.jsr-version.outputs.published != 'true'
run: npx jsr publish

publish-npm:
if: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'push' && startsWith(github.event.workflow_run.head_branch, 'v') }}
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- name: Download npm release artifact
id: npm-artifact
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
TAG_NAME: ${{ github.event.workflow_run.head_branch }}
run: |
ARTIFACT_PATH=./npm/linear-npm-package.tar.gz
mkdir -p npm
if ! gh release download "${TAG_NAME}" -R "${GH_REPO}" -p "linear-npm-package.tar.gz" -D npm --clobber; then
echo "Failed to download linear-npm-package.tar.gz from release ${TAG_NAME} in ${GH_REPO}" >&2
echo "Available release assets:" >&2
gh release view "${TAG_NAME}" -R "${GH_REPO}" --json assets --jq '.assets[].name' >&2 || true
exit 1
fi
echo "path=$ARTIFACT_PATH" >> "$GITHUB_OUTPUT"
- name: Read npm package metadata
id: npm-package
run: |
NAME=$(tar -xOf "${{ steps.npm-artifact.outputs.path }}" package/package.json | jq -r '.name')
VERSION=$(tar -xOf "${{ steps.npm-artifact.outputs.path }}" package/package.json | jq -r '.version')
echo "name=$NAME" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
- name: Check whether this version already exists on npm
id: npm-version
run: |
if npm view "${{ steps.npm-package.outputs.name }}@${{ steps.npm-package.outputs.version }}" version >/dev/null 2>&1; then
echo "published=true" >> "$GITHUB_OUTPUT"
else
echo "published=false" >> "$GITHUB_OUTPUT"
fi
- uses: actions/setup-node@v6
if: steps.npm-version.outputs.published != 'true'
with:
node-version: "20.x"
registry-url: "https://registry.npmjs.org"
- if: steps.npm-version.outputs.published == 'true'
run: echo "${{ steps.npm-package.outputs.name }}@${{ steps.npm-package.outputs.version }} is already published; skipping"
- if: steps.npm-version.outputs.published != 'true'
run: npm publish --access public --provenance "${{ steps.npm-artifact.outputs.path }}"
39 changes: 4 additions & 35 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,8 @@ jobs:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
fi
- name: "Setup deno"
uses: "denoland/setup-deno@v2"
with:
"deno-version": "v2.x"
- name: "Setup Deno"
uses: "./.github/actions/setup-deno"
- name: "Generate GraphQL code"
run: "deno task codegen"
- name: Install dist
Expand Down Expand Up @@ -299,7 +297,7 @@ jobs:
- uses: actions/checkout@v6
with:
persist-credentials: true
repository: "schpet/homebrew-tap"
repository: "kyaukyuai/homebrew-tap"
token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
# So we have access to the formula
- name: Fetch homebrew formulae
Expand Down Expand Up @@ -330,44 +328,15 @@ jobs:
done
git push
publish-npm:
needs:
- plan
- host
runs-on: "ubuntu-22.04"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PLAN: ${{ needs.plan.outputs.val }}
if: ${{ !fromJson(needs.plan.outputs.val).announcement_is_prerelease || fromJson(needs.plan.outputs.val).publish_prereleases }}
steps:
- name: Fetch npm packages
uses: actions/download-artifact@v7
with:
pattern: artifacts-*
path: npm/
merge-multiple: true
- uses: actions/setup-node@v6
with:
node-version: '20.x'
registry-url: 'https://registry.npmjs.org'
- run: |
for release in $(echo "$PLAN" | jq --compact-output '.releases[] | select([.artifacts[] | endswith("-npm-package.tar.gz")] | any)'); do
pkg=$(echo "$release" | jq '.artifacts[] | select(endswith("-npm-package.tar.gz"))' --raw-output)
npm publish --access public "./npm/${pkg}"
done
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
announce:
needs:
- plan
- host
- publish-homebrew-formula
- publish-npm
# use "always() && ..." to allow us to wait for all publish jobs while
# still allowing individual publish jobs to skip themselves (for prereleases).
# "host" however must run to completion, no skipping allowed!
if: ${{ always() && needs.host.result == 'success' && (needs.publish-homebrew-formula.result == 'skipped' || needs.publish-homebrew-formula.result == 'success') && (needs.publish-npm.result == 'skipped' || needs.publish-npm.result == 'success') }}
if: ${{ always() && needs.host.result == 'success' && (needs.publish-homebrew-formula.result == 'skipped' || needs.publish-homebrew-formula.result == 'success') }}
runs-on: "ubuntu-22.04"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
12 changes: 12 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,18 @@
- wrap command actions in try-catch with `handleError(error, "Failed to <action>")`
- errors display clean messages to stderr with ✗ prefix, stack traces only shown when `LINEAR_DEBUG=1`

## fork conventions

- prefer shared helpers over re-implementing command boilerplate in fork-specific commands
- for single request/response command actions, use `withSpinner()` from `src/utils/spinner.ts` instead of manually creating and stopping a spinner
- if a command also supports `--json`, usually call `withSpinner(..., { enabled: !json })` so machine-readable output is not mixed with spinner rendering
- when a command accepts an issue reference from the user, prefer `resolveIssueInternalId()` from `src/utils/linear.ts` instead of open-coding `getIssueIdentifier()` + `getIssueId()`
- use `resolveIssueInternalId()` when you want user-facing `ValidationError` / `NotFoundError` behaviour for invalid or unknown issue ids; only drop down to lower-level helpers when the command genuinely needs the formatted issue identifier itself
- keep helper usage visible in new command code. a good default is:
- resolve ids up front
- execute the GraphQL request inside `withSpinner()`
- return JSON early before interactive or styled terminal output

## tests

- tests on commands should mirror the directory structure of the src, e.g.
Expand Down
51 changes: 50 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,52 @@

## [Unreleased]

## [2.1.0] - 2026-03-13

### Added

- added inbox notification commands for `list`, `count`, `read`, and `archive`, including `--json` output for scripting
- added webhook commands for `list`, `view`, `create`, `update`, and `delete` with team-scoped and all-public-team support

### Changed

- deprecated `issue search`; it now exits with guidance to use `issue list`, `issue list --json`, or `api` instead of the removed search endpoint

### Improved

- hardened release automation by splitting npm publish from cargo-dist release flow, skipping already-published npm/JSR versions, removing npm release-asset polling, and updating GitHub Actions for the Node 24 transition
- added a release runbook for verification, recovery steps, and manual publish fallback

## [2.0.1] - 2026-03-13

### Improved

- refined package metadata and publishing provenance for the forked JSR distribution

## [2.0.0] - 2026-03-13

> First fork release of `kyaukyuai/linear-cli`.

### Added (fork-specific features)

- expanded Linear coverage with cycle, milestone, document, initiative, project update/delete, issue relation, issue attachment, issue comment delete, and raw GraphQL/schema commands
- added workflow commands for `issue search`, `issue assign`, `issue move`, `issue priority`, `issue estimate`, and `issue label add/remove`
- added workspace-aware authentication and credential management, including `auth login/logout/list/default/token/whoami/migrate`, system keyring support, and `--workspace`
- added scriptable output modes across forked commands, including JSON output for project, document, issue, and cycle workflows
- added agent-oriented assets and distribution channels, including the Claude Code skill plugin, generated skill docs, npm publishing, and the `kyaukyuai/homebrew-tap` release target

### Changed

- rebranded the fork to `kyaukyuai/linear-cli`, including package scope `@kyaukyuai/linear-cli`, release infrastructure, install instructions, and marketplace references
- standardized release and maintainer workflows around git-based automation while preserving runtime support for both git and jj in the CLI itself
- updated configuration and install flows to better support multi-workspace use, project/global config merging, and package-manager based execution

### Improved

- improved CLI reliability with structured validation errors, better auth/config guidance, safer non-TTY spinner handling, and stronger error-path test coverage
- improved terminal UX with pager support, richer issue/project/document rendering, relative-time fixes, local image and attachment handling, and more JSON-first scripting paths
- improved internal maintainability with shared helpers such as `withSpinner()`, `resolveIssueInternalId()`, label setup deduplication, deterministic snapshots, and synchronized generated docs/workflows

## [1.11.1] - 2026-03-06

### Added
Expand Down Expand Up @@ -410,7 +456,10 @@
- adds a -t, --title flag to the `issue pr` command, allowing you to provide a PR title that is different than linear's issue title
- allows linear issue identifiers to be passed in as arguments to the issue commands as an alternative to parsing the branch name, e.g. `linear issue show ABC-123`

[Unreleased]: https://github.com/schpet/linear-cli/compare/v1.11.1...HEAD
[Unreleased]: https://github.com/kyaukyuai/linear-cli/compare/v2.1.0...HEAD
[2.1.0]: https://github.com/kyaukyuai/linear-cli/compare/v2.0.1...v2.1.0
[2.0.1]: https://github.com/kyaukyuai/linear-cli/compare/v2.0.0...v2.0.1
[2.0.0]: https://github.com/kyaukyuai/linear-cli/compare/v1.11.1...v2.0.0
[1.11.1]: https://github.com/schpet/linear-cli/compare/v1.11.0...v1.11.1
[1.11.0]: https://github.com/schpet/linear-cli/compare/v1.10.0...v1.11.0
[1.10.0]: https://github.com/schpet/linear-cli/compare/v1.9.1...v1.10.0
Expand Down
Loading