expedait-cli 0.2.0__tar.gz → 0.2.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.
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/.github/workflows/publish.yml +6 -1
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/CLAUDE.md +6 -0
- expedait_cli-0.2.1/PKG-INFO +153 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/README.md +1 -1
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/commands/auth_cmd.py +0 -1
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/pyproject.toml +3 -1
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/test_commands/test_auth_cmd.py +6 -6
- expedait_cli-0.2.0/PKG-INFO +0 -8
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/.github/workflows/ci.yml +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/.gitignore +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/LICENSE +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/__init__.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/auth.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/client.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/commands/__init__.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/commands/comments.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/commands/pages.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/commands/projects.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/config.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/formatters.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/expedait_cli/main.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/__init__.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/conftest.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/test_auth.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/test_client.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/test_commands/__init__.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/test_commands/test_comments.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/test_commands/test_pages.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/test_commands/test_projects.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/tests/test_config.py +0 -0
- {expedait_cli-0.2.0 → expedait_cli-0.2.1}/uv.lock +0 -0
|
@@ -9,7 +9,7 @@ jobs:
|
|
|
9
9
|
publish:
|
|
10
10
|
runs-on: ubuntu-latest
|
|
11
11
|
permissions:
|
|
12
|
-
contents:
|
|
12
|
+
contents: write
|
|
13
13
|
id-token: write
|
|
14
14
|
environment: pypi
|
|
15
15
|
steps:
|
|
@@ -35,3 +35,8 @@ jobs:
|
|
|
35
35
|
|
|
36
36
|
- name: Publish to PyPI
|
|
37
37
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
38
|
+
|
|
39
|
+
- name: Create GitHub Release with PR changelog
|
|
40
|
+
env:
|
|
41
|
+
GH_TOKEN: ${{ github.token }}
|
|
42
|
+
run: gh release create "$GITHUB_REF_NAME" --generate-notes
|
|
@@ -24,6 +24,12 @@ uv run python -m pytest tests/test_auth.py # run a single file
|
|
|
24
24
|
- `expedait_cli/` — source: `main.py` (Click entrypoint), `client.py` (httpx API client), `auth.py`, `config.py`, `formatters.py`, `commands/` (Click subcommands)
|
|
25
25
|
- `tests/` — pytest tests using `pytest-httpx` for mocking HTTP
|
|
26
26
|
|
|
27
|
+
## Versioning
|
|
28
|
+
|
|
29
|
+
When creating a PR, bump the patch version in `pyproject.toml` (the `version` field) and include that change in the PR.
|
|
30
|
+
|
|
31
|
+
To publish a release, push a git tag matching the version (e.g. `git tag v0.2.1 && git push origin v0.2.1`). This triggers CI to publish to PyPI and create a GitHub Release with auto-generated notes listing the PRs since the previous tag.
|
|
32
|
+
|
|
27
33
|
## Style
|
|
28
34
|
|
|
29
35
|
- Python 3.11+, no type-checker configured
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: expedait-cli
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: CLI for Expedait project management — download specs, post comments
|
|
5
|
+
License-Expression: Apache-2.0
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Requires-Dist: click>=8.1
|
|
9
|
+
Requires-Dist: httpx>=0.27
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
|
|
12
|
+
# Expedait CLI
|
|
13
|
+
|
|
14
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
15
|
+
[](https://www.python.org/downloads/)
|
|
16
|
+
|
|
17
|
+
Command-line interface for [Expedait](https://expedait.com) — download project specs and post comments from AI coding agents.
|
|
18
|
+
|
|
19
|
+
## Quickstart
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Install with uv (recommended)
|
|
23
|
+
uv pip install expedait-cli
|
|
24
|
+
|
|
25
|
+
# Or install from source
|
|
26
|
+
git clone https://github.com/Expedait/expedait-cli.git
|
|
27
|
+
cd expedait-cli
|
|
28
|
+
uv sync
|
|
29
|
+
|
|
30
|
+
# Login to your Expedait instance
|
|
31
|
+
expedait auth login
|
|
32
|
+
|
|
33
|
+
# List your projects
|
|
34
|
+
expedait projects list
|
|
35
|
+
|
|
36
|
+
# Download all specs for a project
|
|
37
|
+
expedait projects download 1 --output-dir ./specs
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Installation
|
|
41
|
+
|
|
42
|
+
### From PyPI
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install expedait-cli
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### From source
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
git clone https://github.com/Expedait/expedait-cli.git
|
|
52
|
+
cd expedait-cli
|
|
53
|
+
uv sync
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
This creates a virtual environment with the `expedait` command available.
|
|
57
|
+
|
|
58
|
+
**Requirements:** Python 3.11+
|
|
59
|
+
|
|
60
|
+
## Authentication
|
|
61
|
+
|
|
62
|
+
### Interactive login
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
expedait auth login
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Prompts for login method (SSO or email/password). Stores credentials in `~/.expedait/config.json`.
|
|
69
|
+
|
|
70
|
+
### Environment variables (CI / agents)
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
export EXPEDAIT_TOKEN="your-jwt-token"
|
|
74
|
+
export EXPEDAIT_API_URL="https://your-instance.expedait.com"
|
|
75
|
+
export EXPEDAIT_TENANT_ID=1
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Token resolution order:** `EXPEDAIT_TOKEN` env var > `~/.expedait/config.json` > error.
|
|
79
|
+
|
|
80
|
+
## Commands
|
|
81
|
+
|
|
82
|
+
### Auth
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
expedait auth login # Interactive login
|
|
86
|
+
expedait auth status # Show current user and tenant
|
|
87
|
+
expedait auth logout # Clear stored credentials
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Projects
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
expedait projects list # List all projects
|
|
94
|
+
expedait projects get PROJECT_ID # Get project details
|
|
95
|
+
expedait projects download PROJECT_ID # Download all pages as ZIP
|
|
96
|
+
expedait projects download PROJECT_ID --output-dir ./specs # Extract to directory
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Pages
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
expedait pages list --project-id PROJECT_ID # List pages in a project
|
|
103
|
+
expedait pages get PAGE_ID # Print page markdown content
|
|
104
|
+
expedait pages full PAGE_ID # Full context (content + comments + deps)
|
|
105
|
+
expedait pages download PAGE_ID --output-dir ./out # Download page as ZIP
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Comments
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
expedait comments list PAGE_ID # List comments on a page
|
|
112
|
+
expedait comments create PAGE_ID \ # Create a comment
|
|
113
|
+
--text "Comment content" \
|
|
114
|
+
--selected-text "text from page" \
|
|
115
|
+
--start-offset 100 \
|
|
116
|
+
--end-offset 120 \
|
|
117
|
+
--source-page-id 5 # Optional: agent's source page
|
|
118
|
+
expedait comments resolve PAGE_ID COMMENT_ID # Mark as resolved
|
|
119
|
+
expedait comments delete PAGE_ID COMMENT_ID # Delete a comment
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Global Options
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
expedait --api-url https://host:8000 ... # Override API URL
|
|
126
|
+
expedait --tenant-id 2 ... # Override tenant
|
|
127
|
+
expedait --format json ... # Force JSON output
|
|
128
|
+
expedait --format text ... # Force human-readable output
|
|
129
|
+
expedait --version # Show version
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Output format defaults to `text` when connected to a terminal, `json` when piped.
|
|
133
|
+
|
|
134
|
+
## Agent Skills
|
|
135
|
+
|
|
136
|
+
For step-by-step guides on using the CLI from AI coding agents, see [expedait-skills](https://github.com/Expedait/expedait-skills).
|
|
137
|
+
|
|
138
|
+
## Development
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
git clone https://github.com/Expedait/expedait-cli.git
|
|
142
|
+
cd expedait-cli
|
|
143
|
+
uv sync --group dev
|
|
144
|
+
uv run python -m pytest
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Contributing
|
|
148
|
+
|
|
149
|
+
Contributions are welcome! Please open an issue or submit a pull request.
|
|
150
|
+
|
|
151
|
+
## License
|
|
152
|
+
|
|
153
|
+
This project is licensed under the [Apache License 2.0](LICENSE).
|
|
@@ -54,7 +54,7 @@ This creates a virtual environment with the `expedait` command available.
|
|
|
54
54
|
expedait auth login
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
Prompts for
|
|
57
|
+
Prompts for login method (SSO or email/password). Stores credentials in `~/.expedait/config.json`.
|
|
58
58
|
|
|
59
59
|
### Environment variables (CI / agents)
|
|
60
60
|
|
|
@@ -117,7 +117,6 @@ def _login_sso(api_url: str) -> tuple[str, dict]:
|
|
|
117
117
|
def login(ctx: click.Context) -> None:
|
|
118
118
|
"""Login interactively via browser SSO or email/password."""
|
|
119
119
|
api_url = resolve_api_url(ctx.obj.get("api_url"))
|
|
120
|
-
api_url = click.prompt("API URL", default=api_url)
|
|
121
120
|
|
|
122
121
|
method = click.prompt(
|
|
123
122
|
"Login method",
|
|
@@ -4,8 +4,10 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "expedait-cli"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.1"
|
|
8
8
|
description = "CLI for Expedait project management — download specs, post comments"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "Apache-2.0"
|
|
9
11
|
requires-python = ">=3.11"
|
|
10
12
|
dependencies = [
|
|
11
13
|
"click>=8.1",
|
|
@@ -29,7 +29,7 @@ class TestAuthLoginPassword:
|
|
|
29
29
|
result = runner.invoke(
|
|
30
30
|
cli,
|
|
31
31
|
["auth", "login"],
|
|
32
|
-
input="
|
|
32
|
+
input="password\nuser@test.com\npass123\n",
|
|
33
33
|
)
|
|
34
34
|
|
|
35
35
|
assert result.exit_code == 0
|
|
@@ -46,7 +46,7 @@ class TestAuthLoginPassword:
|
|
|
46
46
|
result = runner.invoke(
|
|
47
47
|
cli,
|
|
48
48
|
["auth", "login"],
|
|
49
|
-
input="
|
|
49
|
+
input="password\nbad@test.com\nwrong\n",
|
|
50
50
|
)
|
|
51
51
|
|
|
52
52
|
assert result.exit_code != 0
|
|
@@ -90,7 +90,7 @@ class TestAuthLoginSSO:
|
|
|
90
90
|
result = runner.invoke(
|
|
91
91
|
cli,
|
|
92
92
|
["auth", "login"],
|
|
93
|
-
input="
|
|
93
|
+
input="sso\n",
|
|
94
94
|
)
|
|
95
95
|
|
|
96
96
|
assert result.exit_code == 0
|
|
@@ -110,7 +110,7 @@ class TestAuthLoginSSO:
|
|
|
110
110
|
result = runner.invoke(
|
|
111
111
|
cli,
|
|
112
112
|
["auth", "login"],
|
|
113
|
-
input="
|
|
113
|
+
input="sso\n",
|
|
114
114
|
)
|
|
115
115
|
|
|
116
116
|
assert result.exit_code != 0
|
|
@@ -139,7 +139,7 @@ class TestAuthLoginSSO:
|
|
|
139
139
|
result = runner.invoke(
|
|
140
140
|
cli,
|
|
141
141
|
["auth", "login"],
|
|
142
|
-
input="
|
|
142
|
+
input="sso\n",
|
|
143
143
|
)
|
|
144
144
|
|
|
145
145
|
assert result.exit_code != 0
|
|
@@ -169,7 +169,7 @@ class TestAuthLoginMultipleTenants:
|
|
|
169
169
|
result = runner.invoke(
|
|
170
170
|
cli,
|
|
171
171
|
["auth", "login"],
|
|
172
|
-
input="
|
|
172
|
+
input="password\nuser@test.com\npass123\n2\n",
|
|
173
173
|
)
|
|
174
174
|
|
|
175
175
|
assert result.exit_code == 0
|
expedait_cli-0.2.0/PKG-INFO
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|