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.
- linear_app-0.0.1/.claude/settings.local.json +23 -0
- linear_app-0.0.1/.gitignore +19 -0
- linear_app-0.0.1/.pre-commit-config.yaml +26 -0
- linear_app-0.0.1/.python-version +1 -0
- linear_app-0.0.1/Makefile +93 -0
- linear_app-0.0.1/PKG-INFO +249 -0
- linear_app-0.0.1/README.md +239 -0
- linear_app-0.0.1/pyproject.toml +35 -0
- linear_app-0.0.1/src/linear/__init__.py +1 -0
- linear_app-0.0.1/src/linear/api.py +1245 -0
- linear_app-0.0.1/src/linear/cli.py +1070 -0
- linear_app-0.0.1/src/linear/formatters.py +1175 -0
- linear_app-0.0.1/src/linear/models.py +604 -0
|
@@ -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,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."""
|