Skip to content

fix: prevent CLI crash and slow startup on restricted network environments#677

Draft
Copilot wants to merge 3 commits intodevelopmentfrom
copilot/fix-cmf-cli-startup-issues
Draft

fix: prevent CLI crash and slow startup on restricted network environments#677
Copilot wants to merge 3 commits intodevelopmentfrom
copilot/fix-cmf-cli-startup-issues

Conversation

Copy link
Contributor

Copilot AI commented Mar 13, 2026

On systems with limited or no internet access, the CLI crashes even on trivial commands like cmf --help due to an unguarded HTTP call during credential initialization, and incurs up to 10s of startup latency from a synchronous NPM version check.

Root causes

  • Crash: GetPortalBearerToken() used new HttpClient() with the default 100s timeout and no exception handling. This was invoked synchronously at startup via CIFSClientRepositoryAuthStore.GetOrLoad()AddDerivedCredentials(), causing a TaskCanceledException to propagate and terminate the process.
  • Slow startup: await VersionChecks() in StartupModule.Configure() blocked startup while waiting on an NPM HTTP request (10s timeout), multiplying across every CLI invocation in a pipeline.

Changes

  • PortalRepositoryCredentials.GetPortalBearerToken(): Added a 10-second HttpClient.Timeout and wrapped the call in try/catch — failure returns an empty token and logs to debug instead of crashing.

  • StartupModule.Configure(): Version check is now fire-and-forget via Task.Run(VersionChecks), with a ContinueWith handler for fault logging. Warnings still surface during or after command execution without blocking startup.

  • StartupModule.VersionChecks(): Wrapped body in try/catch for additional resilience in background execution.

  • Skip version check via env var: Set cmf_cli_skip_version_check=true to bypass the NPM check entirely — useful in air-gapped or latency-sensitive CI/CD pipelines (e.g. 15 CLI calls × 10s = 5min saved).

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 0t3vsblobprodcus362.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • 1javsblobprodcus364.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • 2zrvsblobprodcus388.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • 37bvsblobprodcus311.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/805D52E7EE3FA52FA925C0777AB38A1A/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
  • 37cvsblobprodcus359.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • 4m6vsblobprodcus384.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • 4vyvsblobprodcus361.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • 5dkvsblobprodcus355.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • 6s7vsblobprodcus313.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/4F7589826F2A89155EECC7AE6AF07225/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot ame git (dns block)
  • 80zvsblobprodcus35.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/cli/cli/cmf-cli/resources/template_feed/iot/driver-dotnet-framework/src/%directoryname%/dotnet/Cmf.Connect.IoT.Driver.%driveridentifier%/Cmf.Connect.IoT.Driver.%driveridentifier%.csproj --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • bcnvsblobprodcus378.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/cli/cli/cmf-cli/resources/template_feed/iot/driver-dotnet-framework/src/%directoryname%/dotnet/Cmf.Connect.IoT.Driver.%driveridentifier%/Cmf.Connect.IoT.Driver.%driveridentifier%.csproj --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • c50vsblobprodcus330.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/CB3D70C1C3CCEDE61E9080295E05A90C/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
  • c78vsblobprodcus322.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • ckzvsblobprodcus347.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/4FDC7FF0E07E7718C693F8BBB717A7B7/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
  • dev.criticalmanufacturing.io
    • Triggering command: /home/REDACTED/work/_temp/ghcca-node/node/bin/node node /home/REDACTED/work/_temp/ghcca-node/node/bin/npm install --ignore-scripts (dns block)
  • fdpvsblobprodcus345.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/cli/cli/cmf-cli/resources/template_feed/iot/driver-dotnet-framework/src/%directoryname%/dotnet/Cmf.Connect.IoT.Driver.%driveridentifier%/Cmf.Connect.IoT.Driver.%driveridentifier%.csproj --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • frdvsblobprodcus327.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/cli/cli/cmf-cli/resources/template_feed/iot/driver-dotnet-framework/src/%directoryname%/dotnet/Cmf.Connect.IoT.Driver.%driveridentifier%/Cmf.Connect.IoT.Driver.%driveridentifier%.csproj --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • h6tvsblobprodcus346.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • i1qvsblobprodcus353.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/cli/cli/cmf-cli/resources/template_feed/iot/driver-dotnet-framework/src/%directoryname%/dotnet/Cmf.Connect.IoT.Driver.%driveridentifier%/Cmf.Connect.IoT.Driver.%driveridentifier%.csproj --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • imzvsblobprodcus368.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/5707D9CCD3909344C2384588AB311A3D/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/C5FB799EDCBCE6E42AAC137FC50336BD/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force dotn�� (dns block)
  • jd4vsblobprodcus366.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/805D52E7EE3FA52FA925C0777AB38A1A/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
  • josvsblobprodcus372.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/4F7589826F2A89155EECC7AE6AF07225/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot ame git (dns block)
  • kh4vsblobprodcus325.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/C5FB799EDCBCE6E42AAC137FC50336BD/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force dotn�� (dns block)
  • kijvsblobprodcus387.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/4F7589826F2A89155EECC7AE6AF07225/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot ame git (dns block)
  • kmuvsblobprodcus389.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/4F7589826F2A89155EECC7AE6AF07225/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot ame git (dns block)
  • kxqvsblobprodcus376.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • l49vsblobprodcus358.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • m6xvsblobprodcus342.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/4F7589826F2A89155EECC7AE6AF07225/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot ame git (dns block)
  • n3kvsblobprodcus335.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/805D52E7EE3FA52FA925C0777AB38A1A/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
  • p2ovsblobprodcus312.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/BEB87418A7BF3638F93672E958291CF3/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force dotn�� (dns block)
  • pc2vsblobprodcus360.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/9AD52665EE337AD34E199FEDA8966CF2/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ules�� (dns block)
  • pe3vsblobprodcus354.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/805D52E7EE3FA52FA925C0777AB38A1A/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)
  • pe4vsblobprodcus351.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • s8mvsblobprodcus38.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/E2EB9976A40F4DC5FBB271712D4D6FD6/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • sc4vsblobprodcus331.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • se1vsblobprodcus349.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • security.criticalmanufacturing.com
    • Triggering command: /usr/share/dotnet/dotnet /usr/share/dotnet/dotnet exec --runtimeconfig /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/tests.runtimeconfig.json --depsfile /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/tests.deps.json /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/testhost.dll --port 44509 --endpoint 127.0.0.1:044509 --role client --parentprocessid 4972 --telemetryoptedin false (dns block)
    • Triggering command: /usr/share/dotnet/dotnet /usr/share/dotnet/dotnet exec --runtimeconfig /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/tests.runtimeconfig.json --depsfile /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/tests.deps.json /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/testhost.dll --port 46831 --endpoint 127.0.0.1:046831 --role client --parentprocessid 5746 --telemetryoptedin false (dns block)
    • Triggering command: /usr/share/dotnet/dotnet /usr/share/dotnet/dotnet exec --runtimeconfig /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/tests.runtimeconfig.json --depsfile /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/tests.deps.json /home/REDACTED/work/cli/cli/tests/bin/Debug/net8.0/testhost.dll --port 33989 --endpoint 127.0.0.1:033989 --role client --parentprocessid 13085 --telemetryoptedin false (dns block)
  • u3hvsblobprodcus371.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • uy6vsblobprodcus34.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore cmf-cli.sln (dns block)
  • x3yvsblobprodcus370.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /home/REDACTED/work/cli/cli/cmf-cli/resources/template_feed/iot/driver-dotnet-framework/src/%directoryname%/dotnet/Cmf.Connect.IoT.Driver.%driveridentifier%/Cmf.Connect.IoT.Driver.%driveridentifier%.csproj --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true (dns block)
  • xupvsblobprodcus332.vsblob.vsassets.io
    • Triggering command: /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/.dotnet/dotnet restore --no-dependencies /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/CB3D70C1C3CCEDE61E9080295E05A90C/missingpackages_workingdir --packages /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-230535457ed4531d/dbs/csharp/working/nugetconfig/nuget.config --force ng/emptyFakeDotnetRoot ing/emptyFakeDotnetRoot (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

This section details on the original issue you should resolve

<issue_title>The cmf-cli startup very slow or even crash on even commands like --help</issue_title>
<issue_description>The situation happens on simple commands like cmf --help or any other command.

The main suspicious is linked to the cmf cli on startup making a request to know which is the latest version available.
On system where the network is very limited or even there is none to the internet, this might even crash. Below is an example of one of those crashes:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
     System.Threading.Tasks.TaskCanceledException: The request was canceled due to the configured HttpClient.Timeout of 100 seconds elapsing.                                                                                                                                                   
          System.TimeoutException: The operation was canceled.                                                                                                                                                                                                                                  
             System.Threading.Tasks.TaskCanceledException: The operation was canceled.                                                                                                                                                                                                          
                  System.IO.IOException: Unable to read data from the transport connection: Operation canceled.                                                                                                                                                                                 
                       System.Net.Sockets.SocketException: Operation canceled                                                                                                                                                                                                                   
                    at void System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)                                                                                                                                      
                    at int System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(short token)                                                                                                                         
                    at async ValueTask<int> System.Net.Security.SslStream.EnsureFullTlsFrameAsync<TIOAdapter>(CancellationToken cancellationToken, int estimatedSize)                                                                                                                           
                    at TResult System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(short token)                                                                                           
                    at async ValueTask<int> System.Net.Security.SslStream.ReadAsyncInternal<TIOAdapter>(Memory<byte> buffer, CancellationToken cancellationToken)                                                                                                                               
                    at TResult System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(short token)                                                                                           
                    at async ValueTask System.Net.Http.HttpConnection.InitialFillAsync(bool async)                                                                                                                                                                                              
                    at async Task<HttpResponseMessage> System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, bool async, CancellationToken cancellationToken)                                                                                                                    
               at async Task<HttpResponseMessage> System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, bool async, CancellationToken cancellationToken)                                                                                                                         
               at async ValueTask<HttpResponseMessage> System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, bool async, bool doRequestAuth, CancellationToken cancellationToken)                                                                
             ...

</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

- Fixes criticalmanufacturing/cli#668

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for you](https://github.com/criticalmanufacturing/cli/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 2 commits March 13, 2026 15:05
- Add short 10-second timeout and exception handling to GetPortalBearerToken()
  to prevent crash and long wait when network is unavailable
- Run VersionChecks() in background to not block startup
- Support cmf_cli_skip_version_check env var to skip version check in CI/CD"

Co-authored-by: joaoopereira <3718704+joaoopereira@users.noreply.github.com>
Co-authored-by: joaoopereira <3718704+joaoopereira@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix cmf-cli slow startup and crash on commands fix: prevent CLI crash and slow startup on restricted network environments Mar 13, 2026
Copilot AI requested a review from joaoopereira March 13, 2026 15:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants