@clear-capabilities/agentic-security-scanner 0.162.0 → 0.163.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 +26 -0
- package/bin/agentic-security.js +87 -0
- package/dist/1340.index.js +1871 -0
- package/dist/3477.index.js +727 -0
- package/dist/3499.index.js +23 -3
- package/dist/4113.index.js +1 -1
- package/dist/5014.index.js +833 -0
- package/dist/5756.index.js +2 -2
- package/dist/6257.index.js +1 -1
- package/dist/6907.index.js +248 -0
- package/dist/6994.index.js +1 -1
- package/dist/7033.index.js +33 -5
- package/dist/7439.index.js +1822 -0
- package/dist/7838.index.js +1 -1
- package/dist/9560.index.js +2318 -23
- package/dist/957.index.js +1 -1
- package/dist/9999.index.js +43 -7
- package/dist/agentic-security.mjs +12 -12
- package/dist/agentic-security.mjs.sha256 +1 -1
- package/package.json +33 -6
- package/src/capabilities/CLAUDE.md +114 -0
- package/src/capabilities/address.js +73 -0
- package/src/capabilities/attack-coverage.js +93 -0
- package/src/capabilities/decide.js +256 -0
- package/src/capabilities/delegate.js +69 -0
- package/src/capabilities/egress.js +20 -0
- package/src/capabilities/hook-advice.js +50 -0
- package/src/capabilities/index.js +32 -0
- package/src/capabilities/manifest.js +344 -0
- package/src/capabilities/outbound.js +189 -0
- package/src/capabilities/paths.js +57 -0
- package/src/capabilities/probes.js +211 -0
- package/src/capabilities/proxy.js +182 -0
- package/src/capabilities/reasons.js +67 -0
- package/src/capabilities/receipts.js +356 -0
- package/src/capabilities/records.js +58 -0
- package/src/capabilities/recovery.js +367 -0
- package/src/capabilities/report.js +81 -0
- package/src/capabilities/runner.js +236 -0
- package/src/capabilities/secrets.js +26 -0
- package/src/capabilities/tool-gate.js +119 -0
- package/src/capabilities/tool-registry.js +60 -0
- package/src/dataflow/CLAUDE.md +29 -0
- package/src/dataflow/catalog.js +21 -0
- package/src/dataflow/engine.js +20 -0
- package/src/dataflow/guard-dominance.js +352 -0
- package/src/discovery/CLAUDE.md +9 -0
- package/src/discovery/index.js +15 -1
- package/src/discovery/lenses.js +18 -0
- package/src/engine.js +80 -15
- package/src/integrations/index.js +5 -2
- package/src/ir/CLAUDE.md +14 -0
- package/src/ir/implicit-handler-params.js +74 -0
- package/src/ir/parser-cs.js +20 -0
- package/src/ir/parser-go.js +30 -13
- package/src/ir/parser-java.js +11 -0
- package/src/language/nix-eval-isolation.js +33 -5
- package/src/lineage/CLAUDE.md +31 -0
- package/src/lineage/deployment/adapter-cloud.js +202 -0
- package/src/lineage/deployment/adapter-compose.js +90 -0
- package/src/lineage/deployment/adapter-kit.js +142 -0
- package/src/lineage/deployment/adapter-kubernetes.js +247 -0
- package/src/lineage/deployment/attack-paths.js +443 -0
- package/src/lineage/deployment/boundaries-run.js +223 -0
- package/src/lineage/deployment/boundary-graph.js +567 -0
- package/src/lineage/deployment/cross-repo.js +253 -0
- package/src/lineage/deployment/drift.js +383 -0
- package/src/lineage/deployment/ingest.js +221 -0
- package/src/lineage/deployment/projection.js +244 -0
- package/src/lineage/deployment/trace-correlation.js +541 -0
- package/src/lineage/source-registry.js +19 -0
- package/src/mcp/CLAUDE.md +5 -2
- package/src/mcp/invariant-tools.js +64 -0
- package/src/mcp/portfolio-tools.js +79 -0
- package/src/mcp/redact.js +15 -0
- package/src/mcp/server.js +24 -3
- package/src/mcp/tools.js +13 -1
- package/src/posture/CLAUDE.md +332 -1
- package/src/posture/accuracy-scorecard.js +95 -4
- package/src/posture/assurance/rollback.js +214 -0
- package/src/posture/assurance/rollout.js +200 -0
- package/src/posture/business-logic.js +26 -4
- package/src/posture/evaluation/bakeoff.js +148 -0
- package/src/posture/evaluation/custody.js +200 -0
- package/src/posture/evaluation/deployment-ablation.js +416 -0
- package/src/posture/evaluation/dev-cases.js +65 -0
- package/src/posture/evaluation/economics.js +85 -0
- package/src/posture/evaluation/gates.js +161 -0
- package/src/posture/evaluation/grouping.js +101 -0
- package/src/posture/evaluation/interval.js +132 -0
- package/src/posture/evaluation/invariant-ablation.js +325 -0
- package/src/posture/evaluation/labels.js +200 -0
- package/src/posture/evaluation/protocol.js +308 -0
- package/src/posture/evaluation/release-gate.js +209 -0
- package/src/posture/evaluation/report.js +158 -0
- package/src/posture/evaluation/runner.js +273 -0
- package/src/posture/evaluation/scan-child.js +80 -0
- package/src/posture/evaluation/score.js +174 -0
- package/src/posture/evaluation/synthetic.js +90 -0
- package/src/posture/evaluation/why-missed.js +219 -0
- package/src/posture/fleet.js +11 -2
- package/src/posture/invariants/cli.js +95 -0
- package/src/posture/invariants/coverage.js +164 -0
- package/src/posture/invariants/export.js +178 -0
- package/src/posture/invariants/expressions.js +46 -0
- package/src/posture/invariants/lifecycle.js +289 -0
- package/src/posture/invariants/project-input.js +55 -0
- package/src/posture/invariants/repair.js +340 -0
- package/src/posture/invariants/run.js +45 -0
- package/src/posture/invariants/scenarios.js +311 -0
- package/src/posture/invariants/schema.js +167 -0
- package/src/posture/invariants/shrink.js +407 -0
- package/src/posture/invariants/state-assertions.js +165 -0
- package/src/posture/logic-claims.js +12 -0
- package/src/posture/model-routing.js +40 -0
- package/src/posture/oracles/adapters.js +172 -1
- package/src/posture/oracles/conformance.js +3 -2
- package/src/posture/oracles/oracle.js +23 -3
- package/src/posture/oracles/registry.js +1 -1
- package/src/posture/portfolio/backend.js +279 -0
- package/src/posture/portfolio/bundle.js +314 -0
- package/src/posture/portfolio/cli.js +142 -0
- package/src/posture/portfolio/manifest.js +263 -0
- package/src/posture/portfolio/progress.js +267 -0
- package/src/posture/portfolio/resume.js +130 -0
- package/src/posture/portfolio/retention.js +207 -0
- package/src/posture/portfolio/scheduler.js +488 -0
- package/src/posture/portfolio/signing.js +155 -0
- package/src/posture/portfolio/wording.js +59 -0
- package/src/posture/portfolio/work-units.js +405 -0
- package/src/posture/replay/replay.js +1 -0
- package/src/posture/routing/adapter.js +140 -0
- package/src/posture/routing/calibration.js +278 -0
- package/src/posture/routing/canary.js +141 -0
- package/src/posture/routing/control.js +35 -0
- package/src/posture/routing/decide.js +211 -0
- package/src/posture/routing/drift.js +137 -0
- package/src/posture/routing/economics.js +185 -0
- package/src/posture/routing/feedback.js +207 -0
- package/src/posture/routing/index.js +31 -0
- package/src/posture/routing/outcomes.js +281 -0
- package/src/posture/routing/promotion.js +291 -0
- package/src/posture/routing/receipts.js +59 -0
- package/src/posture/routing/report.js +142 -0
- package/src/posture/routing/shadow.js +53 -0
- package/src/posture/specification-mining.js +26 -0
- package/src/posture/verification/patch-negative.js +16 -4
- package/src/posture/verification/patch-promotion.js +10 -2
- package/src/report/index.js +51 -1
- package/src/sandbox/CLAUDE.md +10 -0
- package/src/sandbox/backend-userspace.js +91 -13
- package/dist/5613.index.js +0 -500
- package/dist/6239.index.js +0 -469
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,30 @@
|
|
|
9
9
|
> make the history less accurate, not more.
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
## 0.163.0 - the rest of the differentiation programme: deployment graph, invariants, capability enforcement, routing, portfolio assurance, evaluation machinery, loop controller and closure
|
|
13
|
+
|
|
14
|
+
This completes the **implementation** of the Agentic Security Differentiation PRD (all 70 requirements are built, each with tests named by criterion id and deliberate-breakage checks). It does **not** close the PRD: the controller's real final verification ends `blocked`, and several gates need data or hosts this repository cannot supply. Read the status section before relying on anything here. Every new execution-capable feature is off by default and gated by the assurance feature flags.
|
|
15
|
+
|
|
16
|
+
**Status, measured by the controller's own final verification (disposable checkout, scripted worker, no model calls, no spend).** All 70 requirements verified on the first pass; the final phase then did not close. The unmet items were the committed bundle being stale against source (rebuilt in this release), the self-scan baseline having drifted (reviewed and rebaselined in this release), a documentation walk-through that raced the controller's exit (made deterministic in this release), the Haskell toolchain step needing `ghc` (not available on the verifying host), and two measured gates that read insufficient-population or unmeasured because **no independently adjudicated real-code population exists**. None of the PRD's real-code accuracy targets (per-language F1 of at least 0.80 and the rest of section 5) has been measured or met; every number produced by this programme is synthetic and labelled so.
|
|
17
|
+
|
|
18
|
+
**Deployment-aware boundaries (X-301 to X-308).** A typed boundary graph built only from local deployment files (Kubernetes, compose, Terraform plan JSON, identity policy), runtime traces with an allowlisted import, cross-repository links bound to exact revisions, deployment-conditioned attack paths, drift between revisions with dependency-aware invalidation, and presentation additive to the existing outputs. New operator command `agentic-security boundaries --from <dir>` (read-only, off by default). On a frozen synthetic paired set the graph removed 3 false positives, added 3 confirmed defects, lost none, and added 1 false positive; only the Kubernetes and compose adapters are claimed as validated.
|
|
19
|
+
|
|
20
|
+
**Executable invariants (X-401 to X-408).** Reviewer-approved tenant and business-state contracts (inferred contracts stay advisory), bounded seed-deterministic stateful scenarios, a durable-effect oracle, shrinking with linked hashes, repair verification against invariants, bounded coverage reporting and a scenario-export tool. Evaluated on synthetic fixtures only.
|
|
21
|
+
|
|
22
|
+
**Capability enforcement (X-501 to X-508).** Task capability manifests enforced at the runner for filesystem, structured commands and outbound network, tool and delegation binding (a child can only receive a subset), operator-signed explicit recovery, hash-chained receipts, and an adversarial corpus. **On macOS the confinement is host-proved, not an advertised enforced backend; Linux is unverified and no process-count cap is claimed on any platform.** A detached grandchild can outlive a task between supervisor sweeps; that known limit is recorded.
|
|
23
|
+
|
|
24
|
+
**Routing (X-601 to X-608).** Outcome records with provenance-backed labels, auditable economics (unknown stays unknown, never zero), calibration that refuses a reliable label below the preregistered minimum, constrained decisions with explanations and bounded fallback, shadow mode and paired replay with the section 5 promotion gate, drift and canary rollback, protected feedback, and a repeatable offline replay (`npm run reproduce:routing`). No cost or quality improvement is claimed.
|
|
25
|
+
|
|
26
|
+
**Portfolio assurance (X-701 to X-708).** A release assurance manifest, offline-verifiable evidence bundles, bounded claims signed with a self-issued local key (never presented as independent certification), durable leased work units with stable ids and dependency-aware resume, a fair bounded scheduler with scoped cancellation, coverage-aware progress views, and retention with legal holds over local and customer-operated shared backends. Consistency is verified for processes sharing one local filesystem only.
|
|
27
|
+
|
|
28
|
+
**Evaluation machinery and engine repairs (QA-001 to QA-008).** A frozen, hash-pinned evaluation protocol that cannot be amended after results exist, custody and leakage controls, layer ablations, grouped-bootstrap intervals, cost accounting, custodian-signed release gates, why-missed diagnostics, and an offline miniature reproduction. Five real engine repairs, with ablations: implicit handler parameters (C# MVC, Spring), Laravel request sources, a static-prefix gate for redirect headers plus Go redirect helpers, Go statement line attribution, and suppression only by a guard that dominates the sink. Measured by the layer-recall bench: taint-attributed entries 122 to 126 of 220 (c# 12 to 13, go 13 to 14, php 13 to 15); corpus raw alerts 326 to 315 with root causes unchanged at 305. The self-scan precision on hand-reviewed targets got slightly worse (hooks 19 to 20, scripts 53 to 54) as the price of the dominance rule.
|
|
29
|
+
|
|
30
|
+
**Loop controller (LOOP-001 to LOOP-004) and closure (REL-001 to REL-003).** The supervised controller now has an independent heartbeat, finite worker stops, controller-issued evidence only, crash recovery, drift freezing, a signed final verification and a resumable report; the assurance profile runs all eleven suites. A closure judge counts a criterion only inside a passing, fresh, controller-issued receipt, and was shown to fail for every kind of unmet criterion and pass only on a synthetic fixture. Release checks bind suite versions and logs to an exact commit; staged rollout and rollback keep earlier evidence.
|
|
31
|
+
|
|
32
|
+
**Documentation.** Twelve guides under `docs/guides` generated from or tested against the code, with runnable local examples, policy cards that keep historical baselines, new synthetic measurements and aspirational targets in separate sections, and a drift check that rejects universal safe, certified or fully-covered claims.
|
|
33
|
+
|
|
34
|
+
**Known issues, not fixed here.** The taint engine still reports a regular expression's `.exec()` on request data as command injection (present since at least 0.161.0). The Linux process-cap assertion remains macOS-only. Several controller limits (subprocess wall time, network limits, the provider envelope) are listed as unenforced in the profile.
|
|
35
|
+
|
|
12
36
|
## 0.162.0 - first slice of the differentiation programme: versioned evidence contracts, an enforced trust boundary, one verification record, trusted oracles, patch-negative verification, and a conformance gate
|
|
13
37
|
|
|
14
38
|
This is the foundation and verification slice of the Agentic Security Differentiation PRD (CORE-001 to 004, CORE-003 trust boundary, LOOP-001, X-201 to X-208). It is **not** the whole programme: the evaluation work (QA-001 to 008, which holds the accuracy gates), the deployment graph, tenant invariants, capability enforcement, model routing and portfolio assurance are unstarted, and no accuracy number is claimed or changed by this release. The new capabilities that execute anything are off by default.
|
|
@@ -45,6 +69,8 @@ This is the foundation and verification slice of the Agentic Security Differenti
|
|
|
45
69
|
|
|
46
70
|
**Tests and CI.** The PR `test` job is sharded four ways behind an aggregator that keeps the required check name `test` and fails unless every shard and the bundle check succeed (the speedup is estimated at 4 to 6 minutes against 13 to 14, and is not yet measured). The `--list-shard` output could lose its last lines when stdout was a pipe under load and turned `main` red; it now exits from the write callback. Load-sensitive tests (the sandbox process cap, the 300 ms witness probe, a lock-reaping loop that could spin past its deadline) are made deterministic without weakening what they prove; the Nix permission-model probe works in a git worktree; and the suite runs in one private temp root that it removes, instead of leaving thousands of directories behind. `scripts/ship.mjs` no longer prints a stale failure after a resumed run, prints the exact resume command and per-phase timings, and defaults the gate's temp directory to a fresh one.
|
|
47
71
|
|
|
72
|
+
**Hosted release gate.** The release workflow's closure leg runs only the static closure on the hosted Linux runner, because the trust boundary is unverified there and the execution suites correctly skip; the execution closure is established by `ship.mjs` on the maintainer's host before a tag is created, and the hosted leg states that it does not claim it. The controller tests no longer depend on the untracked PRD documents (they use committed structural fixtures; the comparison with the real documents is the separate `npm run test:loop-real-prd`).
|
|
73
|
+
|
|
48
74
|
**Not verified here.** On the hosted Linux runner a process cap of 1 did not refuse a command (the new refusing-direction assertion in `test/sandbox.test.js` failed there while passing on macOS, and the cause was not established), so that assertion now runs on macOS only; Linux process-cap enforcement is not asserted by any test. The sharded CI job and the aarch64 NixOS changes have not yet run as real CI; the unseen-set misses above are not fixed; the live nixpkgs feed has only been exercised against a fake feed plus a few real requests.
|
|
49
75
|
|
|
50
76
|
## 0.160.0 - a faster, sturdier release path: a parallel hosted gate, a one-command release orchestrator, and fixes for the failing workflow runs
|
package/bin/agentic-security.js
CHANGED
|
@@ -175,6 +175,12 @@ Commands:
|
|
|
175
175
|
scan-baseline --current <f> --previous <f>
|
|
176
176
|
Finding-level diff between two scan JSON outputs.
|
|
177
177
|
Reports added / removed / changed findings.
|
|
178
|
+
boundaries --from <dir> [--findings <last-scan.json>] [--environment <name>] [--out <file>] [--json]
|
|
179
|
+
Build a deployment boundary graph from local configuration
|
|
180
|
+
(and optional sanitized traces) and attach a boundary context
|
|
181
|
+
to each finding of a scan result. Read-only, local files only.
|
|
182
|
+
Off by default: set AGENTIC_SECURITY_ASSURANCE_DEPLOYMENT_BOUNDARIES=1.
|
|
183
|
+
Exit: 0 ok, 1 failed, 2 usage, 3 feature off or blocked.
|
|
178
184
|
explore [path] [--port <n>] [--keep-open]
|
|
179
185
|
Start a local, read-only server over an
|
|
180
186
|
already-scanned lineage graph (run
|
|
@@ -216,6 +222,30 @@ Commands:
|
|
|
216
222
|
federate list [path] [--output <file>]
|
|
217
223
|
List every declared cross-repo link, reporting
|
|
218
224
|
whether each side still resolves.
|
|
225
|
+
invariants export --invariant <file> --fixture <dir> [--ledger <file>] [--commit <sha>] [--seed <n>] [--output <file>]
|
|
226
|
+
Reproducible bounded business-logic scenario package for
|
|
227
|
+
one contract (no fixture source, no secrets, not a proof
|
|
228
|
+
of correctness). Needs the invariant-scenarios feature.
|
|
229
|
+
invariants coverage --invariant <file> | --invariants-dir <dir> [--ledger <file>] [--results <file>] [--json]
|
|
230
|
+
Bounded business coverage: approved vs proposed contracts,
|
|
231
|
+
exercised actors/states/transitions, explicit gaps.
|
|
232
|
+
portfolio progress --store <file> [--budgets <file>] [--findings <file>] [--blocking-severity <s>] [--json]
|
|
233
|
+
Coverage-aware portfolio progress: verified units, blocked/failed/stale
|
|
234
|
+
units, repository coverage, remaining budget, pending human review and
|
|
235
|
+
stale workers. A finished controller is never reported as passed.
|
|
236
|
+
Needs the portfolio-assurance feature.
|
|
237
|
+
portfolio retention plan|apply|verify-log --records <file> --root <dir> [--policy <file>] [--holds <file>] [--store <file>] [--log <file> --actor <name>]
|
|
238
|
+
Retention by class (replay evidence, metadata, model traces, secrets)
|
|
239
|
+
with legal holds; a required current receipt is never deleted and
|
|
240
|
+
every deletion is logged first.
|
|
241
|
+
portfolio backend probe --mode local|shared --dir <dir>
|
|
242
|
+
Is a storage backend usable? An unavailable shared backend is the
|
|
243
|
+
typed blocked state; nothing falls back to a local write.
|
|
244
|
+
portfolio export --store <file> --out <file> | portfolio import --from <file> --mode <m> --dir <d>
|
|
245
|
+
One self-checking, secret-free state file for an air-gapped machine.
|
|
246
|
+
invariants regress <artifact.json>
|
|
247
|
+
Re-execute a verified-repair regression artifact from the
|
|
248
|
+
file alone. Exit 0 passed, 1 failed, 3 not run.
|
|
219
249
|
remediation open [path] --assessment <impact-report.json> --owner <id> --due <YYYY-MM-DD>
|
|
220
250
|
--control <text> --required-evidence <flowId,...>
|
|
221
251
|
[--id <itemId>] [--snapshot <commit>] [--allow-manual-attestation]
|
|
@@ -3898,6 +3928,48 @@ Do not suppress anything you are not certain is a false positive. When in doubt,
|
|
|
3898
3928
|
return 0;
|
|
3899
3929
|
}
|
|
3900
3930
|
|
|
3931
|
+
// `agentic-security boundaries --from <dir> [--findings <last-scan.json>] ...` (differentiation PRD, X-308 wiring).
|
|
3932
|
+
// Builds a deployment boundary graph from LOCAL configuration (and optional sanitized traces) and attaches a boundary context to
|
|
3933
|
+
// each finding of an existing scan result. Read-only and local: no network, no scan, no execution of configuration; the only
|
|
3934
|
+
// write is the report file named by --out. Behind the `deployment-boundaries` feature, which is OFF by default.
|
|
3935
|
+
// Exit codes: 0 report produced; 1 failed (invalid or unreadable input, ingest refused, --out refused); 2 usage error;
|
|
3936
|
+
// 3 the feature is disabled, blocked or unsupported on this platform (nothing was read).
|
|
3937
|
+
async function cmdBoundaries(args) {
|
|
3938
|
+
const f = args.flags;
|
|
3939
|
+
const usage = 'Usage: agentic-security boundaries --from <dir> [--findings <last-scan.json>] [--environment <name>] [--repository <name>] [--revision <sha>] [--root <project>] [--out <file>] [--json] [--now <iso>]';
|
|
3940
|
+
if (typeof f.from !== 'string' || !f.from) { console.error(usage); return 2; }
|
|
3941
|
+
for (const k of ['findings', 'environment', 'repository', 'revision', 'out', 'now', 'root']) {
|
|
3942
|
+
if (f[k] !== undefined && (typeof f[k] !== 'string' || !f[k])) { console.error(`agentic-security boundaries: --${k} needs a value\n${usage}`); return 2; }
|
|
3943
|
+
}
|
|
3944
|
+
const scanRoot = path.resolve(f.root || '.');
|
|
3945
|
+
const { resolveAssuranceConfig } = await import('../src/posture/assurance/config.js');
|
|
3946
|
+
const { runBoundaries, renderBoundariesText } = await import('../src/lineage/deployment/boundaries-run.js');
|
|
3947
|
+
const config = resolveAssuranceConfig({ scanRoot });
|
|
3948
|
+
const result = runBoundaries({
|
|
3949
|
+
config, from: path.resolve(f.from), environment: f.environment || 'prod', repository: f.repository || null, revision: f.revision || null,
|
|
3950
|
+
findingsFile: f.findings ? path.resolve(f.findings) : null, verifySignature: _verifyLastScan, now: f.now,
|
|
3951
|
+
});
|
|
3952
|
+
if (result.status === 'disabled' || result.status === 'blocked' || result.status === 'unsupported') {
|
|
3953
|
+
console.error(`agentic-security boundaries: not run (${result.status}): ${result.reason}`);
|
|
3954
|
+
if (result.status === 'disabled') console.error('The deployment-boundaries feature is off by default. Enable it for one run with AGENTIC_SECURITY_ASSURANCE_DEPLOYMENT_BOUNDARIES=1.');
|
|
3955
|
+
return 3;
|
|
3956
|
+
}
|
|
3957
|
+
if (result.status !== 'ok') { console.error(`agentic-security boundaries: ${result.reason}`); return 1; }
|
|
3958
|
+
const report = result.report;
|
|
3959
|
+
const body = f.json ? `${JSON.stringify(report, null, 2)}\n` : renderBoundariesText(report);
|
|
3960
|
+
if (f.out) {
|
|
3961
|
+
const outPath = path.resolve(f.out);
|
|
3962
|
+
try {
|
|
3963
|
+
let st = null;
|
|
3964
|
+
try { st = fs.lstatSync(outPath); } catch { /* absent */ }
|
|
3965
|
+
if (st && !st.isFile()) throw new Error('the output path is a symbolic link or not a regular file');
|
|
3966
|
+
fs.writeFileSync(outPath, body, { mode: 0o644 });
|
|
3967
|
+
} catch (e) { console.error(`agentic-security boundaries: cannot write ${outPath}: ${e.message}`); return 1; }
|
|
3968
|
+
console.log(`agentic-security boundaries: wrote ${outPath}`);
|
|
3969
|
+
} else writeStdout(body);
|
|
3970
|
+
return 0;
|
|
3971
|
+
}
|
|
3972
|
+
|
|
3901
3973
|
// `agentic-security explore [path] [--port <n>] [--keep-open]` — Milestone 3,
|
|
3902
3974
|
// sub-project Server, increment 1. Starts a local, read-only, loopback-only
|
|
3903
3975
|
// HTTP server over an already-built, signed lineage graph
|
|
@@ -7073,6 +7145,7 @@ async function main() {
|
|
|
7073
7145
|
startLspServer();
|
|
7074
7146
|
return;
|
|
7075
7147
|
}
|
|
7148
|
+
case 'boundaries': process.exit(await cmdBoundaries(args));
|
|
7076
7149
|
case 'explore': process.exit(await cmdExplore(args));
|
|
7077
7150
|
case 'dataflow': {
|
|
7078
7151
|
const sub = args._[1];
|
|
@@ -7150,6 +7223,20 @@ async function main() {
|
|
|
7150
7223
|
}
|
|
7151
7224
|
break;
|
|
7152
7225
|
}
|
|
7226
|
+
case 'portfolio': {
|
|
7227
|
+
// X-707, X-708: coverage-aware portfolio progress, evidence retention and offline operation. The logic is in
|
|
7228
|
+
// src/posture/portfolio/cli.js so tests run it without spawning this file. Off unless `portfolio-assurance` is on.
|
|
7229
|
+
const { runPortfolioCommand } = await import('../src/posture/portfolio/cli.js');
|
|
7230
|
+
process.exit(await runPortfolioCommand(args));
|
|
7231
|
+
break;
|
|
7232
|
+
}
|
|
7233
|
+
case 'invariants': {
|
|
7234
|
+
// X-405 to X-407: scenario export, bounded coverage and regression-artifact replay. The logic is in
|
|
7235
|
+
// src/posture/invariants/cli.js so tests run it without spawning this file.
|
|
7236
|
+
const { runInvariantsCommand } = await import('../src/posture/invariants/cli.js');
|
|
7237
|
+
process.exit(await runInvariantsCommand(args));
|
|
7238
|
+
break;
|
|
7239
|
+
}
|
|
7153
7240
|
case 'federate': {
|
|
7154
7241
|
// NOT a `dataflow` subcommand — this writes operator-declared
|
|
7155
7242
|
// config (cross-repo-links.json), never the scanned graph. Same
|