linear-app 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,23 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "WebFetch(domain:studio.apollographql.com)",
5
+ "WebSearch",
6
+ "WebFetch(domain:raw.githubusercontent.com)",
7
+ "Bash(source:*)",
8
+ "Bash(linear users --help:*)",
9
+ "Bash(linear users list:*)",
10
+ "Bash(linear labels list:*)",
11
+ "WebFetch(domain:github.com)",
12
+ "Bash(uv run python:*)",
13
+ "WebFetch(domain:docs.astral.sh)",
14
+ "Bash(make:*)",
15
+ "WebFetch(domain:packaging.python.org)",
16
+ "WebFetch(domain:pypi.org)",
17
+ "Bash(curl:*)",
18
+ "Bash(python3:*)"
19
+ ],
20
+ "deny": [],
21
+ "ask": []
22
+ }
23
+ }
@@ -0,0 +1,19 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.pyc
6
+
7
+ # Virtual environments
8
+ .venv/
9
+ venv/
10
+ ENV/
11
+ env/
12
+
13
+ # Distribution / packaging
14
+ build/
15
+ dist/
16
+ *.egg-info/
17
+
18
+ # uv
19
+ uv.lock
@@ -0,0 +1,26 @@
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ # Run the linter
5
+ - id: ruff
6
+ name: ruff
7
+ entry: uv run ruff check --fix
8
+ language: system
9
+ types: [python]
10
+ require_serial: true
11
+
12
+ # Run the formatter
13
+ - id: ruff-format
14
+ name: ruff-format
15
+ entry: uv run ruff format
16
+ language: system
17
+ types: [python]
18
+ require_serial: true
19
+
20
+ # Run the type checker
21
+ - id: ty
22
+ name: ty
23
+ entry: uv run ty check
24
+ language: system
25
+ types: [python]
26
+ pass_filenames: false
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,93 @@
1
+ .PHONY: help install format lint ty check build publish test clean pre-commit ruff
2
+
3
+ help:
4
+ @echo "Linear CLI - Development Commands"
5
+ @echo ""
6
+ @echo "Available targets:"
7
+ @echo " install Install dependencies (including dev dependencies)"
8
+ @echo " format Format code with ruff"
9
+ @echo " lint Run ruff linter with auto-fix"
10
+ @echo " ty Run ty type checker"
11
+ @echo " check Run all checks (format, lint, ty)"
12
+ @echo " build Build distributions (wheel + sdist)"
13
+ @echo " publish Complete release: check, build, publish, tag"
14
+ @echo " test Run tests (placeholder)"
15
+ @echo " clean Remove cache and build artifacts"
16
+ @echo " pre-commit Install pre-commit hooks"
17
+ @echo " ruff Alias for format (legacy)"
18
+
19
+ install:
20
+ uv sync --dev
21
+
22
+ format:
23
+ uv run ruff format src/
24
+
25
+ lint:
26
+ uv run ruff check --fix src/
27
+
28
+ ty:
29
+ uv run ty check
30
+
31
+ check: format lint ty
32
+ @echo "✓ All checks passed"
33
+
34
+ test:
35
+ @echo "No tests configured yet"
36
+
37
+ clean:
38
+ rm -rf .venv
39
+ rm -rf build dist *.egg-info
40
+ find . -type d -name __pycache__ -exec rm -rf {} +
41
+ find . -type f -name "*.pyc" -delete
42
+
43
+ pre-commit:
44
+ uv run pre-commit install
45
+ @echo "✓ Pre-commit hooks installed"
46
+
47
+ ruff: format
48
+
49
+ build:
50
+ @echo "Building distributions..."
51
+ @rm -rf dist/
52
+ @uv build
53
+ @echo "Built distributions:"
54
+ @ls -lh dist/
55
+
56
+ publish: check
57
+ @echo ""
58
+ @echo "========================================"
59
+ @echo "Publishing Linear CLI to PyPI"
60
+ @echo "========================================"
61
+ @VERSION=$$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/'); \
62
+ echo "Version: $$VERSION"; \
63
+ echo ""; \
64
+ echo "Checking git status..."; \
65
+ if [ -n "$$(git status --porcelain)" ]; then \
66
+ echo "Error: Working directory has uncommitted changes"; \
67
+ exit 1; \
68
+ fi; \
69
+ echo "✓ Git working directory is clean"; \
70
+ echo ""; \
71
+ echo "Building distributions..."; \
72
+ rm -rf dist/; \
73
+ uv build; \
74
+ echo ""; \
75
+ echo "Built distributions:"; \
76
+ ls -lh dist/; \
77
+ echo ""; \
78
+ read -p "Publish version $$VERSION to PyPI? (y/n) " -n 1 -r; \
79
+ echo ""; \
80
+ if [ "$$REPLY" = "y" ] || [ "$$REPLY" = "Y" ]; then \
81
+ echo "Publishing to PyPI..."; \
82
+ uv publish; \
83
+ echo ""; \
84
+ echo "Creating and pushing git tag..."; \
85
+ git tag "release-$$VERSION"; \
86
+ git push origin "release-$$VERSION"; \
87
+ echo ""; \
88
+ echo "✓ Release $$VERSION completed successfully!"; \
89
+ echo "View at: https://pypi.org/project/linear-app/$$VERSION/"; \
90
+ else \
91
+ echo "Publish cancelled"; \
92
+ exit 1; \
93
+ fi
@@ -0,0 +1,249 @@
1
+ Metadata-Version: 2.4
2
+ Name: linear-app
3
+ Version: 0.0.1
4
+ Summary: Add your description here
5
+ Requires-Python: >=3.13
6
+ Requires-Dist: httpx>=0.28.0
7
+ Requires-Dist: rich>=13.0.0
8
+ Requires-Dist: typer>=0.15.0
9
+ Description-Content-Type: text/markdown
10
+
11
+ <img width="1400" height="225" alt="linear-cli-header" src="https://github.com/user-attachments/assets/ce620de7-718d-4205-b4a0-bb287dc910a4" />
12
+
13
+ # Linear CLI
14
+
15
+ A command-line interface for interacting with [Linear](https://linear.app) - list issues, view project details, and manage your workflow from the terminal.
16
+
17
+ ## Authentication
18
+
19
+ Set your Linear API key as an environment variable:
20
+
21
+ ```bash
22
+ export LINEAR_API_KEY="<linear-api-key>"
23
+ ```
24
+
25
+ Get your API key at: https://linear.app/settings/api
26
+
27
+ ## Available Commands
28
+
29
+ ### Issues
30
+
31
+ ```bash
32
+ # List issues with filters
33
+ linear issues list [OPTIONS]
34
+
35
+ # View details of a specific issue
36
+ linear issues view <issue-id> [OPTIONS]
37
+
38
+ # Search issues by title
39
+ linear issues search <query> [OPTIONS]
40
+
41
+ # Create a new issue (interactive if no title provided)
42
+ linear issues create [title] [OPTIONS]
43
+ ```
44
+
45
+ **List options:**
46
+ - `--assignee <email>` - Filter by assignee (use "me" or "self" for yourself)
47
+ - `--status <status>` - Filter by status (e.g., "in progress", "done")
48
+ - `--priority <0-4>` - Filter by priority
49
+ - `--team <team>` - Filter by team name or key
50
+ - `--project <name>` - Filter by project name
51
+ - `--label <label>` - Filter by label (repeatable)
52
+ - `--limit <n>` - Number of results (default: 50)
53
+ - `--sort <field>` - Sort results
54
+ - `--format <format>` - Output format: `table` (default), `json`
55
+
56
+ **View options:**
57
+ - `--web/-w` - Open issue in browser
58
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
59
+
60
+ **Search options:**
61
+ - `--limit <n>` - Number of results (default: 50)
62
+ - `--sort <field>` - Sort results
63
+ - `--format/-f <format>` - Output format: `table` (default), `json`
64
+
65
+ **Create options:**
66
+ - `--team/-t <team>` - Team key (e.g., "ENG")
67
+ - `--description/-d <text>` - Issue description
68
+ - `--assignee/-a <email>` - Assign to user
69
+ - `--priority/-p <0-4>` - Priority level
70
+ - `--project <name>` - Project name
71
+ - `--label/-l <label>` - Add label (repeatable)
72
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
73
+
74
+ ### Projects
75
+
76
+ ```bash
77
+ # List projects
78
+ linear projects list [OPTIONS]
79
+
80
+ # View details of a specific project
81
+ linear projects view <project-id> [OPTIONS]
82
+ ```
83
+
84
+ **List options:**
85
+ - `--state <state>` - Filter by state (planned, started, paused, completed, canceled)
86
+ - `--team <team>` - Filter by team name or key
87
+ - `--limit <n>` - Number of results (default: 50)
88
+ - `--include-archived` - Include archived projects
89
+ - `--format/-f <format>` - Output format: `table` (default), `json`
90
+
91
+ **View options:**
92
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
93
+
94
+ ### Teams
95
+
96
+ ```bash
97
+ # List all teams
98
+ linear teams list [OPTIONS]
99
+
100
+ # View details of a specific team
101
+ linear teams view <team-id> [OPTIONS]
102
+ ```
103
+
104
+ **List options:**
105
+ - `--limit <n>` - Number of results (default: 50)
106
+ - `--include-archived` - Include archived teams
107
+ - `--format/-f <format>` - Output format: `table` (default), `json`
108
+
109
+ **View options:**
110
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
111
+
112
+ Note: Team ID can be a team key (e.g., "ENG") or team ID.
113
+
114
+ ### Cycles
115
+
116
+ ```bash
117
+ # List cycles
118
+ linear cycles list [OPTIONS]
119
+
120
+ # View details of a specific cycle
121
+ linear cycles view <cycle-id> [OPTIONS]
122
+ ```
123
+
124
+ **List options:**
125
+ - `--team/-t <team>` - Filter by team name or key
126
+ - `--active/-a` - Show only active cycles
127
+ - `--future` - Show only future cycles
128
+ - `--past` - Show only past cycles
129
+ - `--limit/-l <n>` - Number of results (default: 50)
130
+ - `--include-archived` - Include archived cycles
131
+ - `--format/-f <format>` - Output format: `table` (default), `json`
132
+
133
+ **View options:**
134
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
135
+
136
+ ### Users
137
+
138
+ ```bash
139
+ # List workspace users
140
+ linear users list [OPTIONS]
141
+
142
+ # View details of a specific user
143
+ linear users view <user-id> [OPTIONS]
144
+ ```
145
+
146
+ **List options:**
147
+ - `--active-only` - Show only active users (default: true)
148
+ - `--include-disabled` - Include disabled users
149
+ - `--limit/-l <n>` - Number of results (default: 50)
150
+ - `--format/-f <format>` - Output format: `table` (default), `json`
151
+
152
+ **View options:**
153
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
154
+
155
+ Note: User ID can be an email address or user ID.
156
+
157
+ ### Labels
158
+
159
+ ```bash
160
+ # List issue labels
161
+ linear labels list [OPTIONS]
162
+ ```
163
+
164
+ **List options:**
165
+ - `--team/-t <team>` - Filter by team ID or key
166
+ - `--limit/-l <n>` - Number of results (default: 50)
167
+ - `--include-archived` - Include archived labels
168
+ - `--format/-f <format>` - Output format: `table` (default), `json`
169
+
170
+ ### Common Patterns
171
+
172
+ **Command Aliases:**
173
+ You can use short aliases for all command groups:
174
+ - `linear i` instead of `linear issues`
175
+ - `linear p` instead of `linear projects`
176
+ - `linear t` instead of `linear teams`
177
+ - `linear c` instead of `linear cycles`
178
+ - `linear u` instead of `linear users`
179
+ - `linear l` instead of `linear labels`
180
+
181
+ **Output Formats:**
182
+ - `table` - Human-readable table format (default for list commands)
183
+ - `json` - JSON output for scripting and automation
184
+ - `detail` - Detailed view (default for view commands)
185
+
186
+ **Common Flags:**
187
+ - Most list commands support `--limit` to control result count
188
+ - Most list commands support `--include-archived` to show archived items
189
+ - All commands support `--format/-f` to change output format
190
+
191
+ ## Development
192
+
193
+ ### Pre-commit Hooks
194
+
195
+ This project uses [pre-commit](https://pre-commit.com/) to run code quality checks before commits. All hooks use `uv run` to execute tools from the project's virtual environment:
196
+ - `ruff check --fix` for linting
197
+ - `ruff format` for code formatting
198
+ - `ty check` for type checking
199
+
200
+ **Setup:**
201
+
202
+ ```bash
203
+ # Install dev dependencies (includes pre-commit, ruff, and ty)
204
+ uv sync --dev
205
+
206
+ # Install the pre-commit hooks
207
+ uv run pre-commit install
208
+ ```
209
+
210
+ **Manual run:**
211
+
212
+ ```bash
213
+ # Run on all files
214
+ uv run pre-commit run --all-files
215
+
216
+ # Run on staged files only
217
+ uv run pre-commit run
218
+ ```
219
+
220
+ The hooks will automatically run when you commit changes. If any issues are found and auto-fixed, you'll need to stage the fixes and commit again.
221
+
222
+ ## Releases
223
+
224
+ ### Setup
225
+
226
+ 1. Generate PyPI API token at https://pypi.org/manage/account/token/
227
+ 2. Set the environment variable:
228
+ ```bash
229
+ export UV_PUBLISH_TOKEN="pypi-..."
230
+ ```
231
+
232
+ ### Release Process
233
+
234
+ 1. **Update version in pyproject.toml**
235
+ ```bash
236
+ vim pyproject.toml # Change version = "X.Y.Z"
237
+ ```
238
+
239
+ 2. **Commit version bump**
240
+ ```bash
241
+ git add pyproject.toml
242
+ git commit -m "Bump version to X.Y.Z"
243
+ git push origin main
244
+ ```
245
+
246
+ 3. **Publish to PyPI**
247
+ ```bash
248
+ make publish
249
+ ```
@@ -0,0 +1,239 @@
1
+ <img width="1400" height="225" alt="linear-cli-header" src="https://github.com/user-attachments/assets/ce620de7-718d-4205-b4a0-bb287dc910a4" />
2
+
3
+ # Linear CLI
4
+
5
+ A command-line interface for interacting with [Linear](https://linear.app) - list issues, view project details, and manage your workflow from the terminal.
6
+
7
+ ## Authentication
8
+
9
+ Set your Linear API key as an environment variable:
10
+
11
+ ```bash
12
+ export LINEAR_API_KEY="<linear-api-key>"
13
+ ```
14
+
15
+ Get your API key at: https://linear.app/settings/api
16
+
17
+ ## Available Commands
18
+
19
+ ### Issues
20
+
21
+ ```bash
22
+ # List issues with filters
23
+ linear issues list [OPTIONS]
24
+
25
+ # View details of a specific issue
26
+ linear issues view <issue-id> [OPTIONS]
27
+
28
+ # Search issues by title
29
+ linear issues search <query> [OPTIONS]
30
+
31
+ # Create a new issue (interactive if no title provided)
32
+ linear issues create [title] [OPTIONS]
33
+ ```
34
+
35
+ **List options:**
36
+ - `--assignee <email>` - Filter by assignee (use "me" or "self" for yourself)
37
+ - `--status <status>` - Filter by status (e.g., "in progress", "done")
38
+ - `--priority <0-4>` - Filter by priority
39
+ - `--team <team>` - Filter by team name or key
40
+ - `--project <name>` - Filter by project name
41
+ - `--label <label>` - Filter by label (repeatable)
42
+ - `--limit <n>` - Number of results (default: 50)
43
+ - `--sort <field>` - Sort results
44
+ - `--format <format>` - Output format: `table` (default), `json`
45
+
46
+ **View options:**
47
+ - `--web/-w` - Open issue in browser
48
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
49
+
50
+ **Search options:**
51
+ - `--limit <n>` - Number of results (default: 50)
52
+ - `--sort <field>` - Sort results
53
+ - `--format/-f <format>` - Output format: `table` (default), `json`
54
+
55
+ **Create options:**
56
+ - `--team/-t <team>` - Team key (e.g., "ENG")
57
+ - `--description/-d <text>` - Issue description
58
+ - `--assignee/-a <email>` - Assign to user
59
+ - `--priority/-p <0-4>` - Priority level
60
+ - `--project <name>` - Project name
61
+ - `--label/-l <label>` - Add label (repeatable)
62
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
63
+
64
+ ### Projects
65
+
66
+ ```bash
67
+ # List projects
68
+ linear projects list [OPTIONS]
69
+
70
+ # View details of a specific project
71
+ linear projects view <project-id> [OPTIONS]
72
+ ```
73
+
74
+ **List options:**
75
+ - `--state <state>` - Filter by state (planned, started, paused, completed, canceled)
76
+ - `--team <team>` - Filter by team name or key
77
+ - `--limit <n>` - Number of results (default: 50)
78
+ - `--include-archived` - Include archived projects
79
+ - `--format/-f <format>` - Output format: `table` (default), `json`
80
+
81
+ **View options:**
82
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
83
+
84
+ ### Teams
85
+
86
+ ```bash
87
+ # List all teams
88
+ linear teams list [OPTIONS]
89
+
90
+ # View details of a specific team
91
+ linear teams view <team-id> [OPTIONS]
92
+ ```
93
+
94
+ **List options:**
95
+ - `--limit <n>` - Number of results (default: 50)
96
+ - `--include-archived` - Include archived teams
97
+ - `--format/-f <format>` - Output format: `table` (default), `json`
98
+
99
+ **View options:**
100
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
101
+
102
+ Note: Team ID can be a team key (e.g., "ENG") or team ID.
103
+
104
+ ### Cycles
105
+
106
+ ```bash
107
+ # List cycles
108
+ linear cycles list [OPTIONS]
109
+
110
+ # View details of a specific cycle
111
+ linear cycles view <cycle-id> [OPTIONS]
112
+ ```
113
+
114
+ **List options:**
115
+ - `--team/-t <team>` - Filter by team name or key
116
+ - `--active/-a` - Show only active cycles
117
+ - `--future` - Show only future cycles
118
+ - `--past` - Show only past cycles
119
+ - `--limit/-l <n>` - Number of results (default: 50)
120
+ - `--include-archived` - Include archived cycles
121
+ - `--format/-f <format>` - Output format: `table` (default), `json`
122
+
123
+ **View options:**
124
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
125
+
126
+ ### Users
127
+
128
+ ```bash
129
+ # List workspace users
130
+ linear users list [OPTIONS]
131
+
132
+ # View details of a specific user
133
+ linear users view <user-id> [OPTIONS]
134
+ ```
135
+
136
+ **List options:**
137
+ - `--active-only` - Show only active users (default: true)
138
+ - `--include-disabled` - Include disabled users
139
+ - `--limit/-l <n>` - Number of results (default: 50)
140
+ - `--format/-f <format>` - Output format: `table` (default), `json`
141
+
142
+ **View options:**
143
+ - `--format/-f <format>` - Output format: `detail` (default), `json`
144
+
145
+ Note: User ID can be an email address or user ID.
146
+
147
+ ### Labels
148
+
149
+ ```bash
150
+ # List issue labels
151
+ linear labels list [OPTIONS]
152
+ ```
153
+
154
+ **List options:**
155
+ - `--team/-t <team>` - Filter by team ID or key
156
+ - `--limit/-l <n>` - Number of results (default: 50)
157
+ - `--include-archived` - Include archived labels
158
+ - `--format/-f <format>` - Output format: `table` (default), `json`
159
+
160
+ ### Common Patterns
161
+
162
+ **Command Aliases:**
163
+ You can use short aliases for all command groups:
164
+ - `linear i` instead of `linear issues`
165
+ - `linear p` instead of `linear projects`
166
+ - `linear t` instead of `linear teams`
167
+ - `linear c` instead of `linear cycles`
168
+ - `linear u` instead of `linear users`
169
+ - `linear l` instead of `linear labels`
170
+
171
+ **Output Formats:**
172
+ - `table` - Human-readable table format (default for list commands)
173
+ - `json` - JSON output for scripting and automation
174
+ - `detail` - Detailed view (default for view commands)
175
+
176
+ **Common Flags:**
177
+ - Most list commands support `--limit` to control result count
178
+ - Most list commands support `--include-archived` to show archived items
179
+ - All commands support `--format/-f` to change output format
180
+
181
+ ## Development
182
+
183
+ ### Pre-commit Hooks
184
+
185
+ This project uses [pre-commit](https://pre-commit.com/) to run code quality checks before commits. All hooks use `uv run` to execute tools from the project's virtual environment:
186
+ - `ruff check --fix` for linting
187
+ - `ruff format` for code formatting
188
+ - `ty check` for type checking
189
+
190
+ **Setup:**
191
+
192
+ ```bash
193
+ # Install dev dependencies (includes pre-commit, ruff, and ty)
194
+ uv sync --dev
195
+
196
+ # Install the pre-commit hooks
197
+ uv run pre-commit install
198
+ ```
199
+
200
+ **Manual run:**
201
+
202
+ ```bash
203
+ # Run on all files
204
+ uv run pre-commit run --all-files
205
+
206
+ # Run on staged files only
207
+ uv run pre-commit run
208
+ ```
209
+
210
+ The hooks will automatically run when you commit changes. If any issues are found and auto-fixed, you'll need to stage the fixes and commit again.
211
+
212
+ ## Releases
213
+
214
+ ### Setup
215
+
216
+ 1. Generate PyPI API token at https://pypi.org/manage/account/token/
217
+ 2. Set the environment variable:
218
+ ```bash
219
+ export UV_PUBLISH_TOKEN="pypi-..."
220
+ ```
221
+
222
+ ### Release Process
223
+
224
+ 1. **Update version in pyproject.toml**
225
+ ```bash
226
+ vim pyproject.toml # Change version = "X.Y.Z"
227
+ ```
228
+
229
+ 2. **Commit version bump**
230
+ ```bash
231
+ git add pyproject.toml
232
+ git commit -m "Bump version to X.Y.Z"
233
+ git push origin main
234
+ ```
235
+
236
+ 3. **Publish to PyPI**
237
+ ```bash
238
+ make publish
239
+ ```
@@ -0,0 +1,35 @@
1
+ [project]
2
+ name = "linear-app"
3
+ version = "0.0.1"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13"
7
+ dependencies = [
8
+ "typer>=0.15.0",
9
+ "httpx>=0.28.0",
10
+ "rich>=13.0.0",
11
+ ]
12
+
13
+ [project.scripts]
14
+ linear = "linear.cli:main"
15
+
16
+ [build-system]
17
+ requires = ["hatchling"]
18
+ build-backend = "hatchling.build"
19
+
20
+ [tool.hatch.build.targets.wheel]
21
+ packages = ["src/linear"]
22
+
23
+ [dependency-groups]
24
+ dev = [
25
+ "ruff>=0.14.7",
26
+ "pre-commit>=4.0.0",
27
+ "ty>=0.0.1a29",
28
+ ]
29
+
30
+ [tool.ruff]
31
+ line-length = 88
32
+ target-version = "py313"
33
+
34
+ [tool.ruff.format]
35
+ quote-style = "double"
@@ -0,0 +1 @@
1
+ """Linear - Command line interface for Linear."""