Loading npm security reports…
@indigoai-us/hq-cli@5.345.111: Clean npm security report (Allow) | LPM Firewall
Allowed — no malicious behavior detected
No malicious behavior detected. 26 low-signal pattern(s) reviewed.
AI Security Reviewscanned 9d ago · by lpm-firewall-ai Inspected source shows package-aligned OAuth requests and a postinstall check limited to updating an existing stale daemon. The flagged agent configuration paths do not establish unconsented control changes or content export.
Static reason
High-risk behavior combination matched malicious policy.; previous stored version diff introduced dangerous source
Trigger
The npm postinstall hook runs a stale-only check for an existing HQ daemon.
Impact
The inspected code does not show credential disclosure to an unrelated recipient or unconsented agent control changes.
Mechanism
The check leaves a current daemon unchanged and updates it only when its recorded version or Node path requires it. The OAuth collector contacts Anthropic endpoints for usage and token operations.
AI rationale
Inspected source shows package-aligned OAuth requests and a postinstall check limited to updating an existing stale daemon. The flagged agent configuration paths do not establish unconsented control changes or content export.
Decision evidencepublic snapshot AI called this Clean at 91.0% confidence as Benign with low false-positive risk.
Evidence for AI clean decision
The postinstall hook runs a package-local daemon update check. Its stale-only path leaves a current daemon unchanged and updates only when the recorded version or Node path requires it. The Claude OAuth collector reads local credentials and sends bearer or refresh tokens to Anthropic usage, profile, and token endpoints. The indicated agent integration locations handle local HQ or Claude settings and policy paths, exclude secret-bearing paths, or check whether credential files exist; they do not establish automatic private-content export or broad agent configuration changes. Other inspected paths are CLI startup and update handling, explicit agent enrollment, host identity lookup, and a policy-validation hook. Behavioral surface
Source ChildProcess Crypto DynamicRequire EnvironmentVars Filesystem Network Shell
Supply chain HighEntropyStrings Minified
Source & flagged code18 flagged · loading source • scripts.postinstall = node scripts/mesh-daemon-if-stale.mjs || true
High Install Time Lifecycle Scripts
Package defines install-time lifecycle scripts.
package.json View on unpkg • scripts.postinstall = node scripts/mesh-daemon-if-stale.mjs || true
Medium Ambiguous Install Lifecycle Script
Install-time lifecycle script is not statically allowlisted and needs review.
package.json View on unpkg 18 */
L19: import { spawnSync } from "node:child_process";
L20: import { stringDerivedPackageRoot } from "./utils/hq-roots.js";
High Child Process
Package source references child process execution.
dist/startup-registration.js View on unpkg · L18 Findings2 Critical 9 High 9 Medium 6 Low
Critical Credential Exfiltration dist/lib/capacity/collectors/claude-oauth.js
Critical Previous Version Dangerous Delta dist/index.js
High Install Time Lifecycle Scripts package.json
High Child Process dist/startup-registration.js
High Shell dist/utils/staged-install.js
High Same File Env Network Execution dist/commands/rescue.js#virtual:normalized:round1
High Command Output Exfiltration dist/commands/rescue.js#virtual:normalized:round1
High Cloud Metadata Access dist/lib/lanes/machine-identity.js
High Trigger Reachable Persistence dist/lib/mesh/live/daemon/install.js
High Payload In Excluded Dir assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh
Affected versions and remediation This report applies to @indigoai-us/hq-cli@5.345.111 .
See all versions of @indigoai-us/hq-cli for other recorded verdicts.
Review the evidence and your use of @indigoai-us/hq-cli@5.345.111 before allowing it. Restrict the permissions described in this report. Choose an independently verified alternative or release. This report does not establish that other versions are safe. Evidence last updated: 2026-10-13 22:53:27.677Z (UTC) .
Think this verdict is wrong? Dispute it on GitHub or read how reports are produced .
UrlStrings
Manifest No manifest risk signals triggered.
scanned 916 file(s), 12.5 MB of source, external domains: 127.0.0.1, a.co, api.anthropic.com, api.github.com, api.indigo-hq.com, api.openai.com, api.slack.com, cli-chat-proxy.grok.com, console.anthropic.com, example.com, github.com, gmailmcp.googleapis.com, hq.computer, hq.getindigo.ai, hq.indigo.ai, hqapi.hq.computer, json-schema.org, nodejs.org, onboarding.hq.computer, registry.npmjs.org, schemas.microsoft.com, www.apple.com
Oversized source lightweight scan
dist/hq-cloud-sync-runner/bin/sync-runner.js 5.84 MB file, sampled 256 KB
Filesystem EnvironmentVars HighEntropyStrings UrlStrings a.co github.com hqapi.hq.computer
336 env: childEnv,
L337: shell: true,
L338: stdio: "ignore",
dist/utils/update-command-supervisor.cjs View file 2 L3: const { spawn: nativeSpawn } = require("node:child_process");
L4: const fs = require("node:fs");
Medium Dynamic Require
Package source references dynamic require/import behavior.
dist/utils/update-command-supervisor.cjs View on unpkg · L2 2 import * as crypto from "node:crypto";
L3: import { spawnSync } from "node:child_process";
L4: import * as fs from "node:fs";
...
L20: /** The status file path used by hq-cloud's watch-owner lease. */
L21: export function watchRunnerOwnerStatusPath(hqRoot, home = os.homedir(), env = process.env) {
L22: let canonicalRoot = path.resolve(hqRoot);
...
L39: try {
L40: parsed = JSON.parse(fs.readFileSync(statusPath, "utf8"));
L41: }
...
L128: const variants = new Set([pathApi.resolve(hqRoot)]);
L129: if (platform === process.platform) {
L130: try {
Low Weak Crypto
Package source references weak cryptographic algorithms.
dist/lib/daemon/sync-runner.js View on unpkg · L2 dist/lib/mesh/live/daemon/install.js View file 7 Trigger-reachable persistence chain: manifest.main -> dist/index.js -> dist/main.js -> dist/utils/self-update.js -> [redacted].js
L7: * - Windows: per-user Scheduled Task ai.getindigo.hq-mesh-daemon registered
L8: * from a rendered task XML via schtasks.exe (no native dependencies)
L9: *
...
L16: import * as path from "node:path";
L17: import { spawnSync } from "node:child_process";
L18: import semver from "semver";
...
L54: status: r.status,
L55: stdout: r.stdout ?? "",
L56: stderr: r.error ? r.error.message : (r.stderr ?? ""),
...
L62: const raw = readFileSync(file);
L63: const buf = Buffer.isBuffer(raw) ? raw : Buffer.from(String(raw));
L64: if ((buf.length >= 2 && buf[0] === 0xff && buf[1] === 0xfe) || buf.includes(0)) {
High Trigger Reachable Persistence
A manifest entrypoint or package-local install chain reaches persistence behavior.
dist/lib/mesh/live/daemon/install.js View on unpkg · L7 7 * - Windows: per-user Scheduled Task ai.getindigo.hq-mesh-daemon registered
L8: * from a rendered task XML via schtasks.exe (no native dependencies)
L9: *
...
L16: import * as path from "node:path";
L17: import { spawnSync } from "node:child_process";
L18: import semver from "semver";
...
L54: status: r.status,
L55: stdout: r.stdout ?? "",
L56: stderr: r.error ? r.error.message : (r.stderr ?? ""),
...
L62: const raw = readFileSync(file);
L63: const buf = Buffer.isBuffer(raw) ? raw : Buffer.from(String(raw));
L64: if ((buf.length >= 2 && buf[0] === 0xff && buf[1] === 0xfe) || buf.includes(0)) {
Medium Install Persistence
Source writes installer persistence such as shell profile or service configuration.
dist/lib/mesh/live/daemon/install.js View on unpkg · L7 dist/commands/rescue.js#virtual:normalized:round1 View file 1 import { spawnSync } from "child_process";
L2: import * as fs from "fs";
...
L11: /**
L12: * Resolve the source repo + ref from the user"s flags. Pure + exported for\n * tests. `latestTag` is the resolved latest release tag (prod only); ignored\n * for staging and when a...
L13: if (!ref) {
High Same File Env Network Execution
A single source file combines environment access, network access, and code or shell execution; review context before blocking.
dist/commands/rescue.js#virtual:normalized:round1 View on unpkg · L1 1 import { spawnSync } from "child_process";
L2: import * as fs from "fs";
...
L11: /**
L12: * Resolve the source repo + ref from the user"s flags. Pure + exported for\n * tests. `latestTag` is the resolved latest release tag (prod only); ignored\n * for staging and when a...
L13: if (!ref) {
High Command Output Exfiltration
Source combines command execution, command-output handling, and outbound requests; review data flow before blocking.
dist/commands/rescue.js#virtual:normalized:round1 View on unpkg · L1 dist/lib/capacity/collectors/claude-oauth.js View file 6 * or the credentials JSON under ~/.claude/ on Linux). GETs
L7: * https://api.anthropic.com/api/oauth/usage with the oauth-2025-04-20 beta
L8: * header. This module does not invoke the claude CLI except
...
L31: */
L32: import { execFile, spawnSync } from "node:child_process";
L33: import * as crypto from "node:crypto";
...
L81: }
L82: export function defaultClaudeCredentialsPath(home = os.homedir()) {
L83: return path.join(home, ".claude", ".credentials.json");
...
L274: retryAfter = response.headers?.get("retry-after") ?? null;
L275: text = status === 200 ? await response.text() : "";
L276: }
Critical Credential Exfiltration
Source appears to send environment or credential material to an external endpoint.
dist/lib/capacity/collectors/claude-oauth.js View on unpkg · L6 11 */
L12: import { spawnSync } from "node:child_process";
L13: import * as os from "node:os";
L14: export const IMDS_HOST = "169.254.169.254";
L15: export const IMDS_TOKEN_URL = `http://${IMDS_HOST}/latest/api/token`;
L16: export const IMDS_INSTANCE_ID_URL = `http://${IMDS_HOST}/latest/meta-data/instance-id`;
...
L30: return null;
L31: const body = (result.stdout ?? "").trim();
L32: return body.length > 0 ? body : null;
...
L34: catch (err) {
L35: process.stderr.write(`hq lanes: IMDS request failed for ${url}: ${err instanceof Error ? err.message : String(err)}\n`);
L36: return null;
High Cloud Metadata Access
Source reaches cloud instance metadata or link-local credential endpoints.
dist/lib/lanes/machine-identity.js View on unpkg · L11 assets/lanes-hooks/hq-lanes-drain.sh View file • path = assets/lanes-hooks/hq-lanes-drain.sh
kind = build_helper
sizeBytes = 620
magicHex = [redacted]
Medium Ships Build Helper
Package ships non-JavaScript build or shell helper files.
assets/lanes-hooks/hq-lanes-drain.sh View on unpkg assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh View file • path = assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh
kind = payload_in_excluded_dir
sizeBytes = 21475
magicHex = [redacted]
High Payload In Excluded Dir
Package hides binary, compressed, or executable-looking payloads in test/fixture/hidden paths.
assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh View on unpkg dist/hq-cloud-sync-runner/bin/sync-runner.js View file • path = dist/hq-cloud-sync-runner/bin/sync-runner.js
kind = oversized_source_file
sizeBytes = 6119581
magicHex = [redacted]
Medium Oversized Source File
Package contains source files above the normal full-analysis size ceiling.
dist/hq-cloud-sync-runner/bin/sync-runner.js View on unpkg • path = dist/hq-cloud-sync-runner/bin/sync-runner.js
kind = oversized_cli_entrypoint
sizeBytes = 6119581
magicHex = [redacted]
Medium Oversized Cli Entrypoint
Package contains an oversized executable-looking CLI entrypoint.
dist/hq-cloud-sync-runner/bin/sync-runner.js View on unpkg dist/commands/agent-enroll.js#virtual:normalized:round1 View file • stage = ast_semantic_analysis; reason = ast_parse_error; limitedFiles = 44
High Semantic Analysis Limited
A bounded semantic-analysis stage reached its safety limit; remaining detectors completed, but this package requires AI review.
dist/commands/agent-enroll.js#virtual:normalized:round1 View on unpkg • matchType = previous_version_dangerous_delta
matchedPackage = @indigoai-us/hq-cli@5.345.107
matchedIdentity = npm:QGluZGlnb2FpLXVzL2hxLWNsaQ:5.345.107
similarity = 0.942
summary = stored previous version shares package body but lacks this dangerous source file
Critical Previous Version Dangerous Delta
This package version adds a dangerous source file absent from the previous stored version; route for source-aware review.
dist/index.js View on unpkg High Semantic Analysis Limited dist/commands/agent-enroll.js#virtual:normalized:round1
Medium Ambiguous Install Lifecycle Script package.json
Medium Dynamic Require dist/utils/update-command-supervisor.cjs
Medium Install Persistence dist/lib/mesh/live/daemon/install.js
Medium Ships Build Helper assets/lanes-hooks/hq-lanes-drain.sh
Medium Oversized Source File dist/hq-cloud-sync-runner/bin/sync-runner.js
Medium Oversized Cli Entrypoint dist/hq-cloud-sync-runner/bin/sync-runner.js
Medium Structural Risk Force Deep Review
Low Non Install Lifecycle Scripts
Low Weak Crypto dist/lib/daemon/sync-runner.js
types → ./dist/index.d.ts
bin → hq, hq-auth-refresh
Artifact 23.1 MB · 1,949 files 2 signature(s)
Install lifecycle postinstall prepare prepublishOnly
Behavioral surface ChildProcess Crypto DynamicRequire EnvironmentVars Filesystem Network Shell HighEntropyStrings Minified UrlStrings Manifest: clean
Source & flagged code18 flagged • scripts.postinstall = node scripts/mesh-daemon-if-stale.mjs || true
High Install Time Lifecycle Scripts
Package defines install-time lifecycle scripts.
package.json View on unpkg • scripts.postinstall = node scripts/mesh-daemon-if-stale.mjs || true
Medium Ambiguous Install Lifecycle Script
Install-time lifecycle script is not statically allowlisted and needs review.
package.json View on unpkg 18 */
L19: import { spawnSync } from "node:child_process";
L20: import { stringDerivedPackageRoot } from "./utils/hq-roots.js";
High Child Process
Package source references child process execution.
dist/startup-registration.js View on unpkg · L18 336 env: childEnv,
L337: shell: true,
L338: stdio: "ignore",
dist/utils/update-command-supervisor.cjs View file 2 L3: const { spawn: nativeSpawn } = require("node:child_process");
L4: const fs = require("node:fs");
Medium Dynamic Require
Package source references dynamic require/import behavior.
dist/utils/update-command-supervisor.cjs View on unpkg · L2 2 import * as crypto from "node:crypto";
L3: import { spawnSync } from "node:child_process";
L4: import * as fs from "node:fs";
...
L20: /** The status file path used by hq-cloud's watch-owner lease. */
L21: export function watchRunnerOwnerStatusPath(hqRoot, home = os.homedir(), env = process.env) {
L22: let canonicalRoot = path.resolve(hqRoot);
...
L39: try {
L40: parsed = JSON.parse(fs.readFileSync(statusPath, "utf8"));
L41: }
...
L128: const variants = new Set([pathApi.resolve(hqRoot)]);
L129: if (platform === process.platform) {
L130: try {
Low Weak Crypto
Package source references weak cryptographic algorithms.
dist/lib/daemon/sync-runner.js View on unpkg · L2 dist/lib/mesh/live/daemon/install.js View file 7 Trigger-reachable persistence chain: manifest.main -> dist/index.js -> dist/main.js -> dist/utils/self-update.js -> [redacted].js
L7: * - Windows: per-user Scheduled Task ai.getindigo.hq-mesh-daemon registered
L8: * from a rendered task XML via schtasks.exe (no native dependencies)
L9: *
...
L16: import * as path from "node:path";
L17: import { spawnSync } from "node:child_process";
L18: import semver from "semver";
...
L54: status: r.status,
L55: stdout: r.stdout ?? "",
L56: stderr: r.error ? r.error.message : (r.stderr ?? ""),
...
L62: const raw = readFileSync(file);
L63: const buf = Buffer.isBuffer(raw) ? raw : Buffer.from(String(raw));
L64: if ((buf.length >= 2 && buf[0] === 0xff && buf[1] === 0xfe) || buf.includes(0)) {
High Trigger Reachable Persistence
A manifest entrypoint or package-local install chain reaches persistence behavior.
dist/lib/mesh/live/daemon/install.js View on unpkg · L7 7 * - Windows: per-user Scheduled Task ai.getindigo.hq-mesh-daemon registered
L8: * from a rendered task XML via schtasks.exe (no native dependencies)
L9: *
...
L16: import * as path from "node:path";
L17: import { spawnSync } from "node:child_process";
L18: import semver from "semver";
...
L54: status: r.status,
L55: stdout: r.stdout ?? "",
L56: stderr: r.error ? r.error.message : (r.stderr ?? ""),
...
L62: const raw = readFileSync(file);
L63: const buf = Buffer.isBuffer(raw) ? raw : Buffer.from(String(raw));
L64: if ((buf.length >= 2 && buf[0] === 0xff && buf[1] === 0xfe) || buf.includes(0)) {
Medium Install Persistence
Source writes installer persistence such as shell profile or service configuration.
dist/lib/mesh/live/daemon/install.js View on unpkg · L7 dist/commands/rescue.js#virtual:normalized:round1 View file 1 import { spawnSync } from "child_process";
L2: import * as fs from "fs";
...
L11: /**
L12: * Resolve the source repo + ref from the user"s flags. Pure + exported for\n * tests. `latestTag` is the resolved latest release tag (prod only); ignored\n * for staging and when a...
L13: if (!ref) {
High Same File Env Network Execution
A single source file combines environment access, network access, and code or shell execution; review context before blocking.
dist/commands/rescue.js#virtual:normalized:round1 View on unpkg · L1 1 import { spawnSync } from "child_process";
L2: import * as fs from "fs";
...
L11: /**
L12: * Resolve the source repo + ref from the user"s flags. Pure + exported for\n * tests. `latestTag` is the resolved latest release tag (prod only); ignored\n * for staging and when a...
L13: if (!ref) {
High Command Output Exfiltration
Source combines command execution, command-output handling, and outbound requests; review data flow before blocking.
dist/commands/rescue.js#virtual:normalized:round1 View on unpkg · L1 dist/lib/capacity/collectors/claude-oauth.js View file 6 * or the credentials JSON under ~/.claude/ on Linux). GETs
L7: * https://api.anthropic.com/api/oauth/usage with the oauth-2025-04-20 beta
L8: * header. This module does not invoke the claude CLI except
...
L31: */
L32: import { execFile, spawnSync } from "node:child_process";
L33: import * as crypto from "node:crypto";
...
L81: }
L82: export function defaultClaudeCredentialsPath(home = os.homedir()) {
L83: return path.join(home, ".claude", ".credentials.json");
...
L274: retryAfter = response.headers?.get("retry-after") ?? null;
L275: text = status === 200 ? await response.text() : "";
L276: }
Critical Credential Exfiltration
Source appears to send environment or credential material to an external endpoint.
dist/lib/capacity/collectors/claude-oauth.js View on unpkg · L6 11 */
L12: import { spawnSync } from "node:child_process";
L13: import * as os from "node:os";
L14: export const IMDS_HOST = "169.254.169.254";
L15: export const IMDS_TOKEN_URL = `http://${IMDS_HOST}/latest/api/token`;
L16: export const IMDS_INSTANCE_ID_URL = `http://${IMDS_HOST}/latest/meta-data/instance-id`;
...
L30: return null;
L31: const body = (result.stdout ?? "").trim();
L32: return body.length > 0 ? body : null;
...
L34: catch (err) {
L35: process.stderr.write(`hq lanes: IMDS request failed for ${url}: ${err instanceof Error ? err.message : String(err)}\n`);
L36: return null;
High Cloud Metadata Access
Source reaches cloud instance metadata or link-local credential endpoints.
dist/lib/lanes/machine-identity.js View on unpkg · L11 assets/lanes-hooks/hq-lanes-drain.sh View file • path = assets/lanes-hooks/hq-lanes-drain.sh
kind = build_helper
sizeBytes = 620
magicHex = [redacted]
Medium Ships Build Helper
Package ships non-JavaScript build or shell helper files.
assets/lanes-hooks/hq-lanes-drain.sh View on unpkg assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh View file • path = assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh
kind = payload_in_excluded_dir
sizeBytes = 21475
magicHex = [redacted]
High Payload In Excluded Dir
Package hides binary, compressed, or executable-looking payloads in test/fixture/hidden paths.
assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh View on unpkg dist/hq-cloud-sync-runner/bin/sync-runner.js View file • path = dist/hq-cloud-sync-runner/bin/sync-runner.js
kind = oversized_source_file
sizeBytes = 6119581
magicHex = [redacted]
Medium Oversized Source File
Package contains source files above the normal full-analysis size ceiling.
dist/hq-cloud-sync-runner/bin/sync-runner.js View on unpkg • path = dist/hq-cloud-sync-runner/bin/sync-runner.js
kind = oversized_cli_entrypoint
sizeBytes = 6119581
magicHex = [redacted]
Medium Oversized Cli Entrypoint
Package contains an oversized executable-looking CLI entrypoint.
dist/hq-cloud-sync-runner/bin/sync-runner.js View on unpkg dist/commands/agent-enroll.js#virtual:normalized:round1 View file • stage = ast_semantic_analysis; reason = ast_parse_error; limitedFiles = 44
High Semantic Analysis Limited
A bounded semantic-analysis stage reached its safety limit; remaining detectors completed, but this package requires AI review.
dist/commands/agent-enroll.js#virtual:normalized:round1 View on unpkg • matchType = previous_version_dangerous_delta
matchedPackage = @indigoai-us/hq-cli@5.345.107
matchedIdentity = npm:QGluZGlnb2FpLXVzL2hxLWNsaQ:5.345.107
similarity = 0.942
summary = stored previous version shares package body but lacks this dangerous source file
Critical Previous Version Dangerous Delta
This package version adds a dangerous source file absent from the previous stored version; route for source-aware review.
dist/index.js View on unpkg