lighthouse-cli 0.16.0__tar.gz → 0.17.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.
Files changed (73) hide show
  1. {lighthouse_cli-0.16.0/lighthouse_cli.egg-info → lighthouse_cli-0.17.1}/PKG-INFO +1 -3
  2. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/README.md +37 -38
  3. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/__init__.py +2 -2
  4. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/__main__.py +1 -1
  5. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/agents.py +14 -14
  6. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/builds.py +5 -5
  7. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/collectors.py +7 -7
  8. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/connect.py +11 -11
  9. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/connections.py +9 -9
  10. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/evals.py +8 -8
  11. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/kb.py +8 -8
  12. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/language.py +3 -3
  13. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/limits.py +3 -3
  14. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/login.py +6 -6
  15. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/models.py +4 -4
  16. lighthouse_cli-0.17.1/lighthouse/commands/offline.py +235 -0
  17. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/runs.py +50 -6
  18. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/spend.py +6 -6
  19. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/stack.py +4 -4
  20. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/terms.py +3 -3
  21. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/whoami.py +4 -4
  22. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/config.py +1 -1
  23. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/credentials.py +2 -2
  24. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/device.py +1 -1
  25. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/exits.py +1 -1
  26. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/flags.py +2 -2
  27. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/http.py +23 -3
  28. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/i18n.py +1 -1
  29. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/ar.json +33 -8
  30. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/de.json +33 -8
  31. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/en.json +33 -8
  32. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/es.json +33 -8
  33. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/fr.json +33 -8
  34. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/ga.json +33 -8
  35. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/it.json +33 -8
  36. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/ja.json +33 -8
  37. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/nl.json +33 -8
  38. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/pt.json +33 -8
  39. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/zh-Hans.json +33 -8
  40. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/locales/zh-Hant.json +33 -8
  41. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/main.py +22 -6
  42. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/out.py +1 -1
  43. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/sealing.py +1 -1
  44. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1/lighthouse_cli.egg-info}/PKG-INFO +1 -3
  45. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse_cli.egg-info/SOURCES.txt +2 -0
  46. lighthouse_cli-0.17.1/lighthouse_cli.egg-info/entry_points.txt +3 -0
  47. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse_cli.egg-info/requires.txt +0 -3
  48. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/pyproject.toml +6 -6
  49. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_collectors.py +1 -1
  50. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_commands.py +62 -10
  51. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_connect_finav.py +1 -1
  52. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_connect_library.py +1 -1
  53. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_dev_surface.py +10 -10
  54. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_golden.py +4 -0
  55. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_i18n.py +1 -1
  56. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_installers.py +21 -0
  57. lighthouse_cli-0.17.1/tests/test_offline.py +177 -0
  58. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_sealing.py +7 -7
  59. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_stack.py +1 -1
  60. lighthouse_cli-0.17.1/tests/test_version.py +63 -0
  61. lighthouse_cli-0.16.0/lighthouse_cli.egg-info/entry_points.txt +0 -2
  62. lighthouse_cli-0.16.0/tests/test_version.py +0 -19
  63. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/LICENSE +0 -0
  64. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/NOTICE +0 -0
  65. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/commands/__init__.py +0 -0
  66. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse/py.typed +0 -0
  67. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse_cli.egg-info/dependency_links.txt +0 -0
  68. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/lighthouse_cli.egg-info/top_level.txt +0 -0
  69. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/setup.cfg +0 -0
  70. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_ci_credential.py +0 -0
  71. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_connect_erp_hr.py +0 -0
  72. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_fixtures.py +0 -0
  73. {lighthouse_cli-0.16.0 → lighthouse_cli-0.17.1}/tests/test_plumbing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lighthouse-cli
3
- Version: 0.16.0
3
+ Version: 0.17.1
4
4
  Summary: The LightHouse command line: sign in, connect your estate, deploy agents, watch runs
5
5
  License-Expression: Apache-2.0
6
6
  Classifier: Programming Language :: Python :: 3
@@ -18,6 +18,4 @@ Requires-Dist: ruff==0.16.10; extra == "dev"
18
18
  Requires-Dist: mypy==2.4.0; extra == "dev"
19
19
  Requires-Dist: bandit[toml]==1.9.4; extra == "dev"
20
20
  Requires-Dist: jsonschema==4.25.1; extra == "dev"
21
- Provides-Extra: build
22
- Requires-Dist: pyinstaller==6.22.3; extra == "build"
23
21
  Dynamic: license-file
@@ -1,4 +1,4 @@
1
- # The `lighthouse` command line for LightHouse™
1
+ # The `lighthouse-ai` command line for LightHouse™
2
2
 
3
3
  LightHouse from a terminal: sign in through the browser, see what is connected,
4
4
  read spend and limits, scaffold an agent, follow the runs. In the manner of the
@@ -6,10 +6,10 @@ Stripe CLI — one command to install, one to sign in, and everything else
6
6
  scriptable.
7
7
 
8
8
  ```sh
9
- brew install atlantic-agentic-labs/tap/lighthouse # or npm, pip, curl (below)
10
- lighthouse login --host t7m2kqx9vbn.atlanticagenticlabs.com
11
- lighthouse whoami
12
- lighthouse spend --by model --json | jq '.rows[0]'
9
+ brew install atlantic-agentic-labs/tap/lighthouse-ai # or npm, pip, curl (below)
10
+ lighthouse-ai login --host t7m2kqx9vbn.atlanticagenticlabs.com
11
+ lighthouse-ai whoami
12
+ lighthouse-ai spend --by model --json | jq '.rows[0]'
13
13
  ```
14
14
 
15
15
  ## Why Python
@@ -23,25 +23,20 @@ evidence:
23
23
  | **The control plane is Python.** The service, its OpenAPI generator and its MCP server are all `aal_control`. The CLI's integration tests therefore run **in process against the very application that is deployed** (`service/tests/test_cli_integration.py`) — the real routes, the real OAuth, the real row-level security, no stack to boot and no stub to drift. No other choice gets us that. | decisive |
24
24
  | **No new toolchain in any pipeline.** Every job already runs `python:3.13-slim`; a Go CLI would add a compiler, a cross-build matrix and a second dependency-audit path to all 21 repositories. | heavy |
25
25
  | **`keyring` gives the OS keychain on all three platforms** — macOS Keychain, Secret Service, Windows Credential Locker — with no native code to sign or notarise. | heavy |
26
- | Against: `npm` and `curl` want a runtime-free binary. | the cost |
26
+ | Against: a runtime-free binary. | the cost |
27
27
 
28
- That last line is the real cost, and it is paid rather than hidden: `pip` and
29
- `brew` install from source, while the **npm package and the curl script serve a
30
- single-file build** made with PyInstaller (`installers/`), which embeds the
31
- interpreter. A person installing by `curl | sh` needs no Python; a person
32
- installing by `pip` has one already.
33
-
34
- If the npm and curl routes ever become the main way people install this, the
35
- decision is worth revisiting — the commands, their output and their tests are
36
- the valuable part and none of it is language-specific.
28
+ That last line is the real cost, and it is paid rather than hidden: the CLI
29
+ installs from source as a package, so it needs Python (`pipx` brings its own
30
+ isolated environment; Homebrew brings its own virtualenv). There is no
31
+ stand-alone binary: the stand-alone installer was retired on 11 November 2026
32
+ and the CLI ships as packages only.
37
33
 
38
34
  ## Install
39
35
 
40
- | Route | Command | What it installs |
36
+ | Route | Command | Platforms |
41
37
  |---|---|---|
42
- | Homebrew | `brew install atlantic-agentic-labs/tap/lighthouse` | from source, into its own virtualenv (`installers/lighthouse.rb`) |
43
- | pip | `pip install lighthouse-cli` | from source, as a normal console script |
44
- | curl | `curl -fsSL https://get.atlanticagenticlabs.com/lighthouse \| sh` | the single-file build (`installers/install.sh`) |
38
+ | pipx or pip | `pipx install lighthouse-cli` (or `pip install lighthouse-cli`) | Linux, macOS, Windows |
39
+ | Homebrew | `brew install atlantic-agentic-labs/tap/lighthouse-ai` | macOS, Linux (`installers/lighthouse-ai.rb`) |
45
40
 
46
41
  **Nothing is published yet.** From a clone:
47
42
 
@@ -49,19 +44,19 @@ the valuable part and none of it is language-specific.
49
44
  cd cli && pip install -e ".[dev]"
50
45
  ```
51
46
 
52
- What has to exist before any of the three routes work is in
53
- `installers/README.md`: a Homebrew tap, a PyPI project and one DNS name. No
54
- registry credential is stored for any of them.
47
+ What has to exist before either route works is in `installers/README.md`: a
48
+ PyPI project with a trusted publisher and a Homebrew tap. No registry
49
+ credential is stored for PyPI.
55
50
 
56
51
  ## Signing in
57
52
 
58
53
  ```
59
- $ lighthouse login --host t7m2kqx9vbn.atlanticagenticlabs.com
54
+ $ lighthouse-ai login --host t7m2kqx9vbn.atlanticagenticlabs.com
60
55
 
61
56
  Your pairing code is: WXKM-7T4P
62
57
  Approve it at https://t7m2kqx9vbn.atlanticagenticlabs.com/device
63
58
  Press Enter to open the browser, or Ctrl-C to stop…
64
- Signed in to Example Air as ops@example.test (client_admin).
59
+ Signed in to Example Org as ops@example.test (client_admin).
65
60
  ```
66
61
 
67
62
  A device code, exactly as `stripe login` does it. The person approves in their
@@ -73,8 +68,8 @@ the repository, not in a dotfile, not in an environment file. One entry per
73
68
  host, so you can be signed in to several tenants at once:
74
69
 
75
70
  ```sh
76
- lighthouse whoami --profiles
77
- lighthouse logout --all # revokes at the service, then forgets
71
+ lighthouse-ai whoami --profiles
72
+ lighthouse-ai logout --all # revokes at the service, then forgets
78
73
  ```
79
74
 
80
75
  **What the credential can do** is in
@@ -104,9 +99,9 @@ spend-report:
104
99
  # LIGHTHOUSE_ACCESS_CLIENT_SECRET are masked CI/CD variables.
105
100
  script:
106
101
  - pip install -q lighthouse-cli
107
- - lighthouse whoami --json
108
- - lighthouse evals list --fail-below 0.8 --json
109
- - lighthouse spend --json > spend.json
102
+ - lighthouse-ai whoami --json
103
+ - lighthouse-ai evals list --fail-below 0.8 --json
104
+ - lighthouse-ai spend --json > spend.json
110
105
  ```
111
106
 
112
107
  **Why two credentials.** Every tenant host sits behind Cloudflare Access except
@@ -120,7 +115,7 @@ service token is missing or wrong and names the two variables.
120
115
  token (`lhat-...`), but that expires after **eight hours** and is not refreshed
121
116
  under the variable: there would be nowhere to put the new one. A machine key
122
117
  does not expire by time and has no refresh; revoke it on the Keys page. A
123
- machine key has no person behind it, so `lighthouse tokens` says so rather than
118
+ machine key has no person behind it, so `lighthouse-ai tokens` says so rather than
124
119
  failing, and `whoami` shows the key's kind.
125
120
 
126
121
  When `LIGHTHOUSE_TOKEN` is set, the CLI reads and writes **no** credential
@@ -130,7 +125,7 @@ store at all.
130
125
  keychain with the delegated token:
131
126
 
132
127
  ```sh
133
- printf '%s\n' "$ACCESS_SECRET" | lighthouse login --access-client-id "$ACCESS_ID" \
128
+ printf '%s\n' "$ACCESS_SECRET" | lighthouse-ai login --access-client-id "$ACCESS_ID" \
134
129
  --access-client-secret-stdin
135
130
  ```
136
131
 
@@ -158,6 +153,10 @@ a terminal, and when `CI`, `NO_COLOR` or `TERM=dumb` is set.
158
153
  | `evals list`, `evals list --fail-below N` | evaluation results, as a release gate on one named metric (`--metric`, default `f1`); fails closed when a row has no such number |
159
154
  | `evals run <pack:card> --cap N [--set S] [--wait] [--fail-below N]` | run the agent's scheduled evaluation once under a spend cap (the `deploy` scope, or a person); with `--wait`, gate on the new results |
160
155
  | `runs`, `runs show`, `runs tail` | what ran, and what is running now |
156
+ | `runs export <run> [--format json\|pdf] [-o file]` | one run's content-free export, as JSON or a branded PDF (contract 1.32); audited |
157
+ | `telemetry import <bundle>`, `telemetry status --deployment D` | upload a telemetry bundle from a deployment with no network path, and see the batches held and missing (contract 1.33; client_admin or the `offline` scope) |
158
+ | `commands export --deployment D --out <file>` | the waiting commands as a signed command file for the deployment's `apply-file` (contract 1.33); audited |
159
+ | `commands import-results <answers.json>` | upload the signed answers the deployment's `apply-file --results` wrote; each is verified and matched to an exported command (contract 1.35); audited |
161
160
  | `spend` | spend by day, model, pack, agent or connection; the forecast; the estimated savings |
162
161
  | `limits` | the limits in force, and whether the engines applied them |
163
162
  | `terms` | the commercial terms in force |
@@ -168,7 +167,7 @@ a terminal, and when `CI`, `NO_COLOR` or `TERM=dumb` is set.
168
167
  pass, or its metric is below the threshold or missing (it fails closed), so
169
168
  a pipeline can evaluate, then deploy only what passed. Deploying and running
170
169
  an evaluation need a person's delegated token with the `deploy` scope
171
- (`lighthouse login --scope "telemetry:read agents:read deploy"`, eight hours,
170
+ (`lighthouse-ai login --scope "telemetry:read agents:read deploy"`, eight hours,
172
171
  in `LIGHTHOUSE_TOKEN`); a machine key reads but never deploys or spends.
173
172
 
174
173
  ```yaml
@@ -176,8 +175,8 @@ release:
176
175
  image: python:3.13-slim
177
176
  script:
178
177
  - pip install -q lighthouse-cli
179
- - lighthouse evals run research:summary --cap 5 --wait --fail-below 0.8 --json
180
- - lighthouse agents deploy research:summary --version "$CI_COMMIT_TAG" --wait --json
178
+ - lighthouse-ai evals run research:summary --cap 5 --wait --fail-below 0.8 --json
179
+ - lighthouse-ai agents deploy research:summary --version "$CI_COMMIT_TAG" --wait --json
181
180
  ```
182
181
 
183
182
  `agents deploy --wait` exits 0 when the version is current, 1 when the
@@ -190,15 +189,15 @@ A rate limit (`429`) is waited out and retried by the CLI itself.
190
189
  **Language.** `--lang <tag>` (or `LIGHTHOUSE_LANG`) picks the language of help,
191
190
  prompts, errors and table headers for one run: `en` (British English, the
192
191
  default and the source), `fr`, `de`, `es`, `it`, `pt`, `nl`, `ga`, `ja`, `zh-Hans`, `zh-Hant` or `ar`. Without
193
- either, the CLI uses the language you set in the portal (kept by `lighthouse
194
- whoami` and `lighthouse language`), then `LANG`. `--json` is never translated: its
192
+ either, the CLI uses the language you set in the portal (kept by `lighthouse-ai
193
+ whoami` and `lighthouse-ai language`), then `LANG`. `--json` is never translated: its
195
194
  keys, values and the `error` code are the same in every language. The translations
196
195
  are machine-drafted, pending native review; the command-specific notes not yet in a
197
196
  catalogue are shown in English.
198
197
 
199
198
  `--json` on every command: one JSON document on standard output and **nothing
200
199
  else** — prose, prompts and progress go to standard error, so
201
- `lighthouse spend --json | jq` works while the command is still talking to you.
200
+ `lighthouse-ai spend --json | jq` works while the command is still talking to you.
202
201
  `runs tail --json` writes JSON Lines, one object per change.
203
202
 
204
203
  | Code | Meaning | What a pipeline should do |
@@ -206,7 +205,7 @@ else** — prose, prompts and progress go to standard error, so
206
205
  | 0 | it worked | carry on |
207
206
  | 1 | the command failed | stop; the message says why |
208
207
  | 2 | the command line was wrong | stop; fix the invocation |
209
- | 3 | not signed in, or the credential expired | `lighthouse login` |
208
+ | 3 | not signed in, or the credential expired | `lighthouse-ai login` |
210
209
  | 4 | signed in, but the role or scope does not reach this | ask an administrator |
211
210
  | 5 | refused for now: a rate limit, or a retryable 5xx | retry later |
212
211
  | 7 | it needed a person and none is there | stop |
@@ -1,6 +1,6 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """The `lighthouse` command line for LightHouse."""
3
+ """The `lighthouse-ai` command line for LightHouse."""
4
4
  from __future__ import annotations
5
5
 
6
- __version__ = "0.16.0"
6
+ __version__ = "0.17.1"
@@ -1,6 +1,6 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`python -m lighthouse`, the same as the `lighthouse` script."""
3
+ """`python -m lighthouse`, the same as the `lighthouse-ai` script."""
4
4
  from __future__ import annotations
5
5
 
6
6
  from lighthouse.main import run
@@ -1,13 +1,13 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse agents`: list, inspect, scaffold, deploy, read logs, roll back.
3
+ """`lighthouse-ai agents`: list, inspect, scaffold, deploy, read logs, roll back.
4
4
 
5
- lighthouse agents # every agent, with its state
6
- lighthouse agents show research:summary
7
- lighthouse agents init my-agent # scaffold agent.toml here
8
- lighthouse agents logs research:summary --limit 20
9
- lighthouse agents deploy research:summary --version 1.4.0 --wait
10
- lighthouse agents rollback research:summary --to 1.3.0
5
+ lighthouse-ai agents # every agent, with its state
6
+ lighthouse-ai agents show research:summary
7
+ lighthouse-ai agents init my-agent # scaffold agent.toml here
8
+ lighthouse-ai agents logs research:summary --limit 20
9
+ lighthouse-ai agents deploy research:summary --version 1.4.0 --wait
10
+ lighthouse-ai agents rollback research:summary --to 1.3.0
11
11
 
12
12
  **`init` is local and complete.** It writes an `agent.toml` next to you, with
13
13
  every field the pipeline will ask for and a comment on each: instructions, the
@@ -20,7 +20,7 @@ with `--trace`, one run's spans, which is what anybody actually wants when an
20
20
  agent misbehaves.
21
21
 
22
22
  **`deploy` and `rollback` make a released version current** (the `deploy`
23
- scope: sign in with `lighthouse login --scope "telemetry:read agents:read
23
+ scope: sign in with `lighthouse-ai login --scope "telemetry:read agents:read
24
24
  deploy"`). Each sends `release.add` for the agent and version; rolling back is
25
25
  the same with an earlier version (`--to`, or the last version that passed its
26
26
  gate before the current one). The service decides what happens:
@@ -47,7 +47,7 @@ from lighthouse.flags import inherited
47
47
  from lighthouse.main import Command, Context
48
48
  from lighthouse.out import Out
49
49
 
50
- SCAFFOLD = '''# An agent for LightHouse. `lighthouse agents deploy` reads this file.
50
+ SCAFFOLD = '''# An agent for LightHouse. `lighthouse-ai agents deploy` reads this file.
51
51
  #
52
52
  # Everything here is checked before an agent runs: the model policy against the
53
53
  # model library's evidence scores, the knowledge bases against what this tenant
@@ -63,7 +63,7 @@ instructions = """
63
63
  You are …
64
64
  """
65
65
 
66
- # Knowledge bases this agent may read, by index name (`lighthouse kb`).
66
+ # Knowledge bases this agent may read, by index name (`lighthouse-ai kb`).
67
67
  knowledge_bases = []
68
68
 
69
69
  # Tools, by name. Write access is a separate, named tool and sits behind an
@@ -142,8 +142,8 @@ def _init(ctx: Context) -> dict[str, Any]:
142
142
  hint="pass --force to overwrite it")
143
143
  target.write_text(SCAFFOLD.format(name=ctx.args.name))
144
144
  return {"ok": True, "wrote": str(target), "agent": ctx.args.name,
145
- "next": ["edit it", "lighthouse evals run <pack:card> --cap 5 --wait",
146
- "lighthouse agents deploy <pack:card> --version <version> --wait"]}
145
+ "next": ["edit it", "lighthouse-ai evals run <pack:card> --cap 5 --wait",
146
+ "lighthouse-ai agents deploy <pack:card> --version <version> --wait"]}
147
147
 
148
148
 
149
149
  def _logs(ctx: Context) -> dict[str, Any]:
@@ -165,10 +165,10 @@ def agents(ctx: Context) -> dict[str, Any]:
165
165
  return _logs(ctx)
166
166
  if which == "deploy":
167
167
  return _release(ctx, str(ctx.args.version), "deploy",
168
- ctx.args.reason or "deployed from the lighthouse CLI")
168
+ ctx.args.reason or "deployed from the lighthouse-ai CLI")
169
169
  if which == "rollback":
170
170
  return _release(ctx, ctx.args.to or _previous(ctx), "rollback",
171
- ctx.args.reason or "rolled back from the lighthouse CLI")
171
+ ctx.args.reason or "rolled back from the lighthouse-ai CLI")
172
172
  if which == "show":
173
173
  agent = ctx.args.agent
174
174
  if not agent:
@@ -1,11 +1,11 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse builds`: agents built with the agent builder, and where each is.
3
+ """`lighthouse-ai builds`: agents built with the agent builder, and where each is.
4
4
 
5
- lighthouse builds
6
- lighthouse builds --status publish_requested
7
- lighthouse builds show 5f0c...e1 # one, with its scores and estimated cost
8
- lighthouse builds --json | jq '.proposals[] | select(.status == "evaluated")'
5
+ lighthouse-ai builds
6
+ lighthouse-ai builds --status publish_requested
7
+ lighthouse-ai builds show 5f0c...e1 # one, with its scores and estimated cost
8
+ lighthouse-ai builds --json | jq '.proposals[] | select(.status == "evaluated")'
9
9
 
10
10
  Reads `GET /api/v1/builder/proposals` (contract 1.24). Read only, on purpose:
11
11
  an agent is drafted, sent to your deployment, evaluated and approved in the
@@ -1,9 +1,9 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse collectors`: ask Atlantic for a collector, and follow the request.
3
+ """`lighthouse-ai collectors`: ask Atlantic for a collector, and follow the request.
4
4
 
5
- lighthouse collectors requests # your tenant's requests and their stage
6
- lighthouse collectors request --vendor "Invented CRM" --product "Sales Suite" \\
5
+ lighthouse-ai collectors requests # your tenant's requests and their stage
6
+ lighthouse-ai collectors request --vendor "Invented CRM" --product "Sales Suite" \\
7
7
  --reads "Accounts and opportunities" --cloud aws [--kind crm] [--access read] \\
8
8
  [--urgency normal] [--docs-url https://...]
9
9
 
@@ -15,7 +15,7 @@ client already asked for the same vendor and product, your request joins
15
15
  that issue instead of opening another.
16
16
 
17
17
  **Asking needs the handler or client_admin role**; reading needs viewer. Both
18
- use the CLI's own sign-in (`lighthouse login`). At a terminal, a field left
18
+ use the CLI's own sign-in (`lighthouse-ai login`). At a terminal, a field left
19
19
  off the command line is asked for; under `--no-input`, or with standard input
20
20
  not a terminal, a missing required field is exit 7.
21
21
 
@@ -108,10 +108,10 @@ def _ask(ctx: Context) -> dict[str, Any]:
108
108
  except Refused as e:
109
109
  if e.error in ("invalid", "bad_query", "names_your_organisation"):
110
110
  raise CliError(e.message, code=USAGE, error=e.error,
111
- hint="see `lighthouse collectors request --help`") from None
111
+ hint="see `lighthouse-ai collectors request --help`") from None
112
112
  if e.error == "conflict":
113
113
  raise CliError(e.message, code=e.code, error=e.error,
114
- hint="`lighthouse collectors requests` shows it") from None
114
+ hint="`lighthouse-ai collectors requests` shows it") from None
115
115
  raise
116
116
  return {"ok": True, "action": "request", **_row(got), "access": got.get("access"),
117
117
  "deployment_cloud": got.get("deployment_cloud"), "urgency": got.get("urgency")}
@@ -140,7 +140,7 @@ def _show(out: Out, body: dict[str, Any]) -> None:
140
140
  [[r["id"], f"{r['vendor']} {r['product']}", r["stage"], _issue(r),
141
141
  r["request_count"] if r["request_count"] else "-", r["created_at"] or "-"]
142
142
  for r in body["requests"]])
143
- out.note("`lighthouse collectors request --vendor ... --product ...` asks for another")
143
+ out.note("`lighthouse-ai collectors request --vendor ... --product ...` asks for another")
144
144
 
145
145
 
146
146
  COMMANDS = (Command("collectors", "ask Atlantic for a collector, and follow your requests",
@@ -1,15 +1,15 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse connect <provider>`: open the provider's own approval.
3
+ """`lighthouse-ai connect <provider>`: open the provider's own approval.
4
4
 
5
- lighthouse connect # what is connected, and what can be
6
- lighthouse connect github
7
- lighthouse connect aws --no-browser
8
- lighthouse connect gitlab --reuse-local # offers `glab`'s sign-in; asks first
5
+ lighthouse-ai connect # what is connected, and what can be
6
+ lighthouse-ai connect github
7
+ lighthouse-ai connect aws --no-browser
8
+ lighthouse-ai connect gitlab --reuse-local # offers `glab`'s sign-in; asks first
9
9
  security find-generic-password -s gh-ci -w | \
10
- lighthouse connect github --credential-stdin --access read_write \
11
- --target organisation=example-air # an existing token, as you
12
- ... | lighthouse connect github --credential-stdin \
10
+ lighthouse-ai connect github --credential-stdin --access read_write \
11
+ --target organisation=example-org # an existing token, as you
12
+ ... | lighthouse-ai connect github --credential-stdin \
13
13
  --deployment-key "$(terraform output -raw deployment_public_key)"
14
14
 
15
15
  **What this command does and does not do.** It opens the portal's Connect page
@@ -302,7 +302,7 @@ def _read_credential(ctx: Context) -> str:
302
302
  if len(got.strip()) < 8:
303
303
  raise CliError("no credential on standard input", code=USAGE, error="no_credential",
304
304
  hint="pipe it in: security find-generic-password -s <name> -w | "
305
- "lighthouse connect <provider> --credential-stdin")
305
+ "lighthouse-ai connect <provider> --credential-stdin")
306
306
  return got
307
307
 
308
308
 
@@ -546,7 +546,7 @@ def _show_listing(out: Out, body: dict[str, Any]) -> None:
546
546
  p["scopes"]] for p in body["providers"]])
547
547
  if not body["providers"]:
548
548
  out.note("no connector matches; ask for one from Help, or tell your Atlantic contact")
549
- out.note("`lighthouse connect <provider>` opens the approval; `--all` lists the coming "
549
+ out.note("`lighthouse-ai connect <provider>` opens the approval; `--all` lists the coming "
550
550
  "ones too; `connect list --family F --kind K --search WORDS` narrows the list")
551
551
 
552
552
 
@@ -559,7 +559,7 @@ def connect(ctx: Context) -> dict[str, Any]:
559
559
  if provider is None:
560
560
  raise CliError(f"{name!r} is not a provider LightHouse knows", code=USAGE,
561
561
  error="unknown_provider",
562
- hint="run `lighthouse connect --all` to see every one")
562
+ hint="run `lighthouse-ai connect --all` to see every one")
563
563
  if getattr(ctx.args, "credential_stdin", False):
564
564
  return _connect_token(ctx, provider)
565
565
  url = connect_url(ctx.host)
@@ -1,12 +1,12 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse connections`: what is connected, how often each syncs, and Sync now.
3
+ """`lighthouse-ai connections`: what is connected, how often each syncs, and Sync now.
4
4
 
5
- lighthouse connections # every connection, its schedule, next sync
6
- lighthouse connections schedule cx-abcdef123456 --mode hourly
7
- lighthouse connections schedule cx-abcdef123456 --mode daily --at 06:30 --tz Europe/London
8
- lighthouse connections schedule cx-abcdef123456 --mode off
9
- lighthouse connections sync cx-abcdef123456 --reason "a page was fixed this morning"
5
+ lighthouse-ai connections # every connection, its schedule, next sync
6
+ lighthouse-ai connections schedule cx-abcdef123456 --mode hourly
7
+ lighthouse-ai connections schedule cx-abcdef123456 --mode daily --at 06:30 --tz Europe/London
8
+ lighthouse-ai connections schedule cx-abcdef123456 --mode off
9
+ lighthouse-ai connections sync cx-abcdef123456 --reason "a page was fixed this morning"
10
10
 
11
11
  **The listing** reads `GET /api/v1/connectors`, the same connections the
12
12
  Connect page shows, with each one's schedule as the deployment reports it
@@ -124,7 +124,7 @@ def _act(ctx: Context, method: str, suffix: str, body: dict[str, Any]) -> dict[s
124
124
  except Refused as e:
125
125
  if e.error == "invalid":
126
126
  raise CliError(e.message, code=USAGE, error="invalid",
127
- hint="see `lighthouse connections schedule --help`") from None
127
+ hint="see `lighthouse-ai connections schedule --help`") from None
128
128
  if e.error == "commands_disabled":
129
129
  raise CliError(e.message, code=e.code, error=e.error,
130
130
  hint=f"a client administrator switches connector.schedule and "
@@ -180,8 +180,8 @@ def _show(out: Out, body: dict[str, Any]) -> None:
180
180
  if c.get("check"):
181
181
  out.note(f"{c['id']} ({c['connector']}) is failing: {c['check_words']} "
182
182
  f"({c['check']}).{' ' + c['fix'] if c.get('fix') else ''}")
183
- out.note("`lighthouse connections schedule <id> --mode ...` sets one; "
184
- "`lighthouse connections sync <id>` syncs one now")
183
+ out.note("`lighthouse-ai connections schedule <id> --mode ...` sets one; "
184
+ "`lighthouse-ai connections sync <id>` syncs one now")
185
185
  return
186
186
  if body["action"] == "schedule":
187
187
  out.pairs([("connection", body["connection"]), ("schedule", body["schedule"]),
@@ -1,9 +1,9 @@
1
- """`lighthouse evals`: evaluation results, and running a set.
1
+ """`lighthouse-ai evals`: evaluation results, and running a set.
2
2
 
3
- lighthouse evals # the latest results
4
- lighthouse evals list --pack research --json
5
- lighthouse evals list --fail-below 0.8 # a release gate on metrics.f1
6
- lighthouse evals run research:summary --cap 5 --wait --fail-below 0.8
3
+ lighthouse-ai evals # the latest results
4
+ lighthouse-ai evals list --pack research --json
5
+ lighthouse-ai evals list --fail-below 0.8 # a release gate on metrics.f1
6
+ lighthouse-ai evals run research:summary --cap 5 --wait --fail-below 0.8
7
7
 
8
8
  `evals` reads `GET /api/v1/evals`, every page of it: each row is one measurement
9
9
  of one suite for one agent version, with `passed` (did it meet its own bar) and
@@ -30,8 +30,8 @@ new row did not pass, and, with `--fail-below N`, when a new row's metric is
30
30
  below N or missing (the same closed gate as `evals list --fail-below`). In a
31
31
  pipeline:
32
32
 
33
- lighthouse evals run research:summary --cap 5 --wait --fail-below 0.8 \
34
- && lighthouse agents deploy research:summary --version "$VERSION" --wait
33
+ lighthouse-ai evals run research:summary --cap 5 --wait --fail-below 0.8 \
34
+ && lighthouse-ai agents deploy research:summary --version "$VERSION" --wait
35
35
  """
36
36
  from __future__ import annotations
37
37
 
@@ -100,7 +100,7 @@ def _run(ctx: Context) -> dict[str, Any]:
100
100
  raise CliError("--fail-below gates on the results, so it needs --wait", code=USAGE,
101
101
  error="usage")
102
102
  body: dict[str, Any] = {"cap_usd": f"{a.cap:.2f}",
103
- "reason": a.reason or "evaluation run from the lighthouse CLI"}
103
+ "reason": a.reason or "evaluation run from the lighthouse-ai CLI"}
104
104
  if a.eval_set:
105
105
  body["set"] = a.eval_set
106
106
  if a.deployment:
@@ -1,12 +1,12 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse kb`: knowledge bases, their freshness, and ingesting into them.
3
+ """`lighthouse-ai kb`: knowledge bases, their freshness, and ingesting into them.
4
4
 
5
- lighthouse kb # every knowledge base, with its freshness
6
- lighthouse kb show <index>
7
- lighthouse kb ingest ops --source confluence --wait
8
- lighthouse kb ingest ops --source cx-abcdef123456
9
- lighthouse kb upload <file> [--deployment NAME] (contract 1.21)
5
+ lighthouse-ai kb # every knowledge base, with its freshness
6
+ lighthouse-ai kb show <index>
7
+ lighthouse-ai kb ingest ops --source confluence --wait
8
+ lighthouse-ai kb ingest ops --source cx-abcdef123456
9
+ lighthouse-ai kb upload <file> [--deployment NAME] (contract 1.21)
10
10
 
11
11
  `kb` and `kb show` read `GET /api/v1/knowledge-bases` and
12
12
  `/api/v1/knowledge-bases/{index}` (contract 1.14): the indexes, what is in
@@ -143,7 +143,7 @@ def _resolve(ctx: Context, connections: list[dict[str, Any]]) -> dict[str, Any]:
143
143
  if not hit:
144
144
  raise CliError(f"no live connection matches {a.source!r}"
145
145
  + (f" and {a.repo!r}" if a.repo else ""), code=USAGE,
146
- error="no_connection", hint="`lighthouse connections` lists them")
146
+ error="no_connection", hint="`lighthouse-ai connections` lists them")
147
147
  if len(hit) > 1:
148
148
  raise CliError(f"{len(hit)} connections match {a.source!r}: name one", code=USAGE,
149
149
  error="ambiguous_connection",
@@ -165,7 +165,7 @@ def _ingest(ctx: Context) -> dict[str, Any]:
165
165
  try:
166
166
  got = person.post(f"/api/v1/connections/{cid}/sync", {k: v for k, v in {
167
167
  "deployment": base.get("deployment"),
168
- "reason": a.reason or f"ingest into {a.index} from the lighthouse CLI"}.items()
168
+ "reason": a.reason or f"ingest into {a.index} from the lighthouse-ai CLI"}.items()
169
169
  if v is not None}) or {}
170
170
  finally:
171
171
  person.close()
@@ -1,10 +1,10 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse language`: the language this CLI, the portal, MCP and the
3
+ """`lighthouse-ai language`: the language this CLI, the portal, MCP and the
4
4
  assistant speak to you (contract 1.29).
5
5
 
6
- lighthouse language your setting, your organisation's, and what is in use
7
- lighthouse language --list only the languages on offer
6
+ lighthouse-ai language your setting, your organisation's, and what is in use
7
+ lighthouse-ai language --list only the languages on offer
8
8
 
9
9
  Read only. A person sets their own language in the portal under Preferences
10
10
  (and a client administrator the organisation's under Settings): a delegated
@@ -1,9 +1,9 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse limits`: the spend limits in force, and whether they reached the engines.
3
+ """`lighthouse-ai limits`: the spend limits in force, and whether they reached the engines.
4
4
 
5
- lighthouse limits
6
- lighthouse limits --json
5
+ lighthouse-ai limits
6
+ lighthouse-ai limits --json
7
7
 
8
8
  Reads `GET /api/v1/limits`: each limit's scope (`scope_kind` and `scope`),
9
9
  its period, its cap (`cap_usd`), what has been spent against it (`spent_usd`,
@@ -1,11 +1,11 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse login`, `logout` and `tokens`.
3
+ """`lighthouse-ai login`, `logout` and `tokens`.
4
4
 
5
- lighthouse login --host t7m2kqx9vbn.atlanticagenticlabs.com
6
- lighthouse login --scope "telemetry:read agents:read knowledge:read"
7
- lighthouse logout [--all]
8
- lighthouse tokens # every delegated token of mine, and revoke one
5
+ lighthouse-ai login --host t7m2kqx9vbn.atlanticagenticlabs.com
6
+ lighthouse-ai login --scope "telemetry:read agents:read knowledge:read"
7
+ lighthouse-ai logout [--all]
8
+ lighthouse-ai tokens # every delegated token of mine, and revoke one
9
9
 
10
10
  `login` runs the device flow (device.py), stores the token in the OS keychain
11
11
  (credentials.py), remembers the host in the profile file (config.py), and then
@@ -47,7 +47,7 @@ def _configure_login(ap: argparse.ArgumentParser) -> None:
47
47
  "(default: telemetry:read agents:read)")
48
48
  ap.add_argument("--no-browser", action="store_true", dest="no_browser",
49
49
  help="print the URL instead of opening a browser")
50
- ap.add_argument("--name", default="the lighthouse CLI",
50
+ ap.add_argument("--name", default="the lighthouse-ai CLI",
51
51
  help="how this sign-in is described in the portal and the audit log")
52
52
  ap.add_argument("--access-client-id", dest="access_client_id", metavar="ID",
53
53
  help="the tenant's Cloudflare Access service token id, to keep with "
@@ -1,10 +1,10 @@
1
1
  # Copyright 2026 Atlantic Agentic Labs. All Rights Reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
- """`lighthouse models`: the model library, with its evidence scores.
3
+ """`lighthouse-ai models`: the model library, with its evidence scores.
4
4
 
5
- lighthouse models
6
- lighthouse models --provider bedrock
7
- lighthouse models --json | jq '.items[] | select(.state == "available") | .model'
5
+ lighthouse-ai models
6
+ lighthouse-ai models --provider bedrock
7
+ lighthouse-ai models --json | jq '.items[] | select(.state == "available") | .model'
8
8
 
9
9
  Reads `GET /api/v1/models`. Price cards are shown to a client administrator and
10
10
  to AAL staff only, and the service decides that, not this command: a viewer's