aethis-cli 0.3.0__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.
- aethis_cli-0.3.0/LICENSE +21 -0
- aethis_cli-0.3.0/PKG-INFO +269 -0
- aethis_cli-0.3.0/README.md +236 -0
- aethis_cli-0.3.0/aethis_cli/__init__.py +3 -0
- aethis_cli-0.3.0/aethis_cli/__main__.py +4 -0
- aethis_cli-0.3.0/aethis_cli/_version.py +3 -0
- aethis_cli-0.3.0/aethis_cli/auth.py +203 -0
- aethis_cli-0.3.0/aethis_cli/client.py +181 -0
- aethis_cli-0.3.0/aethis_cli/commands/__init__.py +0 -0
- aethis_cli-0.3.0/aethis_cli/commands/account_cmd.py +280 -0
- aethis_cli-0.3.0/aethis_cli/commands/bundles_cmd.py +115 -0
- aethis_cli-0.3.0/aethis_cli/commands/decide_cmd.py +149 -0
- aethis_cli-0.3.0/aethis_cli/commands/explain_cmd.py +45 -0
- aethis_cli-0.3.0/aethis_cli/commands/fields_cmd.py +47 -0
- aethis_cli-0.3.0/aethis_cli/commands/generate_cmd.py +196 -0
- aethis_cli-0.3.0/aethis_cli/commands/guidance_cmd.py +177 -0
- aethis_cli-0.3.0/aethis_cli/commands/init_cmd.py +60 -0
- aethis_cli-0.3.0/aethis_cli/commands/login_cmd.py +158 -0
- aethis_cli-0.3.0/aethis_cli/commands/projects_cmd.py +136 -0
- aethis_cli-0.3.0/aethis_cli/commands/publish_cmd.py +90 -0
- aethis_cli-0.3.0/aethis_cli/commands/status_cmd.py +46 -0
- aethis_cli-0.3.0/aethis_cli/commands/test_cmd.py +80 -0
- aethis_cli-0.3.0/aethis_cli/commands/whoami_cmd.py +80 -0
- aethis_cli-0.3.0/aethis_cli/config.py +151 -0
- aethis_cli-0.3.0/aethis_cli/errors.py +20 -0
- aethis_cli-0.3.0/aethis_cli/main.py +149 -0
- aethis_cli-0.3.0/aethis_cli/output.py +28 -0
- aethis_cli-0.3.0/aethis_cli/py.typed +0 -0
- aethis_cli-0.3.0/aethis_cli.egg-info/PKG-INFO +269 -0
- aethis_cli-0.3.0/aethis_cli.egg-info/SOURCES.txt +45 -0
- aethis_cli-0.3.0/aethis_cli.egg-info/dependency_links.txt +1 -0
- aethis_cli-0.3.0/aethis_cli.egg-info/entry_points.txt +2 -0
- aethis_cli-0.3.0/aethis_cli.egg-info/requires.txt +12 -0
- aethis_cli-0.3.0/aethis_cli.egg-info/top_level.txt +1 -0
- aethis_cli-0.3.0/pyproject.toml +57 -0
- aethis_cli-0.3.0/setup.cfg +4 -0
- aethis_cli-0.3.0/tests/test_account_cmd.py +199 -0
- aethis_cli-0.3.0/tests/test_auth.py +158 -0
- aethis_cli-0.3.0/tests/test_client.py +246 -0
- aethis_cli-0.3.0/tests/test_config.py +84 -0
- aethis_cli-0.3.0/tests/test_empty_input_guards.py +94 -0
- aethis_cli-0.3.0/tests/test_guidance_cli.py +342 -0
- aethis_cli-0.3.0/tests/test_init.py +47 -0
- aethis_cli-0.3.0/tests/test_login_headless.py +52 -0
- aethis_cli-0.3.0/tests/test_main.py +36 -0
- aethis_cli-0.3.0/tests/test_publish_force.py +107 -0
- aethis_cli-0.3.0/tests/test_whoami_cmd.py +78 -0
aethis_cli-0.3.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Aethis Limited
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aethis-cli
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: CLI for the Aethis developer API — author, test, and publish rule bundles
|
|
5
|
+
Author-email: Aethis <eng@aethis.ai>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://aethis.ai
|
|
8
|
+
Project-URL: Repository, https://github.com/Aethis-ai/aethis-cli
|
|
9
|
+
Project-URL: Documentation, https://github.com/Aethis-ai/aethis-cli#readme
|
|
10
|
+
Project-URL: Bug Tracker, https://github.com/Aethis-ai/aethis-cli/issues
|
|
11
|
+
Keywords: cli,eligibility,rules-engine,compliance,aethis
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: typer>=0.12.0
|
|
23
|
+
Requires-Dist: rich>=13.5.0
|
|
24
|
+
Requires-Dist: httpx>=0.27.0
|
|
25
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
26
|
+
Provides-Extra: keyring
|
|
27
|
+
Requires-Dist: keyring>=25.0.0; extra == "keyring"
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: respx>=0.21.0; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# aethis-cli
|
|
35
|
+
|
|
36
|
+
[](https://pypi.org/project/aethis-cli/)
|
|
37
|
+
[](https://docs.aethis.ai)
|
|
38
|
+
[](https://opensource.org/licenses/MIT)
|
|
39
|
+
|
|
40
|
+
CLI for the [Aethis](https://aethis.ai) developer API — evaluate eligibility, author rule bundles, and publish from the terminal.
|
|
41
|
+
|
|
42
|
+
## Install
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install aethis-cli
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Quick start
|
|
49
|
+
|
|
50
|
+
No sign-up needed. Decision tools work immediately.
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Evaluate eligibility against a published bundle
|
|
54
|
+
aethis decide -b <bundle_id> -i '{"space.crew.age": 35, "space.medical.cert_valid": true}'
|
|
55
|
+
|
|
56
|
+
# Inspect the input fields a bundle expects
|
|
57
|
+
aethis fields -b <bundle_id>
|
|
58
|
+
|
|
59
|
+
# Get human-readable rule descriptions
|
|
60
|
+
aethis explain -b <bundle_id>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Author your own rules
|
|
64
|
+
|
|
65
|
+
Rule authoring is **invite-only private beta**. Decision tools (`aethis decide`, `aethis fields`, `aethis explain`) work immediately with no sign-up — this section is for approved beta tenants. [Request access →](https://aethis.ai/sign-up)
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# 1. Authenticate (creates a key via browser sign-in)
|
|
69
|
+
aethis account generate
|
|
70
|
+
# Or paste an existing key: aethis login
|
|
71
|
+
|
|
72
|
+
# 2. Initialise a project
|
|
73
|
+
mkdir my-rules && cd my-rules
|
|
74
|
+
aethis init
|
|
75
|
+
|
|
76
|
+
# 3. Add source documents and guidance
|
|
77
|
+
# (put PDFs/text in .aethis/sources/, hints in .aethis/guidance/hints.yaml)
|
|
78
|
+
|
|
79
|
+
# 4. Generate a rule bundle
|
|
80
|
+
aethis generate
|
|
81
|
+
|
|
82
|
+
# 5. Run test cases
|
|
83
|
+
aethis test
|
|
84
|
+
|
|
85
|
+
# 6. Publish the bundle
|
|
86
|
+
aethis publish
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Try the example
|
|
90
|
+
|
|
91
|
+
A complete, runnable example is included in `examples/spacecraft-crew-rules/`:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
cp -r examples/spacecraft-crew-rules my-first-rules && cd my-first-rules
|
|
95
|
+
aethis account generate
|
|
96
|
+
aethis generate --poll
|
|
97
|
+
aethis test
|
|
98
|
+
aethis decide -i '{"space.crew.species": "Human", "space.crew.age": 35, "space.crew.flight_hours": 600, "space.crew.has_pilot_license": true, "space.crew.has_gaa_exam": true, "space.medical.cert_valid": true, "space.mission.type": "suborbital", "space.crew.has_towel": true}'
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
See `examples/spacecraft-crew-rules/README.md` for details.
|
|
102
|
+
|
|
103
|
+
## Commands
|
|
104
|
+
|
|
105
|
+
### Decision (no API key required)
|
|
106
|
+
|
|
107
|
+
| Command | Description |
|
|
108
|
+
|---------|-------------|
|
|
109
|
+
| `aethis decide -b <bundle_id> -i '<json>'` | Evaluate eligibility. Add `--explain` for trace output. |
|
|
110
|
+
| `aethis fields -b <bundle_id>` | Show input fields the bundle expects |
|
|
111
|
+
| `aethis explain -b <bundle_id>` | Human-readable rule descriptions |
|
|
112
|
+
|
|
113
|
+
### Authoring
|
|
114
|
+
|
|
115
|
+
| Command | Description |
|
|
116
|
+
|---------|-------------|
|
|
117
|
+
| `aethis init` | Initialise a new project in the current directory |
|
|
118
|
+
| `aethis generate [--poll]` | Upload sources + guidance, trigger generation |
|
|
119
|
+
| `aethis status` | Check generation job progress |
|
|
120
|
+
| `aethis test` | Run test cases against the latest bundle |
|
|
121
|
+
| `aethis publish [--force]` | Set the latest bundle as active |
|
|
122
|
+
|
|
123
|
+
### Guidance (project-level)
|
|
124
|
+
|
|
125
|
+
Project guidance lives in `.aethis/guidance/hints.yaml` and is uploaded by `aethis generate`. These commands manage hints server-side after upload.
|
|
126
|
+
|
|
127
|
+
| Command | Description |
|
|
128
|
+
|---------|-------------|
|
|
129
|
+
| `aethis guidance list` | List active hints for the current project |
|
|
130
|
+
| `aethis guidance export <file>` | Export the current project's hints to YAML |
|
|
131
|
+
| `aethis guidance import <file>` | Import hints from a YAML file |
|
|
132
|
+
| `aethis guidance deactivate <hint_id>` | Deactivate a specific hint |
|
|
133
|
+
|
|
134
|
+
### Projects & bundles
|
|
135
|
+
|
|
136
|
+
| Command | Description |
|
|
137
|
+
|---------|-------------|
|
|
138
|
+
| `aethis projects list` | List your projects |
|
|
139
|
+
| `aethis projects show <project_id>` | Show project details |
|
|
140
|
+
| `aethis projects archive <project_id>` | Archive a project |
|
|
141
|
+
| `aethis bundles list` | List published bundles |
|
|
142
|
+
| `aethis bundles archive <bundle_id>` | Archive a bundle |
|
|
143
|
+
|
|
144
|
+
### Account
|
|
145
|
+
|
|
146
|
+
| Command | Description |
|
|
147
|
+
|---------|-------------|
|
|
148
|
+
| `aethis account generate` | Create an API key via browser sign-in |
|
|
149
|
+
| `aethis account keys` | List your API keys (masked) |
|
|
150
|
+
| `aethis account revoke <key_id>` | Revoke a key |
|
|
151
|
+
| `aethis login` | Paste an existing key |
|
|
152
|
+
|
|
153
|
+
## Project structure
|
|
154
|
+
|
|
155
|
+
After `aethis init`, your project looks like:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
my-rules/
|
|
159
|
+
.aethis/
|
|
160
|
+
aethis.yaml # project config
|
|
161
|
+
state.json # tracked IDs (project, bundle, job)
|
|
162
|
+
sources/ # PDF/text source documents
|
|
163
|
+
guidance/
|
|
164
|
+
hints.yaml # guidance hints for the code synthesizer
|
|
165
|
+
tests/
|
|
166
|
+
scenarios.yaml # golden test cases
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### aethis.yaml
|
|
170
|
+
|
|
171
|
+
```yaml
|
|
172
|
+
project: my-rules
|
|
173
|
+
api_key_env: AETHIS_API_KEY
|
|
174
|
+
base_url: https://api.aethis.ai
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### scenarios.yaml
|
|
178
|
+
|
|
179
|
+
```yaml
|
|
180
|
+
tests:
|
|
181
|
+
- name: "Eligible — all requirements met"
|
|
182
|
+
inputs:
|
|
183
|
+
space.crew.age: 35
|
|
184
|
+
space.crew.flight_hours: 600
|
|
185
|
+
space.crew.has_pilot_license: true
|
|
186
|
+
expect:
|
|
187
|
+
outcome: eligible
|
|
188
|
+
- name: "Not eligible — no medical cert"
|
|
189
|
+
inputs:
|
|
190
|
+
space.medical.cert_valid: false
|
|
191
|
+
expect:
|
|
192
|
+
outcome: not_eligible
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Environment variables
|
|
196
|
+
|
|
197
|
+
| Variable | Description | Required | Default |
|
|
198
|
+
|----------|-------------|----------|---------|
|
|
199
|
+
| `AETHIS_API_KEY` | Your API key (`ak_live_...`) | Authoring only | — |
|
|
200
|
+
| `AETHIS_BASE_URL` | API base URL | No | `https://api.aethis.ai` |
|
|
201
|
+
| `AETHIS_CLERK_DOMAIN` | Clerk domain override (development only) | No | `clerk.aethis.legal` |
|
|
202
|
+
|
|
203
|
+
## Extending with plugins
|
|
204
|
+
|
|
205
|
+
`aethis-cli` discovers third-party plugins via Python entry points under the `aethis_cli.plugins` group. A plugin is any installed package that exposes a `register(app: typer.Typer) -> None` callable; at startup the CLI calls it with the root Typer app and the plugin attaches extra commands.
|
|
206
|
+
|
|
207
|
+
Example `pyproject.toml`:
|
|
208
|
+
|
|
209
|
+
```toml
|
|
210
|
+
[project.entry-points."aethis_cli.plugins"]
|
|
211
|
+
my_plugin = "my_package.plugin:register"
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Example `my_package/plugin.py`:
|
|
215
|
+
|
|
216
|
+
```python
|
|
217
|
+
import typer
|
|
218
|
+
|
|
219
|
+
def register(app: typer.Typer) -> None:
|
|
220
|
+
@app.command()
|
|
221
|
+
def hello() -> None:
|
|
222
|
+
typer.echo("hello from my plugin")
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Staff-only tools (DSL source viewer, IAM registry, domain-guidance management, `--base-url` override) live in the private `aethis-cli-internal` package, installed on request.
|
|
226
|
+
|
|
227
|
+
## Development
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
git clone https://github.com/aethis-ai/aethis-cli.git
|
|
231
|
+
cd aethis-cli
|
|
232
|
+
pip install -e ".[dev]"
|
|
233
|
+
pytest tests/ -v
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Shell completions
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# Install tab completion for your shell
|
|
240
|
+
aethis --install-completion bash # or zsh, fish, powershell
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Troubleshooting
|
|
244
|
+
|
|
245
|
+
**`aethis generate` times out but server continues**
|
|
246
|
+
The server finishes even if your client disconnects. Wait 10–15 min, then run `aethis bundles list` — if the bundle appeared, run `aethis test` and `aethis publish`. Do not re-trigger generation; that creates a duplicate run.
|
|
247
|
+
|
|
248
|
+
**`aethis publish` fails with "tests are failing"**
|
|
249
|
+
`publish` refuses a bundle with failing tests. Fix with guidance + regenerate, or pass `--force` (not recommended for production).
|
|
250
|
+
|
|
251
|
+
**422 Validation error on `aethis decide`**
|
|
252
|
+
`DATE` fields must be passed as **integer ordinals**, not ISO strings. `2025-04-13` → `739354`:
|
|
253
|
+
```bash
|
|
254
|
+
python3 -c "from datetime import date; print(date(2025,4,13).toordinal())"
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**`Auth error: …`**
|
|
258
|
+
Your API key is missing, expired, or revoked. Run `aethis login` to paste a new one, or `aethis account generate` to create one.
|
|
259
|
+
|
|
260
|
+
**`403 Forbidden: missing scope`**
|
|
261
|
+
Your key lacks the required scope for the command. `aethis whoami` shows what your current key can do. Contact support to upgrade scopes.
|
|
262
|
+
|
|
263
|
+
## Benchmarks
|
|
264
|
+
|
|
265
|
+
See how the engine compares to frontier LLMs on real-world eligibility rules: [aethis-examples](https://github.com/Aethis-ai/aethis-examples)
|
|
266
|
+
|
|
267
|
+
## License
|
|
268
|
+
|
|
269
|
+
MIT
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# aethis-cli
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/aethis-cli/)
|
|
4
|
+
[](https://docs.aethis.ai)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
CLI for the [Aethis](https://aethis.ai) developer API — evaluate eligibility, author rule bundles, and publish from the terminal.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install aethis-cli
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
No sign-up needed. Decision tools work immediately.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Evaluate eligibility against a published bundle
|
|
21
|
+
aethis decide -b <bundle_id> -i '{"space.crew.age": 35, "space.medical.cert_valid": true}'
|
|
22
|
+
|
|
23
|
+
# Inspect the input fields a bundle expects
|
|
24
|
+
aethis fields -b <bundle_id>
|
|
25
|
+
|
|
26
|
+
# Get human-readable rule descriptions
|
|
27
|
+
aethis explain -b <bundle_id>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Author your own rules
|
|
31
|
+
|
|
32
|
+
Rule authoring is **invite-only private beta**. Decision tools (`aethis decide`, `aethis fields`, `aethis explain`) work immediately with no sign-up — this section is for approved beta tenants. [Request access →](https://aethis.ai/sign-up)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 1. Authenticate (creates a key via browser sign-in)
|
|
36
|
+
aethis account generate
|
|
37
|
+
# Or paste an existing key: aethis login
|
|
38
|
+
|
|
39
|
+
# 2. Initialise a project
|
|
40
|
+
mkdir my-rules && cd my-rules
|
|
41
|
+
aethis init
|
|
42
|
+
|
|
43
|
+
# 3. Add source documents and guidance
|
|
44
|
+
# (put PDFs/text in .aethis/sources/, hints in .aethis/guidance/hints.yaml)
|
|
45
|
+
|
|
46
|
+
# 4. Generate a rule bundle
|
|
47
|
+
aethis generate
|
|
48
|
+
|
|
49
|
+
# 5. Run test cases
|
|
50
|
+
aethis test
|
|
51
|
+
|
|
52
|
+
# 6. Publish the bundle
|
|
53
|
+
aethis publish
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Try the example
|
|
57
|
+
|
|
58
|
+
A complete, runnable example is included in `examples/spacecraft-crew-rules/`:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
cp -r examples/spacecraft-crew-rules my-first-rules && cd my-first-rules
|
|
62
|
+
aethis account generate
|
|
63
|
+
aethis generate --poll
|
|
64
|
+
aethis test
|
|
65
|
+
aethis decide -i '{"space.crew.species": "Human", "space.crew.age": 35, "space.crew.flight_hours": 600, "space.crew.has_pilot_license": true, "space.crew.has_gaa_exam": true, "space.medical.cert_valid": true, "space.mission.type": "suborbital", "space.crew.has_towel": true}'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
See `examples/spacecraft-crew-rules/README.md` for details.
|
|
69
|
+
|
|
70
|
+
## Commands
|
|
71
|
+
|
|
72
|
+
### Decision (no API key required)
|
|
73
|
+
|
|
74
|
+
| Command | Description |
|
|
75
|
+
|---------|-------------|
|
|
76
|
+
| `aethis decide -b <bundle_id> -i '<json>'` | Evaluate eligibility. Add `--explain` for trace output. |
|
|
77
|
+
| `aethis fields -b <bundle_id>` | Show input fields the bundle expects |
|
|
78
|
+
| `aethis explain -b <bundle_id>` | Human-readable rule descriptions |
|
|
79
|
+
|
|
80
|
+
### Authoring
|
|
81
|
+
|
|
82
|
+
| Command | Description |
|
|
83
|
+
|---------|-------------|
|
|
84
|
+
| `aethis init` | Initialise a new project in the current directory |
|
|
85
|
+
| `aethis generate [--poll]` | Upload sources + guidance, trigger generation |
|
|
86
|
+
| `aethis status` | Check generation job progress |
|
|
87
|
+
| `aethis test` | Run test cases against the latest bundle |
|
|
88
|
+
| `aethis publish [--force]` | Set the latest bundle as active |
|
|
89
|
+
|
|
90
|
+
### Guidance (project-level)
|
|
91
|
+
|
|
92
|
+
Project guidance lives in `.aethis/guidance/hints.yaml` and is uploaded by `aethis generate`. These commands manage hints server-side after upload.
|
|
93
|
+
|
|
94
|
+
| Command | Description |
|
|
95
|
+
|---------|-------------|
|
|
96
|
+
| `aethis guidance list` | List active hints for the current project |
|
|
97
|
+
| `aethis guidance export <file>` | Export the current project's hints to YAML |
|
|
98
|
+
| `aethis guidance import <file>` | Import hints from a YAML file |
|
|
99
|
+
| `aethis guidance deactivate <hint_id>` | Deactivate a specific hint |
|
|
100
|
+
|
|
101
|
+
### Projects & bundles
|
|
102
|
+
|
|
103
|
+
| Command | Description |
|
|
104
|
+
|---------|-------------|
|
|
105
|
+
| `aethis projects list` | List your projects |
|
|
106
|
+
| `aethis projects show <project_id>` | Show project details |
|
|
107
|
+
| `aethis projects archive <project_id>` | Archive a project |
|
|
108
|
+
| `aethis bundles list` | List published bundles |
|
|
109
|
+
| `aethis bundles archive <bundle_id>` | Archive a bundle |
|
|
110
|
+
|
|
111
|
+
### Account
|
|
112
|
+
|
|
113
|
+
| Command | Description |
|
|
114
|
+
|---------|-------------|
|
|
115
|
+
| `aethis account generate` | Create an API key via browser sign-in |
|
|
116
|
+
| `aethis account keys` | List your API keys (masked) |
|
|
117
|
+
| `aethis account revoke <key_id>` | Revoke a key |
|
|
118
|
+
| `aethis login` | Paste an existing key |
|
|
119
|
+
|
|
120
|
+
## Project structure
|
|
121
|
+
|
|
122
|
+
After `aethis init`, your project looks like:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
my-rules/
|
|
126
|
+
.aethis/
|
|
127
|
+
aethis.yaml # project config
|
|
128
|
+
state.json # tracked IDs (project, bundle, job)
|
|
129
|
+
sources/ # PDF/text source documents
|
|
130
|
+
guidance/
|
|
131
|
+
hints.yaml # guidance hints for the code synthesizer
|
|
132
|
+
tests/
|
|
133
|
+
scenarios.yaml # golden test cases
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### aethis.yaml
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
project: my-rules
|
|
140
|
+
api_key_env: AETHIS_API_KEY
|
|
141
|
+
base_url: https://api.aethis.ai
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### scenarios.yaml
|
|
145
|
+
|
|
146
|
+
```yaml
|
|
147
|
+
tests:
|
|
148
|
+
- name: "Eligible — all requirements met"
|
|
149
|
+
inputs:
|
|
150
|
+
space.crew.age: 35
|
|
151
|
+
space.crew.flight_hours: 600
|
|
152
|
+
space.crew.has_pilot_license: true
|
|
153
|
+
expect:
|
|
154
|
+
outcome: eligible
|
|
155
|
+
- name: "Not eligible — no medical cert"
|
|
156
|
+
inputs:
|
|
157
|
+
space.medical.cert_valid: false
|
|
158
|
+
expect:
|
|
159
|
+
outcome: not_eligible
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Environment variables
|
|
163
|
+
|
|
164
|
+
| Variable | Description | Required | Default |
|
|
165
|
+
|----------|-------------|----------|---------|
|
|
166
|
+
| `AETHIS_API_KEY` | Your API key (`ak_live_...`) | Authoring only | — |
|
|
167
|
+
| `AETHIS_BASE_URL` | API base URL | No | `https://api.aethis.ai` |
|
|
168
|
+
| `AETHIS_CLERK_DOMAIN` | Clerk domain override (development only) | No | `clerk.aethis.legal` |
|
|
169
|
+
|
|
170
|
+
## Extending with plugins
|
|
171
|
+
|
|
172
|
+
`aethis-cli` discovers third-party plugins via Python entry points under the `aethis_cli.plugins` group. A plugin is any installed package that exposes a `register(app: typer.Typer) -> None` callable; at startup the CLI calls it with the root Typer app and the plugin attaches extra commands.
|
|
173
|
+
|
|
174
|
+
Example `pyproject.toml`:
|
|
175
|
+
|
|
176
|
+
```toml
|
|
177
|
+
[project.entry-points."aethis_cli.plugins"]
|
|
178
|
+
my_plugin = "my_package.plugin:register"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Example `my_package/plugin.py`:
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
import typer
|
|
185
|
+
|
|
186
|
+
def register(app: typer.Typer) -> None:
|
|
187
|
+
@app.command()
|
|
188
|
+
def hello() -> None:
|
|
189
|
+
typer.echo("hello from my plugin")
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Staff-only tools (DSL source viewer, IAM registry, domain-guidance management, `--base-url` override) live in the private `aethis-cli-internal` package, installed on request.
|
|
193
|
+
|
|
194
|
+
## Development
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
git clone https://github.com/aethis-ai/aethis-cli.git
|
|
198
|
+
cd aethis-cli
|
|
199
|
+
pip install -e ".[dev]"
|
|
200
|
+
pytest tests/ -v
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Shell completions
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# Install tab completion for your shell
|
|
207
|
+
aethis --install-completion bash # or zsh, fish, powershell
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Troubleshooting
|
|
211
|
+
|
|
212
|
+
**`aethis generate` times out but server continues**
|
|
213
|
+
The server finishes even if your client disconnects. Wait 10–15 min, then run `aethis bundles list` — if the bundle appeared, run `aethis test` and `aethis publish`. Do not re-trigger generation; that creates a duplicate run.
|
|
214
|
+
|
|
215
|
+
**`aethis publish` fails with "tests are failing"**
|
|
216
|
+
`publish` refuses a bundle with failing tests. Fix with guidance + regenerate, or pass `--force` (not recommended for production).
|
|
217
|
+
|
|
218
|
+
**422 Validation error on `aethis decide`**
|
|
219
|
+
`DATE` fields must be passed as **integer ordinals**, not ISO strings. `2025-04-13` → `739354`:
|
|
220
|
+
```bash
|
|
221
|
+
python3 -c "from datetime import date; print(date(2025,4,13).toordinal())"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**`Auth error: …`**
|
|
225
|
+
Your API key is missing, expired, or revoked. Run `aethis login` to paste a new one, or `aethis account generate` to create one.
|
|
226
|
+
|
|
227
|
+
**`403 Forbidden: missing scope`**
|
|
228
|
+
Your key lacks the required scope for the command. `aethis whoami` shows what your current key can do. Contact support to upgrade scopes.
|
|
229
|
+
|
|
230
|
+
## Benchmarks
|
|
231
|
+
|
|
232
|
+
See how the engine compares to frontier LLMs on real-world eligibility rules: [aethis-examples](https://github.com/Aethis-ai/aethis-examples)
|
|
233
|
+
|
|
234
|
+
## License
|
|
235
|
+
|
|
236
|
+
MIT
|