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.
Files changed (42) hide show
  1. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/PKG-INFO +1 -1
  2. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/__init__.py +1 -1
  3. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/integrations.py +9 -0
  4. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/pyproject.toml +1 -1
  5. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_cli.py +1 -1
  6. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_integrations.py +29 -0
  7. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/.github/workflows/ci.yml +0 -0
  8. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/.github/workflows/release.yml +0 -0
  9. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/.gitignore +0 -0
  10. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/CHANGELOG.md +0 -0
  11. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/CONTRIBUTING.md +0 -0
  12. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/LICENSE +0 -0
  13. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/Makefile +0 -0
  14. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/README.md +0 -0
  15. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/SECURITY.md +0 -0
  16. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/docs/development.md +0 -0
  17. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/docs/release.md +0 -0
  18. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/examples/README.md +0 -0
  19. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/examples/docs.md +0 -0
  20. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/examples/openapi.json +0 -0
  21. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/examples/server.json +0 -0
  22. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/authenticated_http.py +0 -0
  23. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/client.py +0 -0
  24. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/__init__.py +0 -0
  25. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/auth.py +0 -0
  26. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/context.py +0 -0
  27. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/publish.py +0 -0
  28. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/query.py +0 -0
  29. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/runner.py +0 -0
  30. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/commands/validate.py +0 -0
  31. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/config.py +0 -0
  32. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/main.py +0 -0
  33. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/tls.py +0 -0
  34. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/lightnow_cli/validation.py +0 -0
  35. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/__init__.py +0 -0
  36. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_auth_flow.py +0 -0
  37. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_authenticated_http.py +0 -0
  38. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_client.py +0 -0
  39. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_config.py +0 -0
  40. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_context.py +0 -0
  41. {lightnow_cli-1.0.4 → lightnow_cli-1.0.5}/tests/test_tls.py +0 -0
  42. {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.4
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
@@ -1,3 +1,3 @@
1
1
  """LightNow CLI - A command-line tool for managing MCP servers."""
2
2
 
3
- __version__ = "1.0.4"
3
+ __version__ = "1.0.5"
@@ -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.4"
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.4" in result.stdout
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