lightnow-cli 1.0.4__tar.gz → 1.0.5__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.0.4 → lightnow_cli-1.0.5}/PKG-INFO +1 -1
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/__init__.py +1 -1
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/integrations.py +9 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/pyproject.toml +1 -1
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_cli.py +1 -1
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_integrations.py +29 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/.github/workflows/ci.yml +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/.github/workflows/release.yml +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/.gitignore +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/CHANGELOG.md +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/CONTRIBUTING.md +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/LICENSE +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/Makefile +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/README.md +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/SECURITY.md +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/docs/development.md +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/docs/release.md +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/examples/README.md +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/examples/docs.md +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/examples/openapi.json +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/examples/server.json +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/authenticated_http.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/client.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/__init__.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/auth.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/context.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/publish.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/query.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/runner.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/validate.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/config.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/main.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/tls.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/validation.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/__init__.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_auth_flow.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_authenticated_http.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_client.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_config.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_context.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_tls.py +0 -0
- {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_validation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lightnow-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.5
|
|
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
|
|
@@ -99,6 +99,9 @@ LOCAL_LIGHTNOW_CA_RELATIVE_PATH = Path(".local-runtime/certs/lightnow-local-ca.c
|
|
|
99
99
|
LOCAL_PROXY_EXECUTABLE = "lightnow-proxy"
|
|
100
100
|
LEGACY_LOCAL_PROXY_EXECUTABLE = "mcp-proxy"
|
|
101
101
|
LIGHTNOW_PROXY_ALIASES = {"lightnow", "LightNow"}
|
|
102
|
+
CLIENT_INTERNAL_MCP_SERVERS = {
|
|
103
|
+
"codex": {"node_repl"},
|
|
104
|
+
}
|
|
102
105
|
LOCAL_PROXY_RUNNER_VERSION = "0.1.2"
|
|
103
106
|
VSCODE_VIRTUAL_TOOLS_THRESHOLD_SETTING = "github.copilot.chat.virtualTools.threshold"
|
|
104
107
|
VSCODE_VIRTUAL_TOOLS_THRESHOLD = 128
|
|
@@ -1330,9 +1333,11 @@ def analyze_client_config_content(
|
|
|
1330
1333
|
local_proxy_aliases: list[str] = []
|
|
1331
1334
|
local_proxy_commands: list[str] = []
|
|
1332
1335
|
legacy_runner_servers: list[str] = []
|
|
1336
|
+
internal_servers: list[str] = []
|
|
1333
1337
|
unmanaged_servers: list[str] = []
|
|
1334
1338
|
proxy_config_path = str(expected_proxy_config_path.expanduser())
|
|
1335
1339
|
warnings: list[str] = []
|
|
1340
|
+
client_internal_servers = CLIENT_INTERNAL_MCP_SERVERS.get(client, set())
|
|
1336
1341
|
for alias, entry in entries.items():
|
|
1337
1342
|
raw_command = entry.get("command")
|
|
1338
1343
|
command: str = raw_command if isinstance(raw_command, str) else ""
|
|
@@ -1362,6 +1367,9 @@ def analyze_client_config_content(
|
|
|
1362
1367
|
if is_lightnow_runner:
|
|
1363
1368
|
legacy_runner_servers.append(alias)
|
|
1364
1369
|
continue
|
|
1370
|
+
if alias in client_internal_servers:
|
|
1371
|
+
internal_servers.append(alias)
|
|
1372
|
+
continue
|
|
1365
1373
|
unmanaged_servers.append(alias)
|
|
1366
1374
|
|
|
1367
1375
|
if local_proxy_aliases and not unmanaged_servers and not legacy_runner_servers:
|
|
@@ -1384,6 +1392,7 @@ def analyze_client_config_content(
|
|
|
1384
1392
|
"local_proxy_present": bool(local_proxy_aliases),
|
|
1385
1393
|
"local_proxy_aliases": sorted(local_proxy_aliases),
|
|
1386
1394
|
"local_proxy_commands": sorted(set(local_proxy_commands)),
|
|
1395
|
+
"internal_servers": sorted(internal_servers),
|
|
1387
1396
|
"unmanaged_servers": sorted(unmanaged_servers),
|
|
1388
1397
|
"legacy_runner_servers": sorted(legacy_runner_servers),
|
|
1389
1398
|
"warnings": sorted(set(warnings)),
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "lightnow-cli"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.5"
|
|
8
8
|
description = "Official LightNow CLI for MCP registry discovery, client config sync, and local MCP runner workflows"
|
|
9
9
|
authors = [{name = "LightNow Team"}]
|
|
10
10
|
license = {text = "Apache-2.0"}
|
|
@@ -52,7 +52,7 @@ def test_cli_version(runner):
|
|
|
52
52
|
"""Test CLI version command."""
|
|
53
53
|
result = runner.invoke(app, ["--version"])
|
|
54
54
|
assert result.exit_code == 0
|
|
55
|
-
assert "LightNow CLI 1.0.
|
|
55
|
+
assert "LightNow CLI 1.0.5" in result.stdout
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
def test_cli_help(runner):
|
|
@@ -36,6 +36,7 @@ from lightnow_cli.commands.integrations import (
|
|
|
36
36
|
prepare_json_local_proxy_config,
|
|
37
37
|
print_import_summary,
|
|
38
38
|
redact,
|
|
39
|
+
render_local_proxy_codex_stdio_toml,
|
|
39
40
|
render_local_proxy_codex_toml,
|
|
40
41
|
render_runner_config,
|
|
41
42
|
secure_write_text,
|
|
@@ -512,6 +513,34 @@ def test_analyzes_managed_codex_local_proxy_config() -> None:
|
|
|
512
513
|
assert status["unmanaged_servers"] == []
|
|
513
514
|
|
|
514
515
|
|
|
516
|
+
def test_analyzes_codex_local_proxy_with_internal_node_repl_as_managed() -> None:
|
|
517
|
+
"""Codex may add internal MCP plumbing that should not be reported as bypass drift."""
|
|
518
|
+
content = (
|
|
519
|
+
render_local_proxy_codex_stdio_toml(Path("/tmp/lightnow/codex.yaml")) + """
|
|
520
|
+
|
|
521
|
+
[mcp_servers.node_repl]
|
|
522
|
+
command = "/Applications/Codex.app/Contents/Resources/cua_node/bin/node_repl"
|
|
523
|
+
args = []
|
|
524
|
+
startup_timeout_sec = 120
|
|
525
|
+
|
|
526
|
+
[mcp_servers.node_repl.env]
|
|
527
|
+
CODEX_HOME = "/Users/example/.codex"
|
|
528
|
+
"""
|
|
529
|
+
)
|
|
530
|
+
|
|
531
|
+
status = analyze_client_config_content(
|
|
532
|
+
client="codex",
|
|
533
|
+
export_format="toml",
|
|
534
|
+
content=content,
|
|
535
|
+
expected_proxy_config_path=Path("/tmp/lightnow/codex.yaml"),
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
assert status["status"] == "managed"
|
|
539
|
+
assert status["local_proxy_aliases"] == ["lightnow"]
|
|
540
|
+
assert status["internal_servers"] == ["node_repl"]
|
|
541
|
+
assert status["unmanaged_servers"] == []
|
|
542
|
+
|
|
543
|
+
|
|
515
544
|
def test_analyzes_mixed_json_config_with_unmanaged_servers() -> None:
|
|
516
545
|
"""Posture scanner reports bypassable client config entries."""
|
|
517
546
|
content = json.dumps(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|