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.
Files changed (47) hide show
  1. aethis_cli-0.3.0/LICENSE +21 -0
  2. aethis_cli-0.3.0/PKG-INFO +269 -0
  3. aethis_cli-0.3.0/README.md +236 -0
  4. aethis_cli-0.3.0/aethis_cli/__init__.py +3 -0
  5. aethis_cli-0.3.0/aethis_cli/__main__.py +4 -0
  6. aethis_cli-0.3.0/aethis_cli/_version.py +3 -0
  7. aethis_cli-0.3.0/aethis_cli/auth.py +203 -0
  8. aethis_cli-0.3.0/aethis_cli/client.py +181 -0
  9. aethis_cli-0.3.0/aethis_cli/commands/__init__.py +0 -0
  10. aethis_cli-0.3.0/aethis_cli/commands/account_cmd.py +280 -0
  11. aethis_cli-0.3.0/aethis_cli/commands/bundles_cmd.py +115 -0
  12. aethis_cli-0.3.0/aethis_cli/commands/decide_cmd.py +149 -0
  13. aethis_cli-0.3.0/aethis_cli/commands/explain_cmd.py +45 -0
  14. aethis_cli-0.3.0/aethis_cli/commands/fields_cmd.py +47 -0
  15. aethis_cli-0.3.0/aethis_cli/commands/generate_cmd.py +196 -0
  16. aethis_cli-0.3.0/aethis_cli/commands/guidance_cmd.py +177 -0
  17. aethis_cli-0.3.0/aethis_cli/commands/init_cmd.py +60 -0
  18. aethis_cli-0.3.0/aethis_cli/commands/login_cmd.py +158 -0
  19. aethis_cli-0.3.0/aethis_cli/commands/projects_cmd.py +136 -0
  20. aethis_cli-0.3.0/aethis_cli/commands/publish_cmd.py +90 -0
  21. aethis_cli-0.3.0/aethis_cli/commands/status_cmd.py +46 -0
  22. aethis_cli-0.3.0/aethis_cli/commands/test_cmd.py +80 -0
  23. aethis_cli-0.3.0/aethis_cli/commands/whoami_cmd.py +80 -0
  24. aethis_cli-0.3.0/aethis_cli/config.py +151 -0
  25. aethis_cli-0.3.0/aethis_cli/errors.py +20 -0
  26. aethis_cli-0.3.0/aethis_cli/main.py +149 -0
  27. aethis_cli-0.3.0/aethis_cli/output.py +28 -0
  28. aethis_cli-0.3.0/aethis_cli/py.typed +0 -0
  29. aethis_cli-0.3.0/aethis_cli.egg-info/PKG-INFO +269 -0
  30. aethis_cli-0.3.0/aethis_cli.egg-info/SOURCES.txt +45 -0
  31. aethis_cli-0.3.0/aethis_cli.egg-info/dependency_links.txt +1 -0
  32. aethis_cli-0.3.0/aethis_cli.egg-info/entry_points.txt +2 -0
  33. aethis_cli-0.3.0/aethis_cli.egg-info/requires.txt +12 -0
  34. aethis_cli-0.3.0/aethis_cli.egg-info/top_level.txt +1 -0
  35. aethis_cli-0.3.0/pyproject.toml +57 -0
  36. aethis_cli-0.3.0/setup.cfg +4 -0
  37. aethis_cli-0.3.0/tests/test_account_cmd.py +199 -0
  38. aethis_cli-0.3.0/tests/test_auth.py +158 -0
  39. aethis_cli-0.3.0/tests/test_client.py +246 -0
  40. aethis_cli-0.3.0/tests/test_config.py +84 -0
  41. aethis_cli-0.3.0/tests/test_empty_input_guards.py +94 -0
  42. aethis_cli-0.3.0/tests/test_guidance_cli.py +342 -0
  43. aethis_cli-0.3.0/tests/test_init.py +47 -0
  44. aethis_cli-0.3.0/tests/test_login_headless.py +52 -0
  45. aethis_cli-0.3.0/tests/test_main.py +36 -0
  46. aethis_cli-0.3.0/tests/test_publish_force.py +107 -0
  47. aethis_cli-0.3.0/tests/test_whoami_cmd.py +78 -0
@@ -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
+ [![PyPI](https://img.shields.io/pypi/v/aethis-cli.svg)](https://pypi.org/project/aethis-cli/)
37
+ [![Docs](https://img.shields.io/badge/docs-docs.aethis.ai-blue)](https://docs.aethis.ai)
38
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+ [![PyPI](https://img.shields.io/pypi/v/aethis-cli.svg)](https://pypi.org/project/aethis-cli/)
4
+ [![Docs](https://img.shields.io/badge/docs-docs.aethis.ai-blue)](https://docs.aethis.ai)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
@@ -0,0 +1,3 @@
1
+ """aethis-cli — CLI for the Aethis developer API."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,4 @@
1
+ """Enable `python -m aethis_cli`."""
2
+ from aethis_cli.main import app
3
+
4
+ app()
@@ -0,0 +1,3 @@
1
+ """Version info — updated per release."""
2
+ __version__ = "0.3.0"
3
+