Skip to content

feat(mcp): add doctor --fix/--bundle, VS Code diagnostics, and JSONC support - #326

Merged
yiftach-armis merged 12 commits into
mainfrom
feat/PPSC-1499-mcp-doctor-fix-bundle-vscode
Sep 23, 2026
Merged

yiftach-armis merged 12 commits into
mainfrom
feat/PPSC-1499-mcp-doctor-fix-bundle-vscode

Conversation

@yiftach-armis

@yiftach-armis yiftach-armis commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator

Jira Ticket

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Refactoring (no functional changes)
  • Performance improvement

Problem

mcp doctor could tell users something was wrong, but not fix it, and it missed the failures that actually cause most support requests: a stale VS Code/Copilot config, a broken proxy or TLS setup between the MCP server and the Armis API, or a venv left over from an uninstalled Python. There was also a parsing bug — VS Code's mcp.json/settings.json are JSONC (comments, trailing commas, a possible BOM), but the CLI parsed them as strict JSON, so a hand-edited file was treated as empty and install silently dropped the user's other MCP servers.

Solution

  • mcp doctor --fix re-registers editors, rebuilds a broken venv, and (when verified to work) writes the system proxy into the server's .env.
  • mcp doctor --bundle/--bundle-path writes a support zip (report, server stderr/logs, VS Code's MCP log) with credentials scrubbed.
  • The doctor now runs a full MCP session (initialize, tools/list, a diagnostic tool call) using each editor's own launch config, checks that client credentials are accepted by the API, and checks that the server's own Python runtime (not just the CLI) can reach the Armis API — which is where proxy/TLS-inspection problems actually show up.
  • Added VS Code/Copilot-specific checks: other VS Code builds (Insiders, VSCodium), per-profile and workspace configs, duplicate/stale entries, chat.mcp.*/chat.agent.enabled settings, Windows Group Policy, and VS Code's own MCP server log.
  • Added a JSONC parser (internal/install/jsonc.go) used everywhere VS Code config files are read/written, fixing the bug where comments or trailing commas caused install to treat the file as empty.
  • WriteEnvFromValues/new SetEnvFileVars now preserve other variables (e.g. HTTPS_PROXY, SSL_CERT_FILE) already in the plugin's .env instead of overwriting the file.

Testing

Automated Tests

  • Unit tests added/updated (internal/cmd/mcp_doctor_test.go, internal/install/doctor_checks_test.go, internal/install/doctor_probe.go helper coverage, internal/install/doctor_test.go updates)
  • Integration tests added/updated
  • All tests passing locally

Manual Testing

Reviewer Notes

  • checkServerNetwork/tryProxyFix in internal/install/doctor_probe.go spawn the server's Python interpreter to run live network probes — worth double-checking the command construction and timeouts.
  • Support bundle scrubbing (internal/install/doctor_bundle.go) is a second layer on top of never including credential values in the first place; worth confirming the secret-scrub list covers what's collected.

Checklist

  • Code follows project style guidelines (black, isort, ruff)
  • Pre-commit hooks pass
  • Self-review performed
  • Documentation updated (if needed)
  • Breaking changes documented (if applicable)
  • No new warnings generated
  • Logging added for key operations and error paths (if applicable)
  • CloudWatch metrics added for monitoring critical flows (if applicable)

Screenshots (if applicable)

- Doctor now auto-repairs stale registrations/venvs (`--fix`) and writes
  a credential-scrubbed support bundle (`--bundle`) for hand-off to
  Armis support.
- Live checks upgraded from a bare initialize handshake to a full MCP
  session (tools/list + a debug_config tool call), plus network/auth
  probes run through the server's own Python runtime to catch
  TLS-inspection and proxy issues the CLI's Go client wouldn't see.
- VS Code/Copilot gets dedicated checks (profiles, workspace configs,
  duplicate entries, disabling settings, Group Policy, MCP logs) since
  its MCP wiring has the most silent-failure modes; JSONC parsing
  (`jsonc.go`) keeps hand-edited `mcp.json` comments from being
  misread as invalid or wiping out other servers on re-registration.
- `mcp doctor --fix` now detects when the OS has a working system proxy
  the server isn't using, and writes it to .env instead of just
  re-registering/reinstalling.
- Writing credentials (install or doctor) no longer clobbers other
  vars already in .env (HTTPS_PROXY, SSL_CERT_FILE), and parses
  mcp.json/settings.json as JSONC so comments/BOM don't wipe them out.
- Network probe reports and reasons about which CA source (certifi vs
  system store) the server's Python runtime is using.
Copilot AI lite review requested due to automatic review settings September 23, 2026 12:00
@github-actions

github-actions Bot commented Sep 23, 2026

Copy link
Copy Markdown

Test Coverage Report

total: (statements) 72.4%

Coverage by function
github.com/ArmisSecurity/armis-cli/cmd/armis-cli/main.go:19:				main					0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/agent.go:43:			Registry				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/agent.go:83:			RegisteredAgentDisplayNames		85.7%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/agentdetect.go:29:		FlatResults				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/agentdetect.go:45:		NewScanner				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/agentdetect.go:53:		Scan					82.4%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:12:			resolvePath				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:23:			isUnderDir				81.8%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:46:			dirExists				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:56:			fileExists				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:67:			hasExtensionPrefix			80.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:88:			findExtensionVersion			64.3%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:111:		readVersionFromPackageJSON		71.4%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:127:		hasJetBrainsPlugin			100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:140:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:142:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:147:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:151:		DetectVersion				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:159:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:161:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:171:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:175:		DetectVersion				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:183:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:185:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:189:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:193:		DetectVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:201:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:203:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:216:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:224:		DetectVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:232:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:234:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:241:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:245:		DetectVersion				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:253:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:255:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:262:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:268:		DetectVersion				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:276:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:278:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:285:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:289:		DetectVersion				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:297:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:299:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:306:		CheckMCP				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:310:		DetectVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:318:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:320:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:324:		CheckMCP				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:328:		DetectVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:336:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:338:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:342:		CheckMCP				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:346:		DetectVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:354:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:356:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:366:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:370:		DetectVersion				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:378:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:380:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:395:		CheckMCP				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:399:		DetectVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:407:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:409:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:417:		CheckMCP				75.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:425:		DetectVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:433:		Name					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:435:		Detect					100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:439:		CheckMCP				83.3%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/detector.go:460:		DetectVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/format.go:13:			FormatPlain				78.6%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/format.go:62:			anyMCPMissing				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/format.go:74:			FormatJSON				100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/mcpconfig.go:19:		HasArmisMCP				83.3%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/mcpconfig.go:40:		HasArmisMCPInClaudeSettings		86.7%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/mcpconfig.go:68:		HasArmisMCPInZedSettings		66.7%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/mcpconfig.go:98:		HasArmisMCPInVSCodeFormat		75.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/mcpconfig.go:122:		hasArmisMCPInData			100.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:13:		NewPlatform				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:17:		UserHomeDirs				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:25:		VSCodeExtensionsDir			0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:30:		JetBrainsPluginDirs			0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:35:		VSCodeUserConfigDir			0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:39:		CursorAppExists				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:43:		JunieBinaryPaths			0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:51:		ZedConfigDir				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/platform_linux.go:55:		IsRoot					0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/userprofile.go:13:		enumerateUserDirs			0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/userprofile.go:41:		currentUserOnly				0.0%
github.com/ArmisSecurity/armis-cli/internal/agentdetect/userprofile.go:56:		globJetBrainsPluginDirs			0.0%
github.com/ArmisSecurity/armis-cli/internal/api/agents.go:30:				ReportAgentInventory			78.9%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:31:				Error					0.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:63:				isLoopbackHost				100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:87:				copyWithContext				70.4%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:161:				WithHTTPClient				100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:170:				WithUploadHTTPClient			100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:178:				WithAllowLocalURLs			100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:202:				WithLocalS3Hosts			100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:220:				NewClient				100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:268:				IsDebug					100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:276:				BaseURL					0.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:290:				setAuthHeader				77.8%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:343:				StartIngest				100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:392:				createPresignedUpload			80.8%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:454:				uploadToPresignedURL			89.5%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:505:				buildMultipartEnvelope			80.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:537:				startArtifactScan			75.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:593:				GetIngestStatus				82.6%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:637:				WaitForIngest				84.6%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:688:				FetchNormalizedResults			74.2%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:743:				FetchAllNormalizedResults		91.7%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:769:				GetScanResult				68.4%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:804:				WaitForScan				90.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:825:				formatBytes				100.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:855:				SkipMessage				0.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:867:				FetchArtifactScanResults		75.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:955:				ValidatePresignedURL			95.0%
github.com/ArmisSecurity/armis-cli/internal/api/client.go:1045:				DownloadFromPresignedURL		84.2%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:90:				NewProviderFromStored			60.0%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:107:				AuthMethod				50.0%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:120:				Identity				0.0%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:131:				Expiry					0.0%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:146:				NewAuthProvider				100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:153:				NewAuthProviderWithContext		95.2%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:199:				GetAuthorizationHeader			92.3%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:228:				GetTenantID				69.2%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:254:				GetRegion				53.8%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:278:				IsLegacy				100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:291:				GetRawToken				53.8%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:331:				exchangeCredentials			89.7%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:424:				refreshIfNeeded				100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:440:				refreshOAuthIfNeeded			71.9%
github.com/ArmisSecurity/armis-cli/internal/auth/auth.go:515:				parseJWTClaims				93.3%
github.com/ArmisSecurity/armis-cli/internal/auth/browser.go:19:				SetBrowserOpener			100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/browser.go:31:				OpenBrowser				83.3%
github.com/ArmisSecurity/armis-cli/internal/auth/browser.go:45:				openBrowserCmd				0.0%
github.com/ArmisSecurity/armis-cli/internal/auth/client.go:44:				requireSecureBaseURL			100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/client.go:73:				RegionalBaseURL				100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/client.go:91:				Error					100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/client.go:103:				NewAuthClient				100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/client.go:162:				Authenticate				75.8%
github.com/ArmisSecurity/armis-cli/internal/auth/client.go:252:				annotateTransportError			100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:75:				Error					0.0%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:101:				NewDeviceClient				66.7%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:135:				RequestDeviceCode			72.2%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:168:				PollToken				60.9%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:215:				exchangeDeviceCode			100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:226:				Refresh					100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:238:				tokenRequest				76.5%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:280:				postForm				78.6%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:305:				parseError				75.0%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:314:				asOAuthError				40.0%
github.com/ArmisSecurity/armis-cli/internal/auth/device.go:348:				parseAccessTokenClaims			76.9%
github.com/ArmisSecurity/armis-cli/internal/auth/idpconfig.go:79:			Error					0.0%
github.com/ArmisSecurity/armis-cli/internal/auth/idpconfig.go:106:			NewIdpConfigClient			63.6%
github.com/ArmisSecurity/armis-cli/internal/auth/idpconfig.go:142:			Get					75.0%
github.com/ArmisSecurity/armis-cli/internal/auth/idpconfig.go:152:			Create					100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/idpconfig.go:158:			Update					75.0%
github.com/ArmisSecurity/armis-cli/internal/auth/idpconfig.go:169:			send					80.0%
github.com/ArmisSecurity/armis-cli/internal/auth/idpconfig.go:223:			parseIdpConfigError			84.6%
github.com/ArmisSecurity/armis-cli/internal/auth/idpconfig.go:256:			lastLocField				75.0%
github.com/ArmisSecurity/armis-cli/internal/auth/region_cache.go:34:			NewRegionCache				100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/region_cache.go:40:			Load					82.4%
github.com/ArmisSecurity/armis-cli/internal/auth/region_cache.go:75:			Save					76.9%
github.com/ArmisSecurity/armis-cli/internal/auth/region_cache.go:105:			Clear					75.0%
github.com/ArmisSecurity/armis-cli/internal/auth/region_cache.go:115:			getFilePath				83.3%
github.com/ArmisSecurity/armis-cli/internal/auth/region_cache.go:132:			loadCachedRegion			100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/region_cache.go:136:			saveCachedRegion			100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/region_cache.go:140:			clearCachedRegion			100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:88:			NewTokenStore				0.0%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:94:			normalizeEnv				100.0%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:99:			Save					83.3%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:131:			Load					90.9%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:151:			Clear					90.9%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:170:			ClearAll				0.0%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:175:			Environments				85.7%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:188:			Path					0.0%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:196:			read					73.7%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:227:			write					63.6%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:245:			remove					66.7%
github.com/ArmisSecurity/armis-cli/internal/auth/tokenstore.go:258:			filePath				42.9%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:60:				InitColors				85.2%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:107:				ColorsEnabled				100.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:113:				ColorsForced				100.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:119:				SetOutputToFile				100.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:125:				GetOutputToFile				0.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:129:				enableColors				100.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:136:				disableColors				100.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:151:				parseErrorMessage			92.9%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:182:				PrintError				100.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:195:				PrintErrorf				0.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:202:				PrintWarning				100.0%
github.com/ArmisSecurity/armis-cli/internal/cli/color.go:208:				PrintWarningf				100.0%
github.com/ArmisSecurity/armis-cli/internal/cli/interactive.go:11:			IsInteractive				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/agent_detection.go:20:			agentDetectionLong			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/agent_detection.go:47:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/agent_detection.go:53:			runAgentDetection			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/agent_detection_collect.go:30:		init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/agent_detection_collect.go:34:		runAgentDetectionCollect		0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/agent_detection_collect.go:100:		buildInventoryPayload			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth.go:55:				init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth.go:63:				runAuth					90.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_login.go:38:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_login.go:43:			runAuthLogin				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_login.go:56:			performDeviceLogin			85.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_login.go:108:			printVerificationInstructions		62.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_login.go:121:			printLoginSuccess			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_logout.go:28:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_logout.go:33:			runAuthLogout				78.9%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:88:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:95:			runAuthSetup				62.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:139:			detectIdentity				85.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:157:			withRequestTimeout			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:163:			runConfigFileSetup			57.9%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:203:			runInteractiveSetup			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:231:			runInteractiveCreate			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:258:			runInteractiveUpdate			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:297:			fetchExistingConfig			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:314:			sendCreate				63.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:349:			sendUpdate				87.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:372:			describeIdpConfigError			44.4%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:391:			detailOr				66.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:405:			printPostSetupHint			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:418:			isNonDefaultRegion			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:428:			promptSetupTenantID			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:455:			promptIdpConfig				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:535:			splitGroups				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:548:			assembleGroupMapping			91.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:574:			promptIdpConfigUpdate			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:692:			sameMapping				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:707:			printIdpConfigUpdateSummary		0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:741:			confirmSetup				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:766:			confirmUpdateExisting			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:805:			readConfigFile				80.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:818:			readBoundedConfig			83.3%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:831:			loadIdpConfigFromJSON			95.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:884:			validateIdpConfig			76.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:920:			printIdpConfigSummary			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:942:			groupsByRole				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:955:			maskSecret				66.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:962:			setupStrPtr				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_setup.go:963:			setupBoolPtr				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_whoami.go:23:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_whoami.go:27:			runAuthWhoami				84.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_whoami.go:63:			describeAuthMethod			40.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/auth_whoami.go:77:			humanizeUntil				42.9%
github.com/ArmisSecurity/armis-cli/internal/cmd/cmdutil/failon.go:15:			ValidateFailOn				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/cmdutil/failon.go:37:			GetFailOn				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/cmdutil/output.go:32:			Cleanup					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/cmdutil/output.go:58:			ResolveOutput				96.4%
github.com/ArmisSecurity/armis-cli/internal/cmd/cmdutil/theme.go:27:			armisTheme				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/cmdutil/theme.go:67:			GetInstallTheme				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/context.go:24:				NewSignalContext			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/context.go:33:				handleScanError				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/help.go:30:				SetupHelp				91.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/help.go:59:				styledUsageTemplate			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/help.go:102:				defaultUsageTemplate			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/help.go:109:				initColorsForHelp			35.3%
github.com/ArmisSecurity/armis-cli/internal/cmd/help.go:150:				styleHelpOutput				83.3%
github.com/ArmisSecurity/armis-cli/internal/cmd/hook.go:24:				init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/hook_init.go:32:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/hook_init.go:38:			runHookInit				66.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/install.go:69:				init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install.go:79:				runInstall				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install.go:120:				showInstalledVersions			81.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/install.go:148:				installAll				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install.go:259:				installTargets				34.3%
github.com/ArmisSecurity/armis-cli/internal/cmd/install.go:430:				printCredentialStatus			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install.go:445:				printKnowledgeResult			25.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_interactive.go:17:		runInteractiveInstall			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_interactive.go:289:		confirmKnowledge			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_interactive.go:307:		collectCredentials			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_interactive.go:418:		validateAndReport			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_interactive.go:449:		selectEditorsWithCodex			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_interactive.go:523:		offerHookSetup				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_knowledge.go:49:		init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_knowledge.go:54:		runInstallKnowledge			17.9%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_knowledge_flow.go:19:		hasWork					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/install_knowledge_flow.go:38:		installKnowledgeFor			12.1%
github.com/ArmisSecurity/armis-cli/internal/cmd/knowledge_flags.go:13:			parseKnowledgeVariant			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/knowledge_flags.go:27:			knowledgeEnvForDev			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp.go:20:				init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_doctor.go:73:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_doctor.go:83:			runMCPDoctor				51.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_doctor.go:141:			doctorAuthCheck				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_doctor.go:153:			applyDoctorFixes			79.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_doctor.go:198:			printMCPDoctorJSON			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_doctor.go:204:			printMCPDoctorPlain			88.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_doctor.go:247:			printRemediation			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_doctor.go:262:			statusSymbol				45.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_update.go:35:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_update.go:41:			runMCPUpdate				71.4%
github.com/ArmisSecurity/armis-cli/internal/cmd/mcp_update.go:56:			performMCPUpdate			5.3%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:186:				SetVersion				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:194:				Execute					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:198:				init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:267:				fixedCompletions			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:284:				formatCompletions			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:293:				failOnCompletions			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:307:				PrintUpdateNotification			81.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:349:				printUpdateNotificationOnce		75.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:362:				getEnvOrDefault				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:369:				getEnvOrDefaultInt			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:389:				getAPIBaseURL				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:418:				resolveDataPlaneURL			85.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:450:				getAuthProvider				84.6%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:492:				shouldAutoLoginSSO			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:505:				storedAuthProvider			83.3%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:531:				augmentNoCredentialsError		100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:570:				clientOptionsForBaseURL			92.9%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:642:				isLocalDevelopment			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:688:				getPageLimit				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/root.go:695:				validatePageLimit			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan.go:54:				defaultFailOn				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan.go:143:				warnOnUnusedSBOMVEXFlags		50.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan.go:158:				init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_image.go:189:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_repo.go:218:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_sbom.go:156:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_status.go:69:			runScanStatus				85.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_status.go:124:			resolveScanID				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_status.go:147:			translateStatusError			77.8%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_status.go:167:			isValidStatusFormat			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_status.go:187:			renderStatus				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_status.go:212:			renderHumanStatus			97.1%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_status.go:275:			scanStatusHint				88.9%
github.com/ArmisSecurity/armis-cli/internal/cmd/scan_status.go:296:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain.go:17:			loadConfigUpward			90.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain.go:93:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:71:		init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:123:		runSupplyChainCheck			56.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:381:		printRegistryCoverage			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:414:		isNPMFamilyEco				66.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:428:		registryViolationToFinding		0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:445:		countNoun				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:456:		countNounPlural				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:463:		buildSummary				42.9%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:480:		detectBaseLockfile			76.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_check.go:561:		resolvePolicy				63.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:72:		init					83.3%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:84:		runSupplyChainInit			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:120:		reportNothingInScope			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:161:		detectWrappablePMs			95.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:256:		summarizeDetectedPMs			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:310:		powerShellSkippedDottedPMs		100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:339:		promptYesNo				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:359:		confirmInteractive			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:388:		readYesNo				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:408:		runInitEnv				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:422:		runInitNpmrc				75.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:472:		runInitRC				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:604:		runInitConfig				46.9%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:704:		detectOrgScopes				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:721:		collectScopesFromFile			89.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_init.go:752:		extractScope				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:47:		resolveRegistrySettings			89.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:108:		resolveUpstreamAuth			80.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:142:		basicAuthFromIndexURL			75.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:160:		resolveCABundlePath			60.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:174:		runWrapDryRun				55.6%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:195:		printWrapDryRun				76.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:237:		effectiveRegistryHost			84.6%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:266:		urlHost					75.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:277:		npmrcDefaultRegistryHost		100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:308:		maybeWarnOffPolicyRegistry		33.3%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:345:		shouldShowRegistryWarning		0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_registry.go:359:		markRegistryWarningShown		0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_report.go:110:		buildComplianceReport			78.1%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_report.go:189:		transitivePolicyOrDefault		100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_report.go:199:		hours					66.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_report.go:215:		writeComplianceReport			44.4%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:43:		init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:54:		computeVerdict				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:88:		collapsePipVariants			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:112:		summarizePMs				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:125:		uniqueWrappedPMs			62.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:142:		runSupplyChainStatus			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:250:		printEnvStatus				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:267:		displayLockfilePath			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_status.go:322:		runSupplyChainStatusJSON		82.4%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_uninit.go:40:		init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_uninit.go:46:		runSupplyChainUninit			86.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:62:		init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:87:		runSupplyChainWrap			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:153:		canonicalPM				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:160:		runProxyWrap				59.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:350:		printWarnThroughSummary			94.1%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:386:		execPM					0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:455:		exitWithCode				60.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:500:		firstSubcommand				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:520:		actionLabel				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:541:		printBlockSummary			93.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:753:		printFailureCulprits			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:863:		skipCommand				77.8%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:882:		firstCulpritName			85.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:897:		quoteOrPlaceholder			66.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:916:		ageToken				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:924:		optionalAgeToken			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:933:		rightPad				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:965:		printPkgFilterLine			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1022:		groupBlockedByPackage			85.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1055:		verifiedClause				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1067:		checkedAllPass				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1077:		formatPolicyShort			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1095:		shouldShowRationale			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1102:		rationaleAlreadyShown			80.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1114:		markRationaleShown			66.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1129:		filterRelevantBlocked			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1149:		blockedDisplayVersion			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1162:		allResultsPrerelease			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1174:		severityDot				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1178:		formatDurationShort			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1191:		registryEnvForPM			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1233:		parseSkipPackages			75.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1275:		resolveWrapPolicy			91.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1307:		wrapConfigError				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1321:		wrapEcosystemEnforced			85.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1353:		requiresPreInstallBlock			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1373:		uvProxySafe				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1384:		runPreInstallBlock			57.1%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1510:		writePreInstallReport			37.5%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1536:		printPreInstallBlockSummary		0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1584:		blockedViolationNames			0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1608:		normalizeProxyResidue			76.2%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1666:		uvCompileOutputFile			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1685:		uvToolReceipts				72.7%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1708:		pmToEcosystem				100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/supply_chain_wrap.go:1756:		checkGradleStaleness			100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/uninstall.go:43:			init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/uninstall.go:49:			runUninstall				0.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/uninstall.go:68:			uninstallAll				36.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/uninstall.go:247:			uninstallTargets			54.8%
github.com/ArmisSecurity/armis-cli/internal/cmd/uninstall.go:365:			confirm					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/uninstall_knowledge.go:35:		init					100.0%
github.com/ArmisSecurity/armis-cli/internal/cmd/uninstall_knowledge.go:40:		runUninstallKnowledge			27.8%
github.com/ArmisSecurity/armis-cli/internal/httpclient/client.go:31:			NewClient				92.3%
github.com/ArmisSecurity/armis-cli/internal/httpclient/client.go:64:			Do					86.1%
github.com/ArmisSecurity/armis-cli/internal/httpclient/transport.go:39:			ProxyAwareTransport			83.3%
github.com/ArmisSecurity/armis-cli/internal/httpclient/transport.go:52:			systemProxyFunc				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:22:			NewClaudeInstaller			75.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:34:			InstalledVersion			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:39:			Install					14.3%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:71:			pluginCacheDir				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:76:			PluginCacheDir				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:81:			EnvFilePath				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:86:			GetInstalledVersion			76.2%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:118:			HasExistingEnv				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:123:			registerMarketplace			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:127:			registerPlugin				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/claude.go:132:			enablePlugin				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:15:			codexSectionHeaderFor			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:23:			CodexConfigPath				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:31:			IsCodexDetected				80.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:42:			RegisterCodexMCP			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:69:			RegisterCodexEntry			71.4%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:99:			DeregisterCodexMCP			83.3%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:122:			buildCodexSectionFor			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:136:			replaceTOMLSection			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:151:			removeTOMLSection			85.7%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:179:			findTOMLSectionBounds			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:233:			tomlQuote				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:239:			readFileOrEmpty				83.3%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:251:			writeFileAtomic				45.0%
github.com/ArmisSecurity/armis-cli/internal/install/codex.go:282:			removeCodexSection			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:90:			hint					100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:96:			fix					100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:118:			add					100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:123:			artifact				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:131:			HasFailures				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:141:			HasProblems				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:153:			Fixes					100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:188:			HasBlockedRegistration			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:206:			ApplyEnvFix				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:251:			workspaceDir				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:264:			newDoctorRun				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:280:			RunDoctor				84.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:321:			checkScannerPlugin			58.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:374:			checkVenvBase				93.8%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:400:			checkKnowledgePlugin			76.7%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:465:			checkCredentials			89.5%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:504:			checkAuth				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:530:			checkServerNetwork			84.6%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:556:			tryProxyFix				88.2%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:586:			probe					87.2%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:664:			launchHintText				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:671:			summarizeDebugConfig			87.5%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:697:			checkManifestEditors			86.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:787:			checkClaudeSection			20.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:815:			readBoundedConfigFile			77.8%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:834:			claudeRegistryStatus			95.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:872:			checkCodexSection			80.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:893:			lookupEntryCommand			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:902:			lookupEntry				92.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:961:			stringSlice				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:972:			stringMap				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:986:			isExecutableFile			83.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:1000:			parseEnvFile				92.9%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:1022:			isSecretKey				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor.go:1032:			firstNonEmpty				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_bundle.go:18:		DefaultBundleName			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_bundle.go:27:		WriteSupportBundle			72.2%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:43:			key					91.7%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:63:			commandLine				83.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:100:		mcpHandshake				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:172:		runMCPSession				81.4%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:261:		notify					66.7%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:274:		call					69.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:326:		toolCallText				87.5%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:352:		Write					0.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:361:		String					100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:363:		truncate				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:371:		tail					75.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:382:		launchHint				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:454:		lookupSystemProxy			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:474:		hasProxyEnv				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:485:		isConnectFailure			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:502:		serverAPIURL				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:520:		runNetworkProbe				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_probe.go:552:		networkHint				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:76:		checkVSCode				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:107:		checkVSCodeVariant			93.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:208:		checkVSCodeWorkspace			93.8%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:241:		checkVSCodeSettings			90.9%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:287:		checkVSCodePolicy			13.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:315:		parseRegQuery				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:327:		policyProblems				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:355:		checkVSCodeLog				94.7%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:387:		latestVSCodeServerLog			88.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:430:		lastVSCodeError				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:447:		vscodeProfileNames			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:467:		readJSONCObject				84.6%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:490:		vscodeServers				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:499:		findServer				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:516:		vscodeLaunch				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:547:		expandVSCodeVars			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:571:		vscodeSnippet				83.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:590:		launchArtifact				83.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:609:		sanitizeArtifactName			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:616:		systemInfo				83.3%
github.com/ArmisSecurity/armis-cli/internal/install/doctor_vscode.go:638:		maskURLUserinfo				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:88:			EditorByID				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:101:			ConfigPath				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:112:			IsDetected				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:122:			Register				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:131:			RegisterEntry				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:140:			DetectedEditors				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:157:			NewEditorInstaller			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:167:			InstalledVersion			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:170:			PluginDir				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:173:			EnvFilePath				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:176:			HasExistingEnv				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:187:			FetchPlugin				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:213:			GetInstalledVersion			80.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:223:			RegisterJetBrains			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:229:			defaultConfigPath			83.3%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:281:			homeDir					75.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:289:			appSupportPath				29.4%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:333:			scannerEntry				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:342:			registerEditor				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:348:			registerEditorEntry			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:364:			registerMCPServersFormat		100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:381:			registerVSCodeFormat			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:403:			registerZedFormat			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:435:			registerContinueFormat			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:481:			readYAMLFileAsMap			80.0%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:502:			writeYAML				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/editors.go:514:			readJSONFileAsMap			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/hooks.go:19:			InstallHooks				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/hooks.go:30:			installHooksToFile			87.1%
github.com/ArmisSecurity/armis-cli/internal/install/hooks.go:100:			RemoveHooks				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/hooks.go:111:			removeHooksFromFile			73.0%
github.com/ArmisSecurity/armis-cli/internal/install/hooks.go:173:			isArmisHookEntry			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/hooks.go:185:			isArmisHookCommand			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/jsonc.go:18:			stripJSONC				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/jsonc.go:72:			nextSignificant				50.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:75:			NewKnowledgeInstaller			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:88:			PluginName				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:103:			PluginRef				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:109:			CheckClaudeCLI				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:125:			Install					92.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:186:			sibling					75.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:201:			IsInstalled				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:218:			pluginListed				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:235:			Uninstall				54.5%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:256:			isAlreadyInstalled			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:263:			isNotInstalled				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:269:			resolveClaude				71.4%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:284:			findClaude				55.6%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:302:			runClaudeCLI				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge.go:312:			CredentialsPresent			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:57:		NewKnowledgeMCPInstaller		100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:71:		PluginDir				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:76:		EnvFilePath				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:81:		envSubdir				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:101:		EnvDir					100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:107:		envSuffix				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:119:		ServerName				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:125:		CodexServerName				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:132:		entry					100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:142:		codexEntry				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:150:		InstalledSHA				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:162:		ShortSHA				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:171:		LatestSHA				65.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:212:		Fetch					65.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:261:		PluginKey				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:268:		ClaudeCacheDir				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:273:		RegisterEditor				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:278:		RegisterCodex				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:296:		RegisterClaude				55.6%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:313:		registerClaudeMarketplace		100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:317:		registerClaudePlugin			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/knowledge_mcp.go:323:		enableClaudePlugin			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:57:			ManifestPath				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:74:			ReadManifest				80.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:92:			WriteManifest				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:104:			NewManifest				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:115:			AddEditor				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:123:			RemoveEditor				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:128:			SetClaude				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:133:			SetCodex				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:139:			EnsureKnowledge				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:152:			AddEditor				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:160:			SetClaude				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:165:			SetCodex				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/manifest.go:170:			ConfigFormat				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:65:			HookClientByID				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:75:			ConfigPath				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:80:			IsDetected				80.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:90:			DetectHookClients			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:103:		hookConfigPath				75.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:114:		InstallNativeHook			73.3%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:145:		RemoveNativeHook			83.3%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:157:		installClientHook			83.3%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:172:		removeClientHook			66.7%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:183:		cursorHooksPath				50.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:189:		codexHooksPath				50.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:195:		copilotHooksPath			50.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:201:		clineHooksPath				16.7%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:225:		readJSONFileAsMapSafe			72.7%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:246:		installMergedHook			82.4%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:277:		removeMergedHook			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:311:		installCursorHook			94.7%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:346:		removeCursorHook			72.2%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:382:		buildCursorHooks			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:405:		buildCodexHooks				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:436:		buildCopilotHooks			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:453:		buildClineHooks				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:471:		hasArmisHookEntries			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:480:		filterNonArmisEntries			80.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:490:		isArmisHookJSON				80.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:507:		cleanupLegacyCopilotHook		42.9%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:524:		removeLegacyFileIfArmisOnly		82.4%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:554:		posixQuote				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/native_hooks.go:558:		quotedCommand				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:56:			newPluginInstaller			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:64:			InstalledVersion			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:69:			LatestVersion				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:78:			FetchAndInstall				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:100:			fetchLatestRelease			69.6%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:140:			downloadAndExtract			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:158:			downloadAndExtractTarball		75.6%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:293:			createPluginVenv			15.8%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:336:			validateGitHubURL			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:350:			extractFile				57.1%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:362:			writeJSON				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:382:			registerDirectoryMarketplace		100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:406:			registerInstalledPlugin			81.8%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:437:			enableInstalledPlugin			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:460:			CheckPython				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:470:			pythonNotFoundError			57.1%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:490:			findPython				84.6%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:518:			writeEnvFromEnvironment			85.7%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:550:			WriteEnvFromValues			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:564:			SetEnvFileVars				68.3%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:665:			copyFile				63.6%
github.com/ArmisSecurity/armis-cli/internal/install/plugin.go:685:			venvPython				66.7%
github.com/ArmisSecurity/armis-cli/internal/install/precommit.go:25:			InstallPreCommit			71.4%
github.com/ArmisSecurity/armis-cli/internal/install/precommit.go:81:			RemovePreCommit				79.3%
github.com/ArmisSecurity/armis-cli/internal/install/precommit.go:135:			PreCommitHookPath			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/precommit.go:144:			IsPreCommitInstalled			87.5%
github.com/ArmisSecurity/armis-cli/internal/install/precommit.go:160:			resolveHooksDir				39.1%
github.com/ArmisSecurity/armis-cli/internal/install/precommit.go:201:			DetectGitRoot				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/precommit.go:210:			buildPreCommitSection			83.3%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:20:			NewUninstaller				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:29:			HasManifest				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:34:			PluginDir				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:39:			DeregisterEditor			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:60:			DeregisterAllEditors			83.9%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:111:			DeregisterClaude			64.7%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:145:			RemovePluginFiles			64.7%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:179:			editorConfigPath			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:190:			deregisterEditor			60.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:203:			deregisterFromFile			66.7%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:210:			deregisterMCPServersFormat		100.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:226:			deregisterVSCodeFormat			77.8%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:242:			deregisterZedFormat			77.8%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:263:			removeContinueEntry			90.5%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:301:			removeFromMarketplace			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:306:			removeFromInstalledPlugins		100.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:311:			removeFromSettings			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:316:			removeJSONKey				55.6%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:331:			removeNestedJSONKey			61.5%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:351:			hasArmisEntry				85.7%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:381:			continueHasEntry			75.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:397:			readAndParseJSON			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:409:			writeJSONAtomic				55.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:440:			HasKnowledge				100.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:451:			RemoveKnowledge				39.4%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:508:			knowledgeServerNames			100.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:514:			deregisterServerFromFile		85.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:552:			deregisterKnowledgeClaude		0.0%
github.com/ArmisSecurity/armis-cli/internal/install/uninstall.go:576:			removeKnowledgeFiles			46.7%
github.com/ArmisSecurity/armis-cli/internal/install/validate.go:23:			ValidateCredentials			0.0%
github.com/ArmisSecurity/armis-cli/internal/install/validate.go:27:			resolveBaseURL				0.0%
github.com/ArmisSecurity/armis-cli/internal/install/validate.go:35:			validateCredentialsWithURL		100.0%
github.com/ArmisSecurity/armis-cli/internal/output/errno_unix.go:12:			isSyncNotSupported			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:62:				wrapText				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:85:				wrapLine				91.7%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:123:			formatRecommendations			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:193:			wrapTextWithFirstLinePrefix		90.9%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:232:			write					66.7%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:263:			Write					89.5%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:293:			Format					100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:298:			FormatWithOptions			88.4%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:391:			SyncColors				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:395:			sortFindingsBySeverity			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:406:			loadSnippetFromFile			69.4%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:522:			formatCodeSnippetWithFrame		91.1%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:615:			truncatePlainLine			0.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:627:			highlightColumns			93.5%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:672:			scanDuration				89.5%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:705:			pluralize				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:714:			suppressionSummaryText			80.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:742:			renderBriefStatus			87.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:799:			renderSummaryDashboard			57.8%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:894:			renderFindings				88.9%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:923:			renderFinding				54.5%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1035:			renderGroupedFindings			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1059:			groupFindings				96.8%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1116:			severityRank				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1123:			isGitRepo				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1130:			getGitBlame				38.1%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1168:			parseGitBlame				95.2%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1204:			maskEmail				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1227:			getTopLevelDomain			75.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1239:			getHumanDisplayTitle			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1253:			wrapTitle				93.9%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1312:			maskFixForDisplay			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1347:			formatFixSection			0.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1412:			formatProposedSnippet			0.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1495:			limitHunkContext			64.7%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1571:			parseDiffHunk				91.7%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1593:			parseDiffLines				94.6%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1684:			findInlineChanges			73.5%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1755:			computeLCS				92.3%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1807:			buildTokenPositions			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1823:			tokenizeLine				92.9%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1851:			isWordChar				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1858:			formatDiffWithColorsStyled		77.1%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1932:			extractDiffFilename			80.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1954:			formatDiffHunkLine			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1974:			formatDiffContextLine			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:1985:			formatDiffRemoveLine			86.4%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2026:			formatDiffAddLine			86.4%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2068:			applyInlineHighlights			81.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2110:			truncateDiffLine			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2117:			truncateDiffLineWithFlag		66.7%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2131:			adjustHighlightSpans			83.3%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2153:			groupDiffHunks				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2184:			collectRenderOps			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2227:			renderChangeBlock			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2286:			formatDiffHunkSeparator			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2301:			formatValidationSection			0.0%
github.com/ArmisSecurity/armis-cli/internal/output/human.go:2358:			getExposureDescription			0.0%
github.com/ArmisSecurity/armis-cli/internal/output/icons.go:25:				GetConfidenceIcon			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/json.go:15:				Format					100.0%
github.com/ArmisSecurity/armis-cli/internal/output/json.go:24:				FormatWithOptions			66.7%
github.com/ArmisSecurity/armis-cli/internal/output/json.go:32:				formatWithDebug				0.0%
github.com/ArmisSecurity/armis-cli/internal/output/json.go:58:				maskScanResultForOutput			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/json.go:78:				maskFindingSecrets			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/junit.go:48:				Format					100.0%
github.com/ArmisSecurity/armis-cli/internal/output/junit.go:55:				FormatWithOptions			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/junit.go:63:				formatWithSeverities			77.8%
github.com/ArmisSecurity/armis-cli/internal/output/junit.go:92:				isFailureSeverity			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/junit.go:102:			convertToJUnitCasesWithSeverities	100.0%
github.com/ArmisSecurity/armis-cli/internal/output/junit.go:135:			countFailuresWithSeverities		100.0%
github.com/ArmisSecurity/armis-cli/internal/output/output.go:26:			Error					0.0%
github.com/ArmisSecurity/armis-cli/internal/output/output.go:37:			Error					0.0%
github.com/ArmisSecurity/armis-cli/internal/output/output.go:58:			GetFormatter				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/output.go:75:			ShouldFail				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/output.go:94:			FilterActiveFindings			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/output.go:107:			CheckExit				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:174:			normalizeCWE				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:183:			normalizeCVE				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:193:			stripMarkdown				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:205:			Format					100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:232:			firstNonEmpty				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:251:			stableRuleID				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:269:			buildRules				96.3%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:340:			convertToSarifResults			90.3%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:441:			buildMessageText			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:448:			severityToSarifLevel			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:468:			severityToSecurityScore			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:487:			generateHelpURI				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:511:			convertFixToSarif			90.5%
github.com/ArmisSecurity/armis-cli/internal/output/sarif.go:628:			FormatWithOptions			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/styles.go:148:			DefaultStyles				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/styles.go:286:			NoColorStyles				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/styles.go:363:			GetStyles				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/styles.go:371:			SyncStylesWithColorMode			100.0%
github.com/ArmisSecurity/armis-cli/internal/output/styles.go:396:			GetSeverityText				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/styles.go:423:			RenderCodeBlock				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/styles.go:448:			TerminalWidth				33.3%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:21:			GetLexer				100.0%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:32:			GetChromaStyle				80.0%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:45:			HighlightCode				81.2%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:80:			HighlightLine				75.0%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:89:			getTerminalFormatter			60.0%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:104:			HighlightLineWithBackground		87.5%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:127:			getBackgroundANSI			58.3%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:159:			rgbToANSI256				0.0%
github.com/ArmisSecurity/armis-cli/internal/output/syntax.go:172:			parseHexColor				76.9%
github.com/ArmisSecurity/armis-cli/internal/output/writer.go:51:			validateOutputPath			92.3%
github.com/ArmisSecurity/armis-cli/internal/output/writer.go:88:			NewFileOutput				88.2%
github.com/ArmisSecurity/armis-cli/internal/output/writer.go:145:			Writer					100.0%
github.com/ArmisSecurity/armis-cli/internal/output/writer.go:150:			Close					100.0%
github.com/ArmisSecurity/armis-cli/internal/output/writer.go:167:			FormatFromExtension			100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:32:			IsCI					100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:60:			isTerminalWriter			100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:68:			NewReader				100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:83:			NewWriter				50.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:117:			NewSpinner				100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:126:			NewSpinnerWithTimeout			100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:142:			NewSpinnerWithContext			100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:150:			SetWriter				100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:159:			Start					89.8%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:275:			Stop					100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:310:			Update					100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:317:			GetElapsed				100.0%
github.com/ArmisSecurity/armis-cli/internal/progress/progress.go:324:			formatDuration				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/exploitability.go:42:			ShouldFilterByExploitability		100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/exploitability.go:60:			exploitabilityLevel			80.0%
github.com/ArmisSecurity/armis-cli/internal/scan/finding_type.go:9:			DeriveFindingType			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:69:			NewStore				0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:74:			NewStoreWithDir				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:81:			Save					95.7%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:125:		Latest					94.1%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:152:		Path					0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:160:		read					73.7%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:203:		write					56.7%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:253:		filePath				42.9%
github.com/ArmisSecurity/armis-cli/internal/scan/history/history.go:268:		normalizeBaseURL			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:58:			NewScanner				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:73:			WithPollInterval			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:79:			WithFetchRetryInterval			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:85:			WithSBOMVEXOptions			0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:92:			WithPullPolicy				0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:98:			ScanImage				0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:140:			ScanTarball				84.5%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:269:			exportImage				0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:352:			validateExportedTarball			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:370:			IsDockerAvailable			42.9%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:385:			getDockerCommand			75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:394:			validateDockerCommand			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:403:			imageExistsLocally			87.5%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:418:			determinePullBehavior			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:436:			isRetryableError			75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:444:			buildScanResult				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:471:			convertNormalizedFindings		85.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:594:			cleanDescription			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:613:			isEmptyFinding				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/image.go:628:			generateFindingTitle			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/image/validate.go:11:			validateImageName			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/mask.go:22:				MaskFixSecrets				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/normalized_findings.go:22:		BuildScanResult				0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/normalized_findings.go:56:		ConvertNormalizedFindings		0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/normalized_findings.go:176:		CleanDescription			0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/normalized_findings.go:195:		IsEmptyFinding				0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/record.go:23:				RecordScanStarted			0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/files.go:26:			ParseFileList				87.5%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/files.go:41:			addFile					87.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/files.go:94:			Files					100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/files.go:99:			RepoRoot				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/files.go:104:			ValidateExistence			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:52:			GitChangedFiles				82.6%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:113:		gitRepoRoot				80.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:138:		changedUncommitted			41.7%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:171:		changedStaged				75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:184:		validateRef				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:197:		changedSinceRef				75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:221:		filterToScanPath			95.8%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:274:		runGit					91.7%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:306:		parseNulSeparated			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/gitchanges.go:324:		combineAndDedupe			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/githints.go:35:			DetectGitHints				94.4%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/githints.go:83:			isCleanWorkingTree			75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/githints.go:97:			detectDefaultBranch			90.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/githints.go:129:			normalizeRepoName			92.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/ignore.go:28:			LoadIgnorePatterns			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/ignore.go:36:			LoadSuppressionConfig			0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/ignore.go:78:			LoadArmisIgnore				96.4%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/ignore.go:138:			parseArmisIgnoreFile			92.5%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/ignore.go:204:			Match					100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/ignore.go:216:			shouldSkipDir				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:102:			ApplyInlineSuppression			97.2%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:231:			parseInlineComment			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:258:			isCommentLine				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:272:			isFuncSignature				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:285:			containsAny				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:299:			findCommentStart			83.3%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:339:			parseDirectiveParams			93.9%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:397:			matchesInlineDirective			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:433:			buildInlineSuppressionInfo		100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/inline.go:461:			countSuppressed				0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/matcher.go:28:			MatchFinding				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/matcher.go:62:			cweMatches				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/matcher.go:78:			ApplySuppression			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/matcher.go:101:			recomputeSummary			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:47:			NewScanner				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:62:			WithPollInterval			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:68:			WithFetchRetryInterval			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:74:			WithIncludeFiles			0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:80:			WithSBOMVEXOptions			0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:89:			WithGitHints				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:95:			Scan					70.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:342:			tarGzDirectory				71.8%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:424:			isPathContained				75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:433:			tarGzFiles				78.6%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:524:			safeAddSize				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:531:			calculateFilesSize			78.6%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:557:			calculateDirSize			76.9%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:604:			shouldSkip				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:635:			isTestFile				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:681:			isRetryableError			75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:690:			buildScanResult				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:717:			convertNormalizedFindings		73.3%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:840:			cleanDescription			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:861:			generateFindingTitle			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/repo.go:865:			isEmptyFinding				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/suppression.go:58:		NewSuppressionConfig			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/suppression.go:63:		IsEmpty					100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/suppression.go:77:		Add					100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/suppression.go:99:		CategoryMapping				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/suppression.go:112:		parseDirectiveLine			93.5%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/suppression.go:173:		hasDirectivePrefix			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/repo/suppression.go:187:		validateCWE				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:67:			NewScanner				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:88:			WithPollInterval			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:95:			WithFetchRetryInterval			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:101:			WithRawOutput				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:108:			WithVEXOutput				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:119:			Scan					77.6%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:264:			downloadRawFindings			75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:313:			pickRawFindingsURL			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:326:			downloadVEX				73.1%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:379:			prepareUpload				40.5%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:441:			artifactName				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:451:			plural					100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:466:			countVEXStatements			85.7%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:481:			tarGzPath				70.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:532:			writeTarFile				75.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom/sbom.go:554:			isRetryableError			0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom_vex.go:48:			NewSBOMVEXDownloader			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom_vex.go:65:			Download				85.7%
github.com/ArmisSecurity/armis-cli/internal/scan/sbom_vex.go:146:			downloadAndSave				77.8%
github.com/ArmisSecurity/armis-cli/internal/scan/status.go:16:				FormatScanStatus			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/status.go:35:				FormatElapsed				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/status.go:48:				MapSeverity				100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/testhelpers/findings.go:9:		CreateNormalizedFinding			0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/testhelpers/findings.go:14:		CreateNormalizedFindingWithLabels	0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/testhelpers/findings.go:19:		CreateNormalizedFindingFull		0.0%
github.com/ArmisSecurity/armis-cli/internal/scan/testhelpers/tarball.go:32:		WriteMinimalTar				64.3%
github.com/ArmisSecurity/armis-cli/internal/scan/testhelpers/tarball.go:68:		assertPathInsideTempDir			80.0%
github.com/ArmisSecurity/armis-cli/internal/scan/title.go:14:				GenerateFindingTitle			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/validate.go:21:			HasAllowedTarExtension			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/validate.go:44:			ValidateTarballFormat			89.7%
github.com/ArmisSecurity/armis-cli/internal/scan/validate.go:114:			isGzip					100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/validate.go:121:			isUstar					100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/validate.go:133:			ValidateUploadSize			100.0%
github.com/ArmisSecurity/armis-cli/internal/scan/validate.go:152:			FormatBytes				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/bun.go:18:		ParseBunLockfile			80.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/bun.go:67:		bunResolvedURL				60.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/bun.go:77:		parseBunPackageKey			80.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/bun.go:91:		shouldSkipBunPackage			83.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:58:		RunCheck				0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:68:		RunCheckWithRegistry			0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:83:		RunCheckWithRegistryClient		0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:94:		runCheck				97.1%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:176:		parseLockfile				33.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:203:		queryRegistry				0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:229:		queryRegistryWithURL			57.1%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:251:		isNPMFamily				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:266:		detectRegistryDivergence		95.2%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:315:		DetectEcosystemFromPath			0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:319:		detectEcosystemFromPath			92.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:355:		isRequirementsFile			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/check.go:367:		diffEntries				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/gradle.go:16:		ParseGradleLockfile			90.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/lockfile.go:24:		readLockfile				90.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/maven.go:38:		ParseMavenDeps				90.5%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/maven.go:79:		mavenDepToEntry				87.5%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/npm.go:43:		ParseNPMLockfile			88.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/npm.go:99:		extractPackageName			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/npm.go:107:		shouldSkipResolved			83.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pdm.go:26:		ParsePDMLockfile			85.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pdm.go:64:		shouldSkipPDMSource			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pip.go:29:		ParsePipRequirements			90.5%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pip.go:79:		parsePipRequirement			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pip.go:106:		shouldSkipPipLine			85.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pip.go:126:		normalizePipName			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pipfile.go:20:		ParsePipfileLock			94.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pipfile.go:55:		pipfileEntryToPackage			80.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pnpm.go:28:		ParsePNPMLockfile			82.4%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pnpm.go:66:		parsePnpmPackageKey			79.2%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pnpm.go:117:		stripPeerFromKey			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/pnpm.go:148:		shouldSkipPnpmPackage			87.5%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/poetry.go:26:		ParsePoetryLockfile			85.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/poetry.go:58:		shouldSkipPoetrySource			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/uv.go:26:			ParseUVLockfile				85.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/uv.go:64:			shouldSkipUVSource			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/yarn.go:15:		ParseYarnLockfile			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/yarn.go:28:		isBerryLockfile				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/yarn.go:37:		parseYarnBerry				81.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/yarn.go:79:		extractBerryPackageName			30.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/yarn.go:119:		shouldSkipYarnResolution		100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/yarn.go:139:		parseYarnClassic			97.2%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/yarn.go:219:		extractClassicPackageName		75.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/check/yarn.go:227:		shouldSkipClassicProtocol		100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:105:			KnownEcosystemsHint			0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:113:			LoadConfig				89.5%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:162:			validate				91.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:195:			RegistryURLFor				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:213:			HasAnyRegistry				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:225:			ToPolicy				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:256:			UnknownEcosystems			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:279:			EnforcesEcosystem			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/config.go:310:			FindConfigDir				91.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/detect.go:64:			DetectEcosystems			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/detect.go:109:			DetectEcosystemsUpward			92.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/detect.go:151:			FindEcosystemLockfile			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/detect.go:170:			FindUpward				92.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/detect.go:197:			ecosystemLockfileName			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/manifest.go:27:			DirectDependencies			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/manifest.go:54:			directDepsFromPackageJSON		86.4%
github.com/ArmisSecurity/armis-cli/internal/supplychain/normalize.go:37:		NormalizeArtifact			50.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/normalize.go:141:		DetectLoopbackRegistry			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/normalize.go:156:		FileContainsString			85.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:45:			isNpmrcMarkerLine			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:56:			HasNpmrcMarker				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:69:			NpmrcFileHasMarker			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:83:			RemoveNpmrcMarker			85.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:117:			removeNpmrcMarkerLines			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:174:			NpmrcAuthToken				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:204:			ReadNpmrcAuthToken			91.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:228:			npmrcKeyCandidates			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:241:			parseNpmrcTokens			88.2%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:272:			resolveNpmrcToken			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/npmrc.go:300:			IndexURLBasicAuth			88.9%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:219:			NewProxy				97.1%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:343:			buildAuthHeader				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:350:			modifyUpstreamResponse			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:386:			newUpstreamHTTPClient			84.2%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:446:			NewRegistryHTTPClient			83.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:457:			Start					91.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:483:			Addr					100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:502:			Upstream				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:510:			Blocked					100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:518:			Checked					100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:529:			VerifyFailed				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:540:			markVerifyFailed			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:546:			Allowed					100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:559:			Warned					100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:573:			isTransitive				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:585:			warnThroughTransitive			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:589:			Close					66.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:596:			handleRequest				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:632:			joinUpstreamURL				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:645:			handleMetadataFiltering			83.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:801:			copyCacheHeaders			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:823:			sanitizeHeaderValue			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:831:			isX509Error				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:844:			warnDegradedEnforcement			83.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:854:			filterMetadata				92.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1068:			recordConstraintData			96.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1180:			recordWarned				71.4%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1208:			filterPyPISimple			92.6%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1328:			pypiFileAge				88.9%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1346:			pypiVersionFromFilename			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1382:			jsonString				83.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1393:			reverseProxy				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1397:			extractPackageNameFromPath		91.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1431:			isMetadataRequest			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1474:			IsPrerelease				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1485:			extractPyPIPackageNameFromPath		100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy.go:1510:			isPyPIMetadataRequest			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy_constraints.go:42:	EvaluateConstraints			89.1%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy_constraints.go:133:	isWildcardRange				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy_constraints.go:145:	parseVersions				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/proxy_constraints.go:159:	anySatisfies				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/maven.go:49:		NewMavenClient				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/maven.go:61:		NewMavenClientWithHTTP			66.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/maven.go:71:		GetPublishDate				96.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/maven.go:125:		escapeSolrQueryValue			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/maven.go:131:		fetchPublishDate			76.9%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/maven.go:185:		GetPublishDates				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/npm.go:78:		NewClient				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/npm.go:98:		NewClientWithHTTP			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/npm.go:129:		WithAuthHeader				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/npm.go:134:		GetPublishDate				86.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/npm.go:165:		GetPublishDates				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/npm.go:195:		fetchMetadata				86.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:82:		NewPyPIClient				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:104:		NewPyPIClientWithHTTP			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:142:		WithAuthHeader				0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:147:		GetPublishDate				79.2%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:196:		GetPublishDates				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:229:		fetchReleases				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:259:		fetchReleasesLegacy			68.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:315:		fetchReleasesSimple			77.4%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:376:		pypiVersionFromFilename			33.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:415:		NormalizePyPIName			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:419:		normalizePyPIName			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:427:		lookupReleaseNormalized			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry/pypi.go:443:		normalizeVersion			84.6%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry_url.go:37:		ValidateRegistryURL			90.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry_url.go:94:		StripURLUserinfo			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/registry_url.go:107:		rejectNonRoutableIP			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:68:			sanitizePMNames				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:86:			DetectShells				93.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:138:			powershellProfiles			33.3%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:170:			resolveWindowsDocumentsDir		0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:192:			GenerateWrapper				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:208:			ShellReloadCommand			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:222:			IsPowerShell				0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:228:			generatePosixWrapper			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:262:			generateFishWrapper			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:299:			generatePowerShellWrapper		100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:344:			shellQuote				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:353:			shellQuotePowerShell			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:374:			resolveCliPath				77.8%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:390:			InjectFunctions				88.9%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:405:			injectIntoFile				78.9%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:441:			RemoveFunctions				87.5%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:455:			removeFromFile				86.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:483:			removeBlock				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:507:			EvalCommand				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:511:			HasInjection				75.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:535:			WrappedPMs				95.7%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:581:			HasCurrentInjection			75.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:590:			fileExists				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:606:			IsPipVariant				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:620:			CanonicalPipVariant			0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:658:			scanPathExecutables			84.6%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:744:			DetectPipVariants			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:765:			DetectInstalledPMs			0.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/shell.go:800:			IsOnPath				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:37:		ParseTransitivePolicy			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:54:		DefaultPolicy				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:70:		ClassifySeverity			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:80:		IsExcluded				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:100:		ParseDuration				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:144:		parseFiniteNonNegativeFloat		100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:166:		scaleToDuration				100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:174:		ViolationToFinding			100.0%
github.com/ArmisSecurity/armis-cli/internal/supplychain/supplychain.go:188:		formatAge				100.0%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:64:			NewChecker				100.0%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:81:			CheckCached				100.0%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:99:			CheckInBackground			100.0%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:119:			check					85.7%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:162:			fetchLatestVersion			89.5%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:196:			getCacheFilePath			66.7%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:211:			readCache				84.6%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:235:			writeCache				76.9%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:259:			IsNewer					100.0%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:282:			parseVersion				100.0%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:305:			FormatNotification			100.0%
github.com/ArmisSecurity/armis-cli/internal/update/update.go:328:			getUpdateCommand			40.0%
github.com/ArmisSecurity/armis-cli/internal/util/cache.go:21:				GetCacheDir				75.0%
github.com/ArmisSecurity/armis-cli/internal/util/cache.go:41:				GetCacheFilePath			80.0%
github.com/ArmisSecurity/armis-cli/internal/util/format.go:7:				FormatCategory				100.0%
github.com/ArmisSecurity/armis-cli/internal/util/mask.go:109:				MaskSecretInLine			86.4%
github.com/ArmisSecurity/armis-cli/internal/util/mask.go:164:				maskValue				83.3%
github.com/ArmisSecurity/armis-cli/internal/util/mask.go:190:				MaskSecretInLines			100.0%
github.com/ArmisSecurity/armis-cli/internal/util/mask.go:204:				MaskSecretInMultiLineString		100.0%
github.com/ArmisSecurity/armis-cli/internal/util/mask.go:218:				MaskSecretsInStringMap			100.0%
github.com/ArmisSecurity/armis-cli/internal/util/path.go:13:				SanitizePath				90.9%
github.com/ArmisSecurity/armis-cli/internal/util/path.go:53:				SafeJoinPath				87.5%
github.com/ArmisSecurity/armis-cli/test/sample-repo/src/main.go:6:			main					0.0%
total:											(statements)				72.4%

@github-actions

Copy link
Copy Markdown

Armis AppSecArmis AppSec Security Scan Results

✅ No issues

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The doctor auth-check path ignores the provided timeout/cancellation context (and there are a couple of user-facing message/docs mismatches) which can make diagnostics hang or mislead users.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 1 Medium severity · 2 Low severity

Open (3)
What changed in this PR

Adds a significantly more capable armis-cli mcp doctor workflow to diagnose—and optionally repair—editor MCP registrations and runtime connectivity issues, with special handling for VS Code/Copilot’s JSONC configs and logging.

Changes:

  • Extend mcp doctor to run a full MCP session (initialize/tools/list/tools/call), perform server-runtime network probes, and offer --fix + support --bundle.
  • Add VS Code/Copilot-specific diagnostics (variants, profiles/workspaces, settings/policy gating, and MCP server logs).
  • Parse VS Code MCP config files as JSONC and preserve non-credential .env variables when updating credentials.
File Description
README.md Documents MCP server install/update/doctor usage and troubleshooting options.
internal/​install/​plugin.go Preserves existing .env vars via atomic in-place key updates and backup.
internal/​install/​jsonc.go Adds JSONC stripping utility (BOM/comments/trailing commas).
internal/​install/​editors.go Uses JSONC parsing when reading VS Code config to avoid silent drops.
internal/​install/​doctor.go Expands doctor report model, fix actions, live probe + network/auth checks.
internal/​install/​doctor_vscode.go Implements VS Code/Copilot discovery, config validation, settings/policy/log checks.
internal/​install/​doctor_probe.go Runs full MCP session over stdio and server-runtime network/proxy probes.
internal/​install/​doctor_bundle.go Writes scrubbed support bundle zip from collected artifacts.
internal/​install/​doctor_test.go Updates helper server + tests for full MCP session probing.
internal/​install/​doctor_checks_test.go Adds/extends tests for JSONC parsing, VS Code checks, env preservation, bundling, and probes.
internal/​cmd/​mcp.go Updates command help text to mention doctor --fix/--bundle.
internal/​cmd/​mcp_update.go Extracts performMCPUpdate for reuse by doctor --fix.
internal/​cmd/​mcp_doctor.go Adds new flags, fix application flow, bundle writing, and enhanced plain output.
internal/​cmd/​mcp_doctor_test.go Adds tests for new doctor output, fixes flow, flags, and bundling behavior.
docs/​CHANGELOG.md Changelog entries for new doctor capabilities, JSONC fix, and .env preservation.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread internal/cmd/mcp_doctor.go
Comment thread internal/install/doctor_probe.go Outdated
Comment thread internal/install/plugin.go Outdated
…ge and .env comment doc

Addresses Copilot review on PR #326: doctorAuthCheck ignored the caller's
context and could hang past the intended timeout; the MCP session timeout
error reported the per-call timeout instead of the actual remaining wait;
SetEnvFileVars's doc comment overclaimed comment preservation for replaced
assignment lines.
Copilot AI review requested due to automatic review settings September 23, 2026 12:37

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The review found concrete cases where diagnostics/fix behavior can miss or mishandle invalid VS Code workspace configs and where --fix should avoid destructive re-registration when configs are invalid.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 1 High severity

Open (1)
Resolved since last review (3)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Ignore invalid workspace VS Code config parsing errors

internal/​install/​doctor_vscode.go:221

Workspace-level VS Code config files that exist but are invalid JSON/JSONC are silently ignored here (err != nil just continue). That misses a common failure mode: VS Code ignores an unparseable workspace config, so the user sees “server missing” with no explanation. This should be reported as a failing check (similar to the user/profile config parsing in checkVSCodeVariant).

Comment thread internal/cmd/mcp_doctor.go
… report unparsable workspace configs

Addresses Copilot review on PR #326: mcp doctor --fix re-registers every
manifest editor unconditionally, and the registration path reads an
unparsable config as an empty map before rewriting it — silently dropping
the user's other servers. Add FixBlocked so any unparsable editor config
vetoes FixReregister/FixReinstall for the whole run, and report (instead of
silently skip) unparsable workspace-level VS Code configs the same way
user-level ones already are.
Copilot AI review requested due to automatic review settings September 23, 2026 12:51

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

Two functional gaps were found in the new repair/env-update logic (duplicate env assignments can persist; --fix won’t repair Knowledge installs), which should be addressed before approval.

Review effort: Lite
Findings: None

Resolved since last review (1)
Previously missed (2)

In code that hasn't changed since last review

Medium severity Doctor fix skips MCP Knowledge repair

internal/​cmd/​mcp_doctor.go:191

applyDoctorFixes always calls performMCPUpdate with withKnowledge=false, so mcp doctor --fix will never repair Armis Knowledge even when the report indicates knowledge checks need FixReinstall/FixReregister (and even when Knowledge is already installed). This makes --fix incomplete for multi-plugin installs.

Medium severity Duplicate env keys are left behind after replacement

internal/​install/​plugin.go:605

SetEnvFileVars replaces every occurrence of a key but does not remove duplicate assignments, so a file that already has the same key multiple times will still end up with multiple (now identical) lines. That can change which value downstream parsers pick and makes the file harder to reason about.

Addresses Copilot review on PR #326: SetEnvFileVars replaced every matching
KEY= line but didn't remove extras, so a file with a pre-existing duplicate
key (e.g. from a hand edit) stayed duplicated with the same value repeated.
Now only the first occurrence is kept.
Copilot AI review requested due to automatic review settings September 23, 2026 12:59

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

There are correctness/security gaps in newly added diagnostic utilities (JSONC empty/BOM handling and support-bundle secret scrubbing) that should be addressed before approval.

Review effort: Lite
Findings: None

Previously missed (2)

In code that hasn't changed since last review

Medium severity Short secrets may leak into support bundles

internal/​install/​doctor_bundle.go:42

WriteSupportBundle only scrubs secrets that are 4+ characters long. Since report.secrets is built from actual credential/proxy values, shorter secrets (e.g. short proxy passwords or test credentials) could still leak into the support bundle if they appear in captured stderr/log artifacts.

Medium severity BOM-only JSONC files fail empty-file handling

internal/​install/​doctor_vscode.go:482

readJSONCObject checks for an empty file before stripping a UTF-8 BOM/comments/trailing commas. A file that contains only a BOM (or BOM+comments/whitespace) will skip the empty-file fast-path and then fail json.Unmarshal, causing VS Code config discovery to incorrectly report an error.

…handling

Addresses Copilot review on PR #326: WriteSupportBundle's scrub skipped
secrets under 4 characters (short proxy passwords, test credentials),
relying only on the generic pattern-based masker as a fallback.
readJSONCObject's empty-file fast path checked raw bytes with TrimSpace,
which doesn't strip the UTF-8 BOM rune, so a BOM-only (or BOM+comments-only)
config file fell through to json.Unmarshal on empty content and was
reported as an invalid config.
Copilot AI review requested due to automatic review settings September 23, 2026 13:07

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The live MCP probe reader can block on chatty server stdout (small buffered channel), risking hangs/timeouts during mcp doctor sessions.

Review effort: Lite
Findings: None

Previously missed (2)

In code that hasn't changed since last review

Medium severity Stdout log channel can block and stall MCP session draining

internal/​install/​doctor_probe.go:186

runMCPSession's stdout scanner goroutine writes every line into a small buffered channel (size 16). If a server is chatty (many notifications/log lines), this send can block, which can stall stdout draining and hang the probe until the timeout (and potentially leak the goroutine). Consider making the channel non-blocking by discarding the oldest entry when the buffer is full.

Low severity Error message omits '=' as an invalid environment key character

internal/​install/​plugin.go:569

SetEnvFileVars rejects keys containing '=' (via strings.ContainsAny(kv[0], "=\n\r")), but the returned error message only mentions newlines. This can mislead users/debugging when a key fails validation for including '='.

Addresses Copilot review on PR #326: runMCPSession's stdout reader goroutine
fed a 16-line buffered channel with nothing draining it between the
synchronous call()/notify() invocations in the session, so a server that
bursts many log/notification lines could momentarily block the reader.
Widen the buffer instead of dropping lines, since dropping could discard
the actual RPC response under load. Also mention '=' in SetEnvFileVars's
validation error, which previously only named newlines as invalid.
Copilot AI review requested due to automatic review settings September 23, 2026 13:15

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The doctor probe can incorrectly succeed when servers emit non-JSON stdout after initialize, and a couple of diagnostics/messages and scrubbing behaviors should be corrected to avoid misleading output and preserve useful bundle data.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 1 High severity

Open (1)
Previously missed (2)

In code that hasn't changed since last review

Medium severity Do not treat all PROXY env vars as secrets

internal/​install/​doctor.go:1003

isSecretKey treats any env var containing "PROXY" as a secret. This causes support bundles to scrub non-credential proxy URLs like HTTPS_PROXY=http://proxy.corp:8080, which removes useful diagnostic detail while systemInfo/other code already masks only userinfo when present.

Low severity Report JSONC parse errors instead of invalid JSON

internal/​install/​doctor_vscode.go:138

These VS Code config files are JSONC (comments/trailing commas/BOM). When parsing fails, the error message currently says "not valid JSON", which is misleading for users troubleshooting JSONC syntax errors.

This issue also appears on line 224 of the same file.

Comment thread internal/install/doctor_probe.go
…ng plain proxy URLs, fix JSONC error wording

Addresses Copilot review on PR #326:
- mcpSession.call only treated non-JSON stdout as fatal before the
  initialize response; a server that corrupts its own stdout stream later
  (during tools/list or tools/call) had those lines silently skipped,
  letting the doctor report a healthy session for a broken transport.
- isSecretKey treated any PROXY-named env var as a secret, so a plain proxy
  URL with no embedded credentials got scrubbed to "***" in support
  bundles, destroying useful host:port detail. Now only proxy values that
  actually carry userinfo are collected as secrets.
- readJSONCObject's config-file failures were reported as "not valid
  JSON", which is misleading for JSONC syntax (comments, trailing commas).
Copilot AI review requested due to automatic review settings September 23, 2026 13:26

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

It introduces substantial new diagnostic behavior (process spawning, network probing, and support bundle generation) that warrants careful human validation, and there are identified correctness concerns to address.

Review effort: Lite
Findings: 1 High severity

Open (1)
Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Clamp negative MCP session timeout before reporting

internal/​install/​doctor_probe.go:276

mcpSession.call uses wait := time.Until(s.deadline) directly for the timer and for the timeout error message. If earlier steps consumed the entire deadline, wait can go negative, which makes the error read like "after -123ms" and is confusing.

Clamping wait to >= 0 keeps the message sensible and avoids relying on negative timer semantics.

Comment thread internal/install/editors.go
Addresses Copilot review on PR #326: mcpSession.call used time.Until's
result directly for both the timer and the timeout error message. If
earlier steps in the same session consumed the whole deadline, that value
goes negative, producing a confusing "after -123ms" message. Clamp to 0.
Copilot AI review requested due to automatic review settings September 23, 2026 13:48

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

checkManifestEditors can incorrectly report an editor registration as OK when the entry exists but has an empty/missing command, which can mask a broken configuration.

Review effort: Lite
Findings: None

Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Empty editor command is treated as healthy

internal/​install/​doctor.go:751

When the editor entry is found but its command field is missing/empty, this currently reports StatusOK and skips the live probe (because launch.Command == ""). That can mislead users into thinking the registration is healthy even though the editor can’t start the server. Treat an empty command as a failure (or at least a warning) with a remediation to re-register/fix the entry.

Copilot AI review requested due to automatic review settings September 23, 2026 14:02

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

There are a few concrete logic/concurrency issues in the new VS Code diagnostics and MCP session reader that can cause incorrect reporting and potential deadlock/leaked goroutines.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 1 High severity

Open (1)
Previously missed (2)

In code that hasn't changed since last review

Medium severity Avoid false warning for empty profile servers

internal/​install/​doctor_vscode.go:150

The profile warning is triggered whenever a profile mcp.json has a "servers" key, even if it’s an empty object. In that case the message “has its own MCP servers” is inaccurate and will create noisy false positives. Only warn when the profile actually has at least one server configured.

Medium severity Missing VS Code command should be a failure

internal/​install/​doctor_vscode.go:183

If the VS Code entry exists but has no command, VS Code cannot start the server, so this should be a failure (not a warning) and should include a remediation (delete/replace the entry with the generated snippet).

Comment thread internal/install/doctor_probe.go
…tries with no command, skip empty-profile warning
Copilot AI review requested due to automatic review settings September 23, 2026 14:12

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

VS Code launches sourced from the install manifest can leave ${workspaceFolder} unexpanded, leading to incorrect path validation/probing and misleading diagnostics.

Review effort: Lite
Findings: None

Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Expand VS Code variables before recording and probing launch

internal/​install/​doctor.go:747

For VS Code entries, the doctor currently builds the launch via lookupEntry → vscodeLaunch(entry, ""), which leaves ${workspaceFolder} unexpanded. That means the subsequent command/envFile existence checks and live probe may fail even though VS Code would expand the variable when running in a workspace (and the support-bundle launch artifact will capture the wrong command line). Consider expanding VS Code variables using DoctorOptions.WorkspaceDir (or cwd) before recording/probing the launch.

Copilot AI review requested due to automatic review settings September 23, 2026 14:19

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The changes are well-tested and cohesive, with only a small maintainability nit that doesn’t affect correctness.

Review effort: Lite
Findings: None

@yiftach-armis
yiftach-armis merged commit 8e62be7 into main Sep 23, 2026
14 checks passed
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