lightnow-cli 1.2.0__tar.gz → 1.3.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.
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/.github/workflows/release.yml +24 -0
- lightnow_cli-1.3.1/.release-please-manifest.json +3 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/CHANGELOG.md +27 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/PKG-INFO +42 -1
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/README.md +40 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/docs/release.md +10 -6
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/__init__.py +1 -1
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/commands/auth.py +3 -1
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/commands/integrations.py +526 -34
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/config.py +139 -1
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/pyproject.toml +2 -1
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_cli.py +20 -3
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_config.py +117 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_integrations.py +512 -10
- lightnow_cli-1.2.0/.release-please-manifest.json +0 -3
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/.github/workflows/ci.yml +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/.github/workflows/release-please.yml +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/.gitignore +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/CONTRIBUTING.md +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/LICENSE +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/Makefile +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/SECURITY.md +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/docs/development.md +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/examples/README.md +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/examples/docs.md +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/examples/openapi.json +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/examples/server.json +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/authenticated_http.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/client.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/commands/__init__.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/commands/context.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/commands/publish.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/commands/query.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/commands/runner.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/commands/validate.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/main.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/tls.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/lightnow_cli/validation.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/release-please-config.json +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/__init__.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_auth_flow.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_authenticated_http.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_client.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_context.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_tls.py +0 -0
- {lightnow_cli-1.2.0 → lightnow_cli-1.3.1}/tests/test_validation.py +0 -0
|
@@ -96,3 +96,27 @@ jobs:
|
|
|
96
96
|
|
|
97
97
|
- name: Publish distributions to PyPI
|
|
98
98
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
99
|
+
|
|
100
|
+
update-homebrew:
|
|
101
|
+
name: Update Homebrew formula
|
|
102
|
+
runs-on: ubuntu-latest
|
|
103
|
+
needs: publish-pypi
|
|
104
|
+
|
|
105
|
+
steps:
|
|
106
|
+
- name: Dispatch published version to Homebrew tap
|
|
107
|
+
env:
|
|
108
|
+
GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
|
|
109
|
+
TAG_NAME: ${{ github.ref_name }}
|
|
110
|
+
run: |
|
|
111
|
+
version="${TAG_NAME#v}"
|
|
112
|
+
payload="$(jq -n \
|
|
113
|
+
--arg formula "lightnow-cli" \
|
|
114
|
+
--arg version "$version" \
|
|
115
|
+
'{event_type: "python-release-published", client_payload: {formula: $formula, version: $version}}')"
|
|
116
|
+
curl --fail-with-body --silent --show-error \
|
|
117
|
+
--request POST \
|
|
118
|
+
--header "Accept: application/vnd.github+json" \
|
|
119
|
+
--header "Authorization: Bearer ${GH_TOKEN}" \
|
|
120
|
+
--header "X-GitHub-Api-Version: 2022-11-28" \
|
|
121
|
+
https://api.github.com/repos/lightnow-ai/homebrew-tap/dispatches \
|
|
122
|
+
--data "$payload"
|
|
@@ -4,6 +4,33 @@ All notable changes to the LightNow CLI are documented here.
|
|
|
4
4
|
|
|
5
5
|
This project follows semantic versioning.
|
|
6
6
|
|
|
7
|
+
## [1.3.1](https://github.com/lightnow-ai/lightnow-cli/compare/v1.3.0...v1.3.1) (2026-07-17)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* **sync:** replace existing codex proxy connection ([c09b7f7](https://github.com/lightnow-ai/lightnow-cli/commit/c09b7f75f9d78c943ed7556b10b10ff99dbb2008))
|
|
13
|
+
|
|
14
|
+
## [1.3.0](https://github.com/lightnow-ai/lightnow-cli/compare/v1.2.0...v1.3.0) (2026-07-15)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
* **#7:** support account-bound proxy connections ([11b2f5a](https://github.com/lightnow-ai/lightnow-cli/commit/11b2f5a3806e2b9f67637e231783692aacdb78de))
|
|
20
|
+
* **#9:** device control plane ([0d1db03](https://github.com/lightnow-ai/lightnow-cli/commit/0d1db033be28b23e45d9ae38bc0c4754a0cd7380))
|
|
21
|
+
* **devices:** register local proxy client inventory ([ebcbe95](https://github.com/lightnow-ai/lightnow-cli/commit/ebcbe95a099d7b203a89c5886a5d90b300a47e38))
|
|
22
|
+
* support account-bound proxy connections ([6d9f3ad](https://github.com/lightnow-ai/lightnow-cli/commit/6d9f3ad8f633182e57ca8291a9eb297a6330fd72))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Bug Fixes
|
|
26
|
+
|
|
27
|
+
* address account-bound session review ([6e41fd8](https://github.com/lightnow-ai/lightnow-cli/commit/6e41fd881789a0f4ac287fd4abece0c69a964093))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
### Documentation
|
|
31
|
+
|
|
32
|
+
* **devices:** explain control plane registration ([f4329f5](https://github.com/lightnow-ai/lightnow-cli/commit/f4329f559ff43f4b501b500b19c3b40f57ad94bf))
|
|
33
|
+
|
|
7
34
|
## [1.2.0](https://github.com/lightnow-ai/lightnow-cli/compare/v1.1.0...v1.2.0) (2026-07-12)
|
|
8
35
|
|
|
9
36
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lightnow-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.1
|
|
4
4
|
Summary: Official LightNow CLI for MCP registry discovery, client config sync, and local MCP runner workflows
|
|
5
5
|
Project-URL: Homepage, https://github.com/lightnow-ai/lightnow-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/lightnow-ai/lightnow-cli
|
|
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
18
18
|
Classifier: Topic :: Software Development :: Build Tools
|
|
19
19
|
Classifier: Topic :: Utilities
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: filelock>=3.16.1
|
|
21
22
|
Requires-Dist: httpx>=0.24.0
|
|
22
23
|
Requires-Dist: jsonschema>=4.17.0
|
|
23
24
|
Requires-Dist: pydantic>=2.0.0
|
|
@@ -159,6 +160,40 @@ Then sync your client:
|
|
|
159
160
|
lightnow sync --client codex --local-proxy
|
|
160
161
|
```
|
|
161
162
|
|
|
163
|
+
### Multiple accounts and organizations
|
|
164
|
+
|
|
165
|
+
Each Local Proxy connection can have its own client alias, LightNow login,
|
|
166
|
+
profile and personal or tenant scope. The sync command binds the connection to
|
|
167
|
+
the account that is signed in at that moment; signing in with another account
|
|
168
|
+
later does not silently move an existing connection.
|
|
169
|
+
Connection aliases are either `lightnow` or start with `lightnow-` or
|
|
170
|
+
`lightnow_`, so they remain TOML-safe and distinguishable from unmanaged local
|
|
171
|
+
MCP servers.
|
|
172
|
+
|
|
173
|
+
For example, configure personal and organization connections side by side:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
lightnow login
|
|
177
|
+
lightnow sync --client codex --local-proxy \
|
|
178
|
+
--connection lightnow-personal --profile default
|
|
179
|
+
|
|
180
|
+
# Sign in with the organization account before creating this connection.
|
|
181
|
+
lightnow login
|
|
182
|
+
lightnow sync --client codex --local-proxy \
|
|
183
|
+
--connection lightnow-acme --tenant <tenant-id> --profile engineering
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Codex then exposes both `lightnow-personal` and `lightnow-acme`. Re-run sync
|
|
187
|
+
with the same `--connection` value to update that connection. Account-bound
|
|
188
|
+
sessions are stored separately under `~/.lightnow/sessions/`; proxy YAML files
|
|
189
|
+
contain only their path and expected identity, never access or refresh tokens.
|
|
190
|
+
|
|
191
|
+
Use `lightnow config-status --client codex --json` to inspect all connections,
|
|
192
|
+
including their non-secret account, scope, profile and session-binding status.
|
|
193
|
+
Signing in to another account preserves existing bound sessions. An explicit
|
|
194
|
+
`lightnow logout` removes the active account's named session, so proxies bound
|
|
195
|
+
to that account stop authenticating until it is signed in and synced again.
|
|
196
|
+
|
|
162
197
|
Other common clients:
|
|
163
198
|
|
|
164
199
|
```bash
|
|
@@ -187,6 +222,12 @@ lightnow config-status --client cursor --json
|
|
|
187
222
|
lightnow config-status --client vscode --json
|
|
188
223
|
```
|
|
189
224
|
|
|
225
|
+
With metadata telemetry enabled, each Local Proxy sync also registers the
|
|
226
|
+
machine and its client-specific Runtime Profile in the LightNow Control Plane.
|
|
227
|
+
The CLI stores a stable installation UUID in its protected configuration and a
|
|
228
|
+
separate stable client-instance UUID in each generated proxy configuration. It
|
|
229
|
+
does not report IP or MAC addresses, serial numbers, local paths, or secrets.
|
|
230
|
+
|
|
190
231
|
For details, examples, diagrams and troubleshooting, see
|
|
191
232
|
[Connect MCP clients](https://docs.lightnow.ai/getting-started/sync-mcp-clients).
|
|
192
233
|
|
|
@@ -113,6 +113,40 @@ Then sync your client:
|
|
|
113
113
|
lightnow sync --client codex --local-proxy
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
+
### Multiple accounts and organizations
|
|
117
|
+
|
|
118
|
+
Each Local Proxy connection can have its own client alias, LightNow login,
|
|
119
|
+
profile and personal or tenant scope. The sync command binds the connection to
|
|
120
|
+
the account that is signed in at that moment; signing in with another account
|
|
121
|
+
later does not silently move an existing connection.
|
|
122
|
+
Connection aliases are either `lightnow` or start with `lightnow-` or
|
|
123
|
+
`lightnow_`, so they remain TOML-safe and distinguishable from unmanaged local
|
|
124
|
+
MCP servers.
|
|
125
|
+
|
|
126
|
+
For example, configure personal and organization connections side by side:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
lightnow login
|
|
130
|
+
lightnow sync --client codex --local-proxy \
|
|
131
|
+
--connection lightnow-personal --profile default
|
|
132
|
+
|
|
133
|
+
# Sign in with the organization account before creating this connection.
|
|
134
|
+
lightnow login
|
|
135
|
+
lightnow sync --client codex --local-proxy \
|
|
136
|
+
--connection lightnow-acme --tenant <tenant-id> --profile engineering
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Codex then exposes both `lightnow-personal` and `lightnow-acme`. Re-run sync
|
|
140
|
+
with the same `--connection` value to update that connection. Account-bound
|
|
141
|
+
sessions are stored separately under `~/.lightnow/sessions/`; proxy YAML files
|
|
142
|
+
contain only their path and expected identity, never access or refresh tokens.
|
|
143
|
+
|
|
144
|
+
Use `lightnow config-status --client codex --json` to inspect all connections,
|
|
145
|
+
including their non-secret account, scope, profile and session-binding status.
|
|
146
|
+
Signing in to another account preserves existing bound sessions. An explicit
|
|
147
|
+
`lightnow logout` removes the active account's named session, so proxies bound
|
|
148
|
+
to that account stop authenticating until it is signed in and synced again.
|
|
149
|
+
|
|
116
150
|
Other common clients:
|
|
117
151
|
|
|
118
152
|
```bash
|
|
@@ -141,6 +175,12 @@ lightnow config-status --client cursor --json
|
|
|
141
175
|
lightnow config-status --client vscode --json
|
|
142
176
|
```
|
|
143
177
|
|
|
178
|
+
With metadata telemetry enabled, each Local Proxy sync also registers the
|
|
179
|
+
machine and its client-specific Runtime Profile in the LightNow Control Plane.
|
|
180
|
+
The CLI stores a stable installation UUID in its protected configuration and a
|
|
181
|
+
separate stable client-instance UUID in each generated proxy configuration. It
|
|
182
|
+
does not report IP or MAC addresses, serial numbers, local paths, or secrets.
|
|
183
|
+
|
|
144
184
|
For details, examples, diagrams and troubleshooting, see
|
|
145
185
|
[Connect MCP clients](https://docs.lightnow.ai/getting-started/sync-mcp-clients).
|
|
146
186
|
|
|
@@ -19,6 +19,9 @@ Required GitHub setup:
|
|
|
19
19
|
- Repository secret: `RELEASE_PLEASE_TOKEN`
|
|
20
20
|
- Token permissions: contents, pull requests, and issues read/write for this
|
|
21
21
|
repository
|
|
22
|
+
- Repository secret: `HOMEBREW_TAP_TOKEN`
|
|
23
|
+
- Token permissions: contents read/write for `lightnow-ai/homebrew-tap`; the
|
|
24
|
+
token is used only to send the post-PyPI repository dispatch
|
|
22
25
|
- Repository Actions setting: allow GitHub Actions to create pull requests
|
|
23
26
|
|
|
24
27
|
Use a real PAT or GitHub App token for `RELEASE_PLEASE_TOKEN`, not the default
|
|
@@ -33,7 +36,9 @@ Normal release flow:
|
|
|
33
36
|
4. Release Please creates the `vX.Y.Z` tag and GitHub Release.
|
|
34
37
|
5. The existing tag-based `Release` workflow builds and publishes PyPI
|
|
35
38
|
distributions through Trusted Publishing.
|
|
36
|
-
6.
|
|
39
|
+
6. After PyPI succeeds, the release workflow dispatches the exact published
|
|
40
|
+
version to `lightnow-ai/homebrew-tap`. The tap regenerates, audits, installs,
|
|
41
|
+
and tests the formula before committing it.
|
|
37
42
|
|
|
38
43
|
Manual release checklist for fallback or first-time setup:
|
|
39
44
|
|
|
@@ -64,11 +69,10 @@ Manual release checklist for fallback or first-time setup:
|
|
|
64
69
|
- `twine check` passes,
|
|
65
70
|
- a GitHub Release is created with generated release notes and distribution artifacts,
|
|
66
71
|
- PyPI publish succeeds through Trusted Publishing.
|
|
67
|
-
8.
|
|
68
|
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
- run `brew audit`, `brew install --build-from-source`, and `brew test`.
|
|
72
|
+
8. Verify the `Update formula` workflow in `lightnow-ai/homebrew-tap`. For a
|
|
73
|
+
recovery run, dispatch it manually with formula `lightnow-cli` and the exact
|
|
74
|
+
already-published version; it uses the same generation and verification path
|
|
75
|
+
as the automatic release dispatch.
|
|
72
76
|
|
|
73
77
|
Do not publish with long-lived local PyPI tokens.
|
|
74
78
|
|
|
@@ -412,8 +412,10 @@ def login(
|
|
|
412
412
|
config_manager.set_token(
|
|
413
413
|
token,
|
|
414
414
|
refresh_token if isinstance(refresh_token, str) else None,
|
|
415
|
-
|
|
415
|
+
user_info,
|
|
416
|
+
update_active_session=False,
|
|
416
417
|
)
|
|
418
|
+
config_manager.persist_current_session(user_info)
|
|
417
419
|
|
|
418
420
|
console.print("[bold green]✓ Authentication successful![/bold green]")
|
|
419
421
|
if user_info:
|