@clear-capabilities/agentic-security-scanner 0.167.0 → 0.168.0

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/CHANGELOG.md CHANGED
@@ -9,6 +9,48 @@
9
9
  > make the history less accurate, not more.
10
10
 
11
11
 
12
+ ## 0.168.0 - fleet: multi-repository scan orchestration and cross-repository dependency blast radius
13
+
14
+ A real, honestly-scoped slice of the organization-wide security graph recommendation: a new CLI command group,
15
+ `fleet init|scan|status|resume|query`, built almost entirely on existing machinery rather than a new engine.
16
+
17
+ **The manifest and the scan.** `fleet.yaml` declares an organization and a list of `{id, path}` repositories
18
+ (plus `workers` and `perRepoTimeout`), validated closed-world — an unknown key, a duplicate id, a non-kebab id or
19
+ an unresolvable path refuses the whole manifest. `fleet scan fleet.yaml` drives the EXISTING `posture/fleet.js`
20
+ (`runFleet`) over that list: bounded concurrency, a resumable on-disk checkpoint, per-repository isolation (one
21
+ repo exploding never takes the run down), and an honest rollup (a failed repo is reported failed, never folded
22
+ into "0 findings"). No new scanning engine was written for this.
23
+
24
+ **The new part: a cross-repository dependency graph.** Built purely from each repository's own package manifest
25
+ (`package.json`/`go.mod`/`Cargo.toml`/`requirements.txt`/`pyproject.toml` — name plus dependencies), with no
26
+ deployment configuration required, so a fleet of plain application repositories works immediately. `fleet query
27
+ --depends-on <repo-id>` answers "which repositories depend on this one, directly or transitively, and through
28
+ what path" — a real question about organization-wide blast radius, not a guess.
29
+
30
+ **A real, grounded demonstration, not an asserted-away fixture.** A four-repository synthetic organization
31
+ (frontend, payments-api, shared-auth-lib, payments-worker) where only `shared-auth-lib` carries an actual
32
+ command-injection vulnerability the deterministic engine genuinely finds (the same confirmed-detected shape —
33
+ `req.body.host` into `child_process.exec` — already used in this repository's own fixtures). The blast-radius
34
+ query correctly reports `frontend` and `payments-api` as direct dependents and `payments-worker` as a transitive
35
+ one, through `payments-api`, at the right depth, with the right path.
36
+
37
+ **A bug this process itself caught, twice.** A first draft of the fleet CLI wrapped `runScan()`'s own
38
+ `{ scan, meta }` return value in a SECOND `{ scan }` object; `runFleet`'s internal summarizer reads fields
39
+ defensively rather than throwing on the wrong shape, so every repository silently reported zero findings with no
40
+ error of any kind. Found by running the CLI against the fixture and noticing the finding count was wrong, not by
41
+ the automated test — whose own fixture at the time also happened to use a vulnerability shape the deterministic
42
+ engine does not actually flag (an unlabeled function parameter reaching `exec`, no recognized untrusted source).
43
+ Both are fixed, and the fixture now uses the same confirmed-detected shape the test asserts against.
44
+
45
+ **Still open, and disclosed as such** (`docs/implementation-status/fleet.md`): no Internet-facing/regulated-data
46
+ overlay — the fuller "which Internet-facing app can reach PCI data through this component" question needs the
47
+ existing deployment-boundary graph's trust-zone model layered on top of this dependency graph, not attempted
48
+ here; no natural-language query parser (`--depends-on <repo-id>` is the one supported shape); no SQLite-backed
49
+ storage (reuses the existing flat-JSON fleet checkpoint; `posture/portfolio/backend.js`'s existing storage
50
+ abstraction is the natural place for a SQLite implementation later); no persisted job queue with lease/retry
51
+ (reuses in-process `runFleet` rather than the heavier, operator-only `portfolio/work-units.js` scheduler); matching
52
+ across repositories is by declared package name only, with no ecosystem disambiguation.
53
+
12
54
  ## 0.167.0 - execution-backed exploit proof, and a self-learning rule compiler that turns one confirmed finding into a deterministic detection rule
13
55
 
14
56
  Two new, independently opt-in capabilities, each off by default until explicitly invoked.
@@ -7115,6 +7115,7 @@ async function main() {
7115
7115
  case 'triage': process.exit(await cmdTriage(args));
7116
7116
  case 'org-scan': process.exit(await cmdOrgScan(args));
7117
7117
  case 'rules': process.exit(await cmdRules(args));
7118
+ case 'fleet': process.exit(await (await import('../src/posture/fleet/cli.js')).cmdFleet(args, path.resolve(args.flags.root || '.')));
7118
7119
  case 'rule': process.exit(await cmdRule(args));
7119
7120
  case 'tickets': process.exit(await cmdTickets(args));
7120
7121
  case 'secure': process.exit(await cmdSecure(args));
@@ -10,10 +10,11 @@ export const modules = {
10
10
  /* harmony export */ ensurePolicyKeyPair: () => (/* binding */ ensurePolicyKeyPair),
11
11
  /* harmony export */ loadPolicyBundles: () => (/* binding */ loadPolicyBundles),
12
12
  /* harmony export */ loadPolicyPublicKey: () => (/* binding */ loadPolicyPublicKey),
13
+ /* harmony export */ rE: () => (/* binding */ computePolicyDrift),
13
14
  /* harmony export */ resolveEffectivePolicy: () => (/* binding */ resolveEffectivePolicy),
14
15
  /* harmony export */ signPolicyBundle: () => (/* binding */ signPolicyBundle)
15
16
  /* harmony export */ });
16
- /* unused harmony exports POLICY_BUNDLE_SCHEMA, SCOPES, canonicalPolicyBytes, verifyPolicyBundle, computePolicyDrift */
17
+ /* unused harmony exports POLICY_BUNDLE_SCHEMA, SCOPES, canonicalPolicyBytes, verifyPolicyBundle */
17
18
  /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(73024);
18
19
  /* harmony import */ var node_os__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(48161);
19
20
  /* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(76760);