{"id":15563470,"url":"https://github.com/aspiers/linear-tools","last_synced_at":"2026-03-15T18:15:30.947Z","repository":{"id":66899559,"uuid":"567481346","full_name":"aspiers/linear-tools","owner":"aspiers","description":"linear CLI utility commands","archived":false,"fork":false,"pushed_at":"2024-09-05T11:17:08.000Z","size":774,"stargazers_count":6,"open_issues_count":5,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-25T12:07:25.211Z","etag":null,"topics":["dependency-graph","linear"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aspiers.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-17T22:09:54.000Z","updated_at":"2025-08-25T15:11:47.000Z","dependencies_parsed_at":"2023-11-16T13:35:22.501Z","dependency_job_id":"cd9d8fe7-26c5-401c-b0ce-be6f5ed92cb7","html_url":"https://github.com/aspiers/linear-tools","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aspiers/linear-tools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aspiers%2Flinear-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aspiers%2Flinear-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aspiers%2Flinear-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aspiers%2Flinear-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aspiers","download_url":"https://codeload.github.com/aspiers/linear-tools/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aspiers%2Flinear-tools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278259828,"owners_count":25957546,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dependency-graph","linear"],"created_at":"2024-10-02T16:22:57.832Z","updated_at":"2025-10-04T03:31:32.214Z","avatar_url":"https://github.com/aspiers.png","language":"TypeScript","readme":"# linear.app CLI utility tools\n\nThis is A CLI for [linear.app](https://linear.app) which uses the\nLinear API to add functionality missing from the official UI.\n\nCurrently only the following are supported:\n\n- plotting issue dependency graphs within a given project\n\n- helping \"demote\" / \"convert\" workspace labels back into team labels\n  (in reality this just creates corresponding team labels, switches\n  issues to use these, and then eventually the old labels can be\n  removed)\n\n**WARNING:** this is currently a quick and dirty hack; please\nconsider it an alpha release.  No tests have been written, and\nno guarantees are made about its reliability.  Proceed at your\nown risk.\n\nThat said, if you only use it to plot dependency graphs, it's only\n_reading_ data from the Linear API, not writing anything, so in\n_theory_ there should be no risk in trying it ... but equally no\nguarantee is offered.  Caveat emptor.\n\n## Installation\n\nYou will need [Node.js](https://nodejs.org/en/), at least version\n15.14.0 (for `String.prototype.replaceAll`).  This can be satisfied\nvia Homebrew, e.g.\n\n    brew install node@18\n\nor by first [installing `nvm`](https://nvm.sh) and then installing\nNode.js v16 or later:\n\n    nvm use 18\n\nFinally, install the various npm dependencies:\n\n    yarn install\n\n\nIf you want to use it to plot graphs, you will also need to install\n[Graphviz](https://graphviz.org/).  On MacOS, it should be simple\nusing [Homebrew](https://brew.sh/):\n\n    brew install graphviz\n\n## Usage\n\nFirst you need to get API key from Linear web UI and set it here:\n\n    export LINEAR_API_KEY=...\n\n### Plotting dependency graphs\n\nYou can simply generate graph in SVG format as follows:\n\n    yarn linear graph --project \"My Linear project\" --svg my-project.svg\n\nor in PNG format:\n\n    yarn linear graph --project \"My Linear project\" --png my-project.png\n\nThe `--project` value matches by substring, so as long as the substring\nmatches a single project, it will work.\n\nAdd the `--dupes` option to include duplicate issues in the graph:\n\n    yarn linear graph --project \"My Linear project\" --svg my-project.svg --dupes\n\nand/or completed / cancelled issues (you can combine options):\n\n    yarn linear graph --project \"My Linear project\" --svg my-project.svg --completed\n    yarn linear graph --project \"My Linear project\" --svg my-project.svg --cancelled\n\nUse `--hide-external` to exclude dependencies on issues outside the\nselected projects.\n\nYou can group issues into clusters according to their cycles:\n\n    yarn linear graph --project \"My Linear project\" --svg my-project.svg --cluster-by cycle\n\nor by project:\n\n    yarn linear graph --project \"project A\" \"project B\" --svg my-project.svg --cluster-by project\n\nOn Linux, you can also view images directly in a Window\n\n    yarn linear graph --project \"My Linear project\" \u003e my-project.dot\n    dot -Txlib my-project.dot\n\nYou can also specify `--project PROJ-SUBSTRING` multiple times to\ninclude issues from multiple projects in the same graph.  Issues will\nnot be shown twice even if they are related to more than one of the\nmatching projects.\n\n### Viewing the graphs\n\nIt's recommended to view the generated SVG file in your browser.\nThat way you can mouse hover over issues to see descriptions,\nand click on an issue to open it in Linear.\n\nThe fill color shows an issue state, and its border color reflects the\nissue's priority.  You can also see these in the first line of the\ntooltip on mouse-over.\n\nA double octagon border on an issue indicates that it was outside the\nlist of issues obtained by querying the specified project, and is only\non the graph because it had some kind of relationship with issues\nobtained from the query.\n\nIssues with `epic` in the title will be given a double circle shape.\n\n### Demoting workspace labels\n\n**PLEASE EXERCISE CAUTION:** Unlike the graphing command, this **changes**\ndata in your Linear workspace, and is only lightly tested.  It should be\nsafe, but make sure you check everything as you go.\n\nUsage is as follows:\n\n    yarn linear label demote 'Name of workspace label' 'Name of team to demote to'\n\nIt's idempotent so (at least in theory) you can run it multiple times.\n\nIt works in the following way:\n\n- If the workspace label to be demoted is part of a label group,\n  create a corresponding label group in the team (with a `(team name)`\n  suffix, since you can't have two labels with the same name, even\n  when they have different scopes).\n\n- Create a corresponding team label.  If the workspace label was part\n  of a workspace label group, make the new team label part of the\n  corresponding team label group.  Again this will have the same\n  `(team name)` suffix, for the same reasons.\n\n- Add all issues to the new team label, and remove from the old\n  workspace label.\n\n- Remove the old workspace label.\n\n- Rename the new team label to drop the suffix.\n\nNote that if the old workspace label was the last one remaining in a\nlabel group, the group won't be automatically deleted, which also\nprevents dropping the team name suffix from the new team label group.\nSo if you want those final bits of cleanup, you'll have to do them\nmanually.\n\nIn the future, these could be added to the automation by querying the\n`children` field on the workspace label group to check if there are\nany other labels remaining in the group, and if not, deleting the\ngroup and renaming the corresponding team label group.\n\n# License\n\nMIT - see LICENSE\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faspiers%2Flinear-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faspiers%2Flinear-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faspiers%2Flinear-tools/lists"}