nsauditor-ai 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,9 @@ NSAuditor AI is the open-source core of a privacy-first security intelligence pl
17
17
 
18
18
  ## What's New
19
19
 
20
- **Latest: CE 0.2.16 + Enterprise 0.31.4** (June 2026) — paired content bump for the Enterprise **"Cloud-scan presentation false-clean fix + `--compliance all` / fail-fast validation"** cycle. A cloud scan (`--host aws|azure|gcp`) with real findings no longer surfaces the network concluder's *"Host is UPNo open services detected"* headline the conclusion shows a cloud-appropriate summary (N findings by severity + top risks), and a plugin that **times out or errors** routes to **coverage UNVERIFIED** rather than an affirmative clean verdict. **`--compliance all`** expands to all seven frameworks and an unknown `--compliance` token now **fails fast** (no *"Framework load failed"* stub) the CE `--help` now documents both (the only CE-side change). Detection is unchanged (oracle-validated). **No new framework, no new plugins (still 28), no coverage-matrix changes.** Paired **EE 0.31.4** + agent-skill 0.2.16. **EE 0.31.4 requires CE 0.2.8+.** See [CHANGELOG.md](./CHANGELOG.md).
20
+ **Latest: CE 0.2.18 + Enterprise 0.31.4** (June 2026) — **CLI usability patch:** `--host aws,gcp,azure` now scans **one or more clouds in a single run** (comma-separated; `--host aws` for one cloud). Previously a comma list hit the SSRF guard (`getaddrinfo ENOTFOUND aws,gcp,azure`)there was no way to audit multiple clouds in one command. The `--host` `--help` documents the comma form + warns that the `aws|gcp|azure` (pipe) form is notation (a shell treats `|` as a pipe). **0.2.18** also fixes the per-host auto-scope log line so it no longer implies other clouds are dropped on a multi-cloud run (they're scanned on their own pass). **CLI-only change (CE)**; Enterprise 0.31.4 unaffected (peer `nsauditor-ai >=0.2.8` unchanged). See [CHANGELOG.md](./CHANGELOG.md).
21
+
22
+ **Prior: CE 0.2.16 + Enterprise 0.31.4** (June 2026) — paired content bump for the Enterprise **"Cloud-scan presentation false-clean fix + `--compliance all` / fail-fast validation"** cycle. A cloud scan (`--host aws|azure|gcp`) with real findings no longer surfaces the network concluder's *"Host is UP — No open services detected"* headline — the conclusion shows a cloud-appropriate summary (N findings by severity + top risks), and a plugin that **times out or errors** routes to **coverage UNVERIFIED** rather than an affirmative clean verdict. **`--compliance all`** expands to all seven frameworks and an unknown `--compliance` token now **fails fast** (no *"Framework load failed"* stub) — the CE `--help` now documents both (the only CE-side change). Detection is unchanged (oracle-validated). **No new framework, no new plugins (still 28), no coverage-matrix changes.** Paired **EE 0.31.4** + agent-skill 0.2.16. **EE 0.31.4 requires CE 0.2.8+.** See [CHANGELOG.md](./CHANGELOG.md).
21
23
 
22
24
  **Prior: CE 0.2.15 + Enterprise 0.31.3** (June 2026) — paired content bump for the Enterprise **"Enumeration-failure fleet sweep (no-silent-false-clean) + Aurora DB-cluster snapshot dimension"** cycle. The Enterprise engine closes a fleet-wide class of **enumeration-failure** false-cleans across **12 AWS plugins** — a scanner that cannot enumerate a resource population now fails **CLOSED** with a routed evidence-gap instead of reading CLEAN — and adds the Aurora **DB-cluster snapshot** dimension to plugin 1140 (a public `restore=all` cluster snapshot is CRITICAL, an unencrypted one HIGH; the cluster surface instance-level scans never see), with a Multi-AZ DB cluster fail-close. **No new framework, no new plugins (still 28), no coverage-matrix changes** — a false-negative-hardening release. **No CE engine behavior change** (the detection + routing live in the Enterprise engine). Paired **EE 0.31.3** + agent-skill 0.2.15. **EE 0.31.3 requires CE 0.2.8+.** See [CHANGELOG.md](./CHANGELOG.md).
23
25
 
package/cli.mjs CHANGED
@@ -913,13 +913,19 @@ Environment:
913
913
  COMPLIANCE_TSA_URL RFC 3161 timestamp authority for SOC 2 attestation
914
914
 
915
915
  Cloud-scan hosts:
916
- --host aws | gcp | azure Sentinel literals (case-insensitive). These are not
917
- DNS-resolved; they route the scan to the matching
916
+ --host aws[,gcp,azure] One or more cloud sentinel literals, comma-separated
917
+ (case-insensitive): use 'aws' for one cloud, or
918
+ 'aws,gcp,azure' to audit all three in one run (each cloud
919
+ is scanned in turn). Do NOT write aws|gcp|azure with pipe
920
+ characters — your shell treats | as a pipe. Sentinels are
921
+ not DNS-resolved; they route the scan to the matching
918
922
  cloud-scanner plugins via the provider's control-plane
919
923
  API, and imply CLOUD_PROVIDER=<host> when unset. With
920
924
  --plugins all the scan AUTO-SCOPES to only that cloud's
921
- plugins (other clouds + non-cloud plugins are skipped and
922
- the skip is logged)so --plugins all is safe here.
925
+ plugins (plugins not applicable to this host are skipped +
926
+ logged — other-cloud plugins run on their OWN --host pass,
927
+ non-cloud plugins need a network host) — so --plugins all
928
+ is safe here.
923
929
  Note: the composite zero-trust checker (1023) has no
924
930
  single cloud and is therefore skipped under this
925
931
  auto-scope; to run it, select it explicitly
@@ -929,6 +935,7 @@ Examples:
929
935
  nsauditor-ai scan --host 10.0.0.1 --plugins all
930
936
  CLOUD_PROVIDER=aws AWS_PROFILE=default \\
931
937
  nsauditor-ai scan --host aws --plugins all --compliance all # full AWS audit, all 7 frameworks
938
+ nsauditor-ai scan --host aws,gcp,azure --plugins all --compliance all # all 3 clouds in one run
932
939
  nsauditor-ai scan --host 10.0.0.0/24 --plugins all --compliance soc2
933
940
  nsauditor-ai license install enterprise_eyJhbGciOiJFUzI1NiIs...
934
941
  nsauditor-ai license --status
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nsauditor-ai",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "description": "Modular AI-assisted network security audit platform — Community Edition",
5
5
  "type": "module",
6
6
  "private": false,
@@ -784,7 +784,8 @@ export class PluginManager {
784
784
  console.error(
785
785
  `Cloud host '${scope.provider}' → running ${scope.selected.length} ` +
786
786
  `${scope.provider.toUpperCase()} plugin(s); skipping ${scope.skipped.length} ` +
787
- `non-${scope.provider} plugin(s) (other clouds + non-cloud).`,
787
+ `non-${scope.provider} plugin(s) not applicable to this host ` +
788
+ `(other-cloud plugins run on their own --host pass; non-cloud plugins need a network host/CIDR).`,
788
789
  );
789
790
  }
790
791
  }
@@ -137,6 +137,8 @@ export function expandRange(range) {
137
137
  * Detect input type and return array of hosts.
138
138
  * - If contains '/' → CIDR
139
139
  * - If contains '-' with IP pattern → dash range
140
+ * - If contains ',' → comma-separated list (each token parsed + flattened, e.g.
141
+ * `aws,gcp,azure` → multi-cloud, or `10.0.0.1,10.0.0.2`)
140
142
  * - If file exists → host file
141
143
  * - Otherwise → single IP/hostname
142
144
  */
@@ -151,6 +153,24 @@ export async function parseHostArg(arg) {
151
153
  return expandRange(arg);
152
154
  }
153
155
 
156
+ // Comma-separated list (e.g. multi-cloud `aws,gcp,azure`, or `10.0.0.1,10.0.0.2`):
157
+ // split and parse each token recursively so cloud sentinels, CIDRs, and ranges all
158
+ // compose. A real host-file whose path happens to contain a comma is still read as a
159
+ // file (checked first); otherwise the comma is treated as a list separator.
160
+ if (typeof arg === 'string' && arg.includes(',')) {
161
+ if (!path.isAbsolute(arg)) {
162
+ const r = path.resolve(arg);
163
+ if (r.startsWith(process.cwd() + path.sep)) {
164
+ try { await fsp.access(arg); return parseHostFile(arg); } catch { /* not a file → treat as a list */ }
165
+ }
166
+ }
167
+ const out = [];
168
+ for (const token of arg.split(',').map((t) => t.trim()).filter(Boolean)) {
169
+ out.push(...await parseHostArg(token));
170
+ }
171
+ return out;
172
+ }
173
+
154
174
  // Path traversal guard: reject absolute paths and paths resolving outside cwd
155
175
  if (path.isAbsolute(arg)) return [arg]; // treat as hostname, not file
156
176
  const resolved = path.resolve(arg);