@slicedearth/whoisleuth-cli 1.47.4 → 2.0.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/README.md +74 -177
- package/SECURITY.md +6 -3
- package/bin/whoisleuth.mjs +2 -1
- package/cli/archive-inspect.mjs +28 -10
- package/cli/arguments.mjs +204 -174
- package/cli/artifact-structure.mjs +837 -163
- package/cli/artifact-verify.mjs +90 -61
- package/cli/bounded-json.mjs +1 -1
- package/cli/bulk-checkpoint.mjs +33 -20
- package/cli/bulk.mjs +9 -2
- package/cli/case-pack.mjs +180 -576
- package/cli/ci-report.mjs +6 -1
- package/cli/collection-preflight.mjs +2 -2
- package/cli/command-catalogue.mjs +12 -3
- package/cli/command-reference.mjs +910 -92
- package/cli/completion.mjs +504 -226
- package/cli/config-profile.mjs +13 -3
- package/cli/discover.mjs +7 -1
- package/cli/discovery-observation-snapshot.mjs +24 -28
- package/cli/discovery-scan-command-runner.mjs +9 -9
- package/cli/discovery-scan.mjs +17 -3
- package/cli/discovery-snapshot.mjs +15 -7
- package/cli/domain-control-monitor.mjs +203 -30
- package/cli/domain-control-observations.mjs +15 -21
- package/cli/errors.mjs +8 -3
- package/cli/evidence-signing.mjs +10 -20
- package/cli/external-observation-mapping.mjs +3 -3
- package/cli/formatters/json.mjs +20 -32
- package/cli/formatters/terminal.mjs +583 -22
- package/cli/input.mjs +7 -2
- package/cli/interactive-launcher.mjs +226 -0
- package/cli/interchange-report.mjs +19 -19
- package/cli/investigation-manifest.mjs +1 -1
- package/cli/investigation-plan.mjs +167 -16
- package/cli/investigation-run.mjs +9 -1
- package/cli/lookalike-calibration.mjs +3 -1
- package/cli/lookup-brief.mjs +13 -8
- package/cli/lookup-browser.mjs +844 -0
- package/cli/lookup-command-runner.mjs +94 -31
- package/cli/lookup-diff.mjs +2 -2
- package/cli/lookup-plan.mjs +1 -0
- package/cli/mail-review.mjs +206 -94
- package/cli/manual.mjs +5 -5
- package/cli/offline-evidence-review.mjs +18 -7
- package/cli/open-asset-model-bridge.mjs +1 -1
- package/cli/output-file.mjs +70 -14
- package/cli/page-compare.mjs +11 -6
- package/cli/progress-events.mjs +2 -1
- package/cli/progress.mjs +3 -3
- package/cli/registry-cohort.mjs +9 -51
- package/cli/registry-doctor.mjs +67 -28
- package/cli/retained-artifact-diff.mjs +7 -8
- package/cli/risk-calibration.mjs +85 -38
- package/cli/runner.mjs +189 -75
- package/cli/saved-lookup.mjs +424 -57
- package/cli/sharing-review.mjs +6 -1
- package/cli/source-reliability.mjs +75 -36
- package/cli/terminal-presentation.mjs +43 -18
- package/docs/cli-reference.md +125 -1708
- package/docs/cli.md +86 -254
- package/frontend/src/lib/analysis/domain-control-manifest-core.js +3 -145
- package/frontend/src/lib/analysis/domain-control-records.js +3 -88
- package/lib/availability.mjs +58 -40
- package/lib/bounded-contract-normalizers.mjs +2 -4
- package/lib/bounded-file.mjs +78 -4
- package/lib/bounded-json.mjs +51 -13
- package/lib/browser-library-profile.mjs +1 -1
- package/lib/classify.mjs +56 -5
- package/lib/client-behavior-profile.mjs +1 -1
- package/lib/credential-surface-profile.mjs +1 -1
- package/lib/cryptographic-assurance.mjs +35 -17
- package/lib/ct-query.mjs +3 -3
- package/lib/ct-search.mjs +37 -21
- package/lib/distributed-operation-budget.mjs +4 -2
- package/lib/dns-delegation-health.mjs +9 -6
- package/lib/dns-intelligence.mjs +1 -1
- package/lib/dnssec-chain-validation.mjs +2 -3
- package/lib/dnssec-evidence-validation.mjs +13 -7
- package/lib/domain-assurance.mjs +12 -12
- package/lib/domain-change-packet.mjs +1 -1
- package/lib/domain-control-flight-recorder.mjs +442 -78
- package/lib/domain-control-manifest.mjs +314 -59
- package/lib/domain-posture-analysis.mjs +5 -2
- package/lib/encrypted-dns-contract.mjs +2 -3
- package/lib/evidence-export.mjs +518 -36
- package/lib/external-intelligence-risk.mjs +26 -10
- package/lib/feature-policy.mjs +1 -1
- package/lib/homepage-metadata-contract.mjs +290 -0
- package/lib/hostname.mjs +1 -1
- package/lib/html-signals.mjs +89 -5
- package/lib/http-intelligence.mjs +331 -2
- package/lib/interchange-fidelity-registry.mjs +28 -26
- package/lib/lookup-cache.mjs +6 -4
- package/lib/lookup.mjs +25 -2
- package/lib/observed-network-context.mjs +1 -1
- package/lib/page-fingerprints.mjs +2 -2
- package/lib/page-role-profile.mjs +1 -1
- package/lib/portable-generator.mjs +8 -0
- package/lib/provider-policy-admission.mjs +3 -1
- package/lib/rdap-bootstrap.mjs +76 -16
- package/lib/rdap-client.mjs +20 -12
- package/lib/rdap-normalization.mjs +306 -75
- package/lib/rdap-transport.mjs +2 -2
- package/lib/rdap-validation.mjs +65 -14
- package/lib/rdap.mjs +2 -2
- package/lib/registrable-domain.mjs +36 -0
- package/lib/registry-insights.mjs +7 -0
- package/lib/response-policy.mjs +27 -4
- package/lib/risk-calibration-summary.mjs +35 -33
- package/lib/risk-scoring.mjs +4 -3
- package/lib/safe-fetch.mjs +62 -40
- package/lib/security-txt.mjs +1 -1
- package/lib/smtp-transport-review.mjs +8 -5
- package/lib/sslbl-intelligence.mjs +6 -8
- package/lib/static-html-analysis.mjs +301 -4
- package/lib/structured-data-identity.mjs +51 -19
- package/lib/threat-intelligence-fixtures.mjs +2 -4
- package/lib/threat-intelligence-manifests.mjs +2 -7
- package/lib/threat-intelligence-runtime.mjs +3 -5
- package/lib/threat-intelligence-types.mjs +3 -0
- package/lib/threatfox-intelligence.mjs +7 -3
- package/lib/tls-intelligence.mjs +4 -4
- package/lib/urlhaus-intelligence.mjs +4 -2
- package/lib/urlscan-intelligence.mjs +6 -5
- package/lib/website-security-posture.mjs +1 -1
- package/lib/website-technology.mjs +1 -1
- package/lib/whois-authority.mjs +43 -8
- package/lib/whois-chain.mjs +25 -3
- package/lib/whois-normalization.mjs +3 -1
- package/lib/whois-transport.mjs +12 -3
- package/lib/zone-intent-review.mjs +1 -1
- package/package.json +12 -4
- package/{frontend/src/lib/analysis/case-brand-profile-references.js → packages/cases/case-brand-profile-references.mjs} +2 -2
- package/{frontend/src/lib/analysis/case-evidence-model.js → packages/cases/case-evidence-model.mjs} +35 -14
- package/{frontend/src/lib/analysis/case-investigation-branch-model.js → packages/cases/case-investigation-branch-model.mjs} +10 -12
- package/packages/cases/case-migration-model.mjs +476 -0
- package/{frontend/src/lib/analysis/case-model.js → packages/cases/case-model.mjs} +3 -3
- package/{frontend/src/lib/analysis/case-record-contracts.js → packages/cases/case-record-contracts.mjs} +3 -21
- package/{frontend/src/lib/analysis/case-record-core.js → packages/cases/case-record-core.mjs} +58 -31
- package/packages/cases/case-record-model.mjs +9 -0
- package/{frontend/src/lib/analysis/case-record-operations.js → packages/cases/case-record-operations.mjs} +72 -29
- package/{frontend/src/lib/analysis/case-report.js → packages/cases/case-report.mjs} +108 -14
- package/packages/cases/case-response-model.mjs +1604 -0
- package/packages/cases/case-response-packet.mjs +1312 -0
- package/{frontend/src/lib/analysis/case-storage-model.js → packages/cases/case-storage-model.mjs} +2 -2
- package/{frontend/src/lib/analysis/http-summary.js → packages/cases/http-summary.mjs} +1 -1
- package/{frontend/src/lib/analysis/comparison-ledger-bulk.js → packages/comparison/comparison-ledger-bulk.mjs} +2 -2
- package/{frontend/src/lib/analysis/comparison-ledger-contract.js → packages/comparison/comparison-ledger-contract.mjs} +4 -4
- package/{frontend/src/lib/analysis/comparison-ledger-json.js → packages/comparison/comparison-ledger-json.mjs} +1 -0
- package/{frontend/src/lib/analysis/comparison-ledger-serialization.js → packages/comparison/comparison-ledger-serialization.mjs} +1 -0
- package/packages/comparison/favicon-similarity.mjs +78 -0
- package/{frontend/src/lib/analysis/page-similarity.js → packages/comparison/page-similarity.mjs} +4 -3
- package/{frontend/src/lib/analysis/relationship-evidence.js → packages/comparison/relationship-evidence.mjs} +6 -7
- package/packages/contracts/analyst-review-state-contract.mjs +61 -0
- package/packages/contracts/analyst-review-state.mjs +50 -0
- package/packages/contracts/case-portability.mjs +1310 -0
- package/packages/contracts/cli-command-catalogue.mjs +2 -0
- package/packages/contracts/cli-lookup.mjs +394 -0
- package/packages/contracts/domain-control-flight-recorder.mjs +461 -0
- package/packages/contracts/domain-control-manifest.mjs +1027 -0
- package/packages/contracts/domain-control-monitor.mjs +310 -0
- package/packages/contracts/domain-control-review.mjs +828 -0
- package/packages/contracts/domain-name.mjs +4 -0
- package/packages/contracts/external-observation-interchange.mjs +224 -0
- package/packages/contracts/extracted-domain-lifecycle.mjs +218 -0
- package/packages/contracts/investigation-portability.mjs +331 -0
- package/packages/contracts/offline-comparison.mjs +160 -0
- package/packages/contracts/risk-calibration.mjs +1288 -0
- package/packages/contracts/schema-compatibility.mjs +71 -0
- package/packages/contracts/schema-lifecycle.mjs +1702 -0
- package/packages/contracts/sslbl-snapshot.mjs +17 -0
- package/packages/contracts/workspace-portability.mjs +1347 -0
- package/{frontend/src/lib/analysis/artifact-integrity.js → packages/evidence/artifact-integrity.mjs} +13 -11
- package/packages/evidence/decision-fact.mjs +735 -0
- package/packages/evidence/domain-control-runtime.mjs +547 -0
- package/packages/evidence/domain-name.mjs +41 -0
- package/packages/evidence/observation.mjs +384 -0
- package/{frontend/src/lib/analysis/external-findings-import.js → packages/interchange/external-findings-import.mjs} +24 -22
- package/packages/interchange/retained-text.mjs +8 -0
- package/{frontend/src/lib/analysis/acquisition-decision-packet.js → packages/investigation/acquisition-decision-packet.mjs} +9 -6
- package/{frontend/src/lib/analysis/bulk-domain-comparison.js → packages/investigation/bulk-domain-comparison.mjs} +5 -6
- package/{frontend/src/lib/analysis/bulk-mail-exposure.js → packages/investigation/bulk-mail-exposure.mjs} +4 -6
- package/{frontend/src/lib/analysis/bulk-review-export.js → packages/investigation/bulk-review-export.mjs} +5 -5
- package/packages/investigation/bulk-review-policy.mjs +1 -0
- package/{frontend/src/lib/analysis/investigation-capsule.js → packages/investigation/investigation-capsule.mjs} +30 -32
- package/packages/investigation/lookup-artefact-inputs.mjs +1 -0
- package/{frontend/src/lib/analysis/lookup-asset-graph.js → packages/investigation/lookup-asset-graph.mjs} +4 -2
- package/{frontend/src/lib/analysis/lookup-claim-passport.js → packages/investigation/lookup-claim-passport.mjs} +6 -10
- package/{frontend/src/lib/analysis/lookup-claim-readiness.js → packages/investigation/lookup-claim-readiness.mjs} +9 -2
- package/packages/investigation/lookup-investigation-brief.mjs +172 -0
- package/packages/monitoring/analyst-review-state.mjs +680 -0
- package/{frontend/src/lib/analysis/brand-profile-model.js → packages/workspace/brand-profile-model.mjs} +70 -47
- package/{frontend/src/lib/analysis/bulk-review-model.js → packages/workspace/bulk-review-model.mjs} +13 -14
- package/{frontend/src/lib/analysis/bulk-session-model.js → packages/workspace/bulk-session-model.mjs} +33 -59
- package/{frontend/src/lib/analysis/bulk-sort.js → packages/workspace/bulk-sort.mjs} +8 -5
- package/{frontend/src/lib/analysis/campaign-model.js → packages/workspace/campaign-model.mjs} +20 -22
- package/{frontend/src/lib/analysis/detection-rule-model.js → packages/workspace/detection-rule-model.mjs} +15 -17
- package/packages/workspace/hostile-input.mjs +172 -0
- package/{frontend/src/lib/analysis/investigation-guide.js → packages/workspace/investigation-guide.mjs} +8 -45
- package/{frontend/src/lib/analysis/investigation-template-model.js → packages/workspace/investigation-template-model.mjs} +18 -21
- package/{frontend/src/lib/analysis/page-baseline.js → packages/workspace/page-baseline.mjs} +6 -13
- package/{frontend/src/lib/analysis/relationship-observation-model.js → packages/workspace/relationship-observation-model.mjs} +13 -17
- package/{frontend/src/lib/analysis/shortlist-model.js → packages/workspace/shortlist-model.mjs} +20 -18
- package/{frontend/src/lib/analysis/watchlist-history.js → packages/workspace/watchlist-history.mjs} +9 -16
- package/{frontend/src/lib/analysis/watchlist-store.js → packages/workspace/watchlist-store.mjs} +24 -17
- package/{frontend/src/lib/analysis/website-snapshot-model.js → packages/workspace/website-snapshot-model.mjs} +13 -13
- package/{frontend/src/lib/analysis/workspace-archive-crypto.js → packages/workspace/workspace-archive-crypto.mjs} +49 -19
- package/{frontend/src/lib/analysis/workspace-archive.js → packages/workspace/workspace-archive.mjs} +110 -89
- package/third-party-notices.txt +14 -14
- package/frontend/src/lib/analysis/bulk-retry-plan.js +0 -79
- package/frontend/src/lib/analysis/bulk-source-coverage.js +0 -76
- package/frontend/src/lib/analysis/case-migration-model.js +0 -305
- package/frontend/src/lib/analysis/case-record-model.js +0 -9
- package/frontend/src/lib/analysis/case-response-model.js +0 -728
- package/frontend/src/lib/analysis/case-response-packet.js +0 -583
- package/frontend/src/lib/analysis/lookup-decision-support.js +0 -542
- package/frontend/src/lib/analysis/lookup-investigation-brief.js +0 -153
- package/frontend/src/lib/analysis/lookup-presentation.js +0 -120
- package/frontend/src/lib/analysis/lookup-response.js +0 -2
- package/frontend/src/lib/analysis/lookup-source-refresh.js +0 -277
- package/frontend/src/lib/analysis/lookup-summary-model.js +0 -398
- package/frontend/src/lib/analysis/scoring.js +0 -55
- package/frontend/src/lib/analysis/utils.js +0 -255
- package/frontend/src/lib/analysis/visualization-bounds.js +0 -26
- package/frontend/src/lib/analysis/visualization-force-graph.js +0 -352
- package/frontend/src/lib/analysis/visualization-matrix.js +0 -131
- package/frontend/src/lib/analysis/visualization-models.js +0 -338
- package/frontend/src/lib/analysis/visualization-time-series.js +0 -185
- package/lib/bounded-json-response.mjs +0 -170
- package/lib/lookup-response-contract.mjs +0 -1034
- package/lib/observation.mjs +0 -115
- /package/{frontend/src/lib/analysis/opaque-reference-id.js → packages/cases/opaque-reference-id.mjs} +0 -0
- /package/{frontend/src/lib/analysis/acquisition-due-diligence.js → packages/investigation/acquisition-due-diligence.mjs} +0 -0
- /package/{frontend/src/lib/analysis/evidence-coverage-ledger.js → packages/investigation/evidence-coverage-ledger.mjs} +0 -0
- /package/{frontend/src/lib/analysis/dns-record-normalization.js → packages/workspace/dns-record-normalization.mjs} +0 -0
package/cli/arguments.mjs
CHANGED
|
@@ -1,71 +1,22 @@
|
|
|
1
1
|
import { parseInspectArchiveArguments, parseSignArtifactArguments, parseVerifySignatureArguments, } from "./evidence-command-arguments.mjs";
|
|
2
|
-
import { CliUsageError } from "./errors.mjs";
|
|
3
|
-
import { INVESTIGATION_PLAN_RECIPES, } from "./investigation-plan.mjs";
|
|
2
|
+
import { CliUsageError, hasUnsafeCliText } from "./errors.mjs";
|
|
3
|
+
import { INVESTIGATION_PLAN_RECIPES, RUNNABLE_INVESTIGATION_PLAN_RECIPES, } from "./investigation-plan.mjs";
|
|
4
4
|
import { parseCliFailPolicies } from "./fail-policy.mjs";
|
|
5
|
+
import { isDirectLookupTarget } from "../lib/classify.mjs";
|
|
6
|
+
import { CLI_COMMANDS, cliMetaActionForInvocation, isCliCommand, } from "./command-reference.mjs";
|
|
5
7
|
const MAX_CLI_ARGUMENTS = 32;
|
|
6
8
|
const MAX_CLI_ARGUMENT_LENGTH = 1024;
|
|
7
|
-
const CLI_COMMANDS = [
|
|
8
|
-
'completion',
|
|
9
|
-
'doctor',
|
|
10
|
-
'commands',
|
|
11
|
-
'manual',
|
|
12
|
-
'manifest',
|
|
13
|
-
'map-observations',
|
|
14
|
-
'oam-export',
|
|
15
|
-
'lookup',
|
|
16
|
-
'bulk',
|
|
17
|
-
'ct-search',
|
|
18
|
-
'ct-intake',
|
|
19
|
-
'discover',
|
|
20
|
-
'discover-scan',
|
|
21
|
-
'posture',
|
|
22
|
-
'http',
|
|
23
|
-
'tls',
|
|
24
|
-
'dnssec-validate',
|
|
25
|
-
'mail-transport',
|
|
26
|
-
'registry-support',
|
|
27
|
-
'registry-doctor',
|
|
28
|
-
'registry-cohort',
|
|
29
|
-
'registry-scaffold',
|
|
30
|
-
'risk-calibrate',
|
|
31
|
-
'lookalike-calibrate',
|
|
32
|
-
'verify-artifact',
|
|
33
|
-
'interchange-report',
|
|
34
|
-
'inspect-archive',
|
|
35
|
-
'sign-artifact',
|
|
36
|
-
'verify-signature',
|
|
37
|
-
'source-report',
|
|
38
|
-
'compare',
|
|
39
|
-
'page-compare',
|
|
40
|
-
'mail-review',
|
|
41
|
-
'review-evidence',
|
|
42
|
-
'brief',
|
|
43
|
-
'case-pack',
|
|
44
|
-
'domain-control',
|
|
45
|
-
'monitor-once',
|
|
46
|
-
'assurance',
|
|
47
|
-
'change-packet',
|
|
48
|
-
'sharing-review',
|
|
49
|
-
'workflow-plan',
|
|
50
|
-
'workflow-run',
|
|
51
|
-
'diff',
|
|
52
|
-
'reconcile',
|
|
53
|
-
'timeline',
|
|
54
|
-
'export',
|
|
55
|
-
];
|
|
56
9
|
function boundedArgument(value) {
|
|
57
|
-
if (typeof value !== 'string' || value.length > MAX_CLI_ARGUMENT_LENGTH ||
|
|
10
|
+
if (typeof value !== 'string' || value.length > MAX_CLI_ARGUMENT_LENGTH || hasUnsafeCliText(value)) {
|
|
58
11
|
throw new CliUsageError('Arguments must be bounded text without control characters.');
|
|
59
12
|
}
|
|
60
13
|
return value;
|
|
61
14
|
}
|
|
62
|
-
function isCliCommand(value) {
|
|
63
|
-
return CLI_COMMANDS.includes(value);
|
|
64
|
-
}
|
|
65
15
|
function extractFileOutputArguments(argv) {
|
|
66
16
|
const retained = [];
|
|
67
17
|
let destination = null;
|
|
68
18
|
let force = false;
|
|
19
|
+
let palette = null;
|
|
69
20
|
for (let index = 0; index < argv.length; index++) {
|
|
70
21
|
const argument = argv[index];
|
|
71
22
|
if (argument === undefined)
|
|
@@ -83,19 +34,32 @@ function extractFileOutputArguments(argv) {
|
|
|
83
34
|
throw new CliUsageError('--force may be supplied only once.');
|
|
84
35
|
force = true;
|
|
85
36
|
}
|
|
37
|
+
else if (index > 0 && argument === '--palette') {
|
|
38
|
+
if (palette !== null)
|
|
39
|
+
throw new CliUsageError('--palette may be supplied only once.');
|
|
40
|
+
const value = argv[++index];
|
|
41
|
+
if (value !== 'auto' && value !== 'light' && value !== 'dark') {
|
|
42
|
+
throw new CliUsageError('--palette requires auto, light, or dark.');
|
|
43
|
+
}
|
|
44
|
+
palette = value;
|
|
45
|
+
}
|
|
86
46
|
else {
|
|
87
47
|
retained.push(argument);
|
|
88
48
|
}
|
|
89
49
|
}
|
|
90
50
|
if (force && destination === null)
|
|
91
51
|
throw new CliUsageError('--force requires --output.');
|
|
92
|
-
return { argv: retained, destination, force };
|
|
52
|
+
return { argv: retained, destination, force, palette };
|
|
93
53
|
}
|
|
94
54
|
function parseCliArguments(rawArgv) {
|
|
95
55
|
if (!Array.isArray(rawArgv) || rawArgv.length > MAX_CLI_ARGUMENTS) {
|
|
96
56
|
throw new CliUsageError(`At most ${MAX_CLI_ARGUMENTS} command arguments are supported.`);
|
|
97
57
|
}
|
|
98
|
-
const
|
|
58
|
+
const boundedArguments = rawArgv.map(boundedArgument);
|
|
59
|
+
const metaAction = cliMetaActionForInvocation(boundedArguments);
|
|
60
|
+
if (metaAction)
|
|
61
|
+
return parseCliArgumentsCore(boundedArguments);
|
|
62
|
+
const extracted = extractFileOutputArguments(boundedArguments);
|
|
99
63
|
const parsed = parseCliArgumentsCore(extracted.argv);
|
|
100
64
|
if ('quiet' in parsed && parsed.quiet && extracted.destination !== null) {
|
|
101
65
|
throw new CliUsageError('--quiet cannot be combined with --output.');
|
|
@@ -103,124 +67,53 @@ function parseCliArguments(rawArgv) {
|
|
|
103
67
|
if ('events' in parsed && parsed.events && extracted.destination !== null) {
|
|
104
68
|
throw new CliUsageError('--events cannot be combined with --output because completion must describe the final output delivery.');
|
|
105
69
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
70
|
+
if ('browse' in parsed && parsed.browse === true && extracted.destination !== null) {
|
|
71
|
+
throw new CliUsageError('--browse cannot be combined with --output because it requires an interactive terminal.');
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
...parsed,
|
|
75
|
+
...(extracted.destination !== null ? { destination: extracted.destination } : {}),
|
|
76
|
+
...(extracted.force ? { force: true } : {}),
|
|
77
|
+
...(extracted.palette ? { palette: extracted.palette } : {}),
|
|
78
|
+
};
|
|
109
79
|
}
|
|
110
80
|
function parseCliArgumentsCore(argv) {
|
|
111
81
|
if (!argv.length)
|
|
112
82
|
return { action: 'help' };
|
|
113
83
|
const firstArgument = argv[0] ?? '';
|
|
114
|
-
const
|
|
115
|
-
if (
|
|
84
|
+
const metaAction = cliMetaActionForInvocation(argv);
|
|
85
|
+
if (metaAction?.id === 'help') {
|
|
116
86
|
if (argv.length === 1)
|
|
117
87
|
return { action: 'help' };
|
|
118
|
-
if (argv.length === 2 && isCliCommand(firstArgument))
|
|
119
|
-
return { action: 'help', command: firstArgument };
|
|
88
|
+
if (argv.length === 2 && (isCliCommand(firstArgument) || isDirectLookupTarget(firstArgument))) {
|
|
89
|
+
return { action: 'help', command: isCliCommand(firstArgument) ? firstArgument : 'lookup' };
|
|
90
|
+
}
|
|
120
91
|
throw new CliUsageError('Help accepts only an optional command name.');
|
|
121
92
|
}
|
|
122
|
-
if (
|
|
93
|
+
if (metaAction?.id === 'version') {
|
|
123
94
|
if (argv.length !== 1)
|
|
124
95
|
throw new CliUsageError('--version does not accept other arguments.');
|
|
125
96
|
return { action: 'version' };
|
|
126
97
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
98
|
+
let command;
|
|
99
|
+
let directLookup = false;
|
|
100
|
+
if (isCliCommand(firstArgument))
|
|
101
|
+
command = firstArgument;
|
|
102
|
+
else if (isDirectLookupTarget(firstArgument)) {
|
|
103
|
+
command = 'lookup';
|
|
104
|
+
directLookup = true;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const displayedCommand = firstArgument.length > 80 ? `${firstArgument.slice(0, 79)}…` : firstArgument;
|
|
130
108
|
throw new CliUsageError(`Unknown command "${displayedCommand}". Run "whoisleuth commands" to list supported commands.`);
|
|
131
109
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return parseCommandsArguments(argv.slice(1));
|
|
140
|
-
if (command === 'manual')
|
|
141
|
-
return parseManualArguments(argv.slice(1));
|
|
142
|
-
if (command === 'manifest')
|
|
143
|
-
return parseManifestArguments(argv.slice(1));
|
|
144
|
-
if (command === 'map-observations')
|
|
145
|
-
return parseOfflineImportArguments('map-observations', argv.slice(1));
|
|
146
|
-
if (command === 'oam-export')
|
|
147
|
-
return parseOfflineImportArguments('oam-export', argv.slice(1));
|
|
148
|
-
if (command === 'ct-search')
|
|
149
|
-
return parseCtSearchArguments(argv.slice(1));
|
|
150
|
-
if (command === 'ct-intake')
|
|
151
|
-
return parseCtIntakeArguments(argv.slice(1));
|
|
152
|
-
if (command === 'discover')
|
|
153
|
-
return parseDiscoverArguments(argv.slice(1));
|
|
154
|
-
if (command === 'discover-scan')
|
|
155
|
-
return parseDiscoverScanArguments(argv.slice(1));
|
|
156
|
-
if (command === 'posture')
|
|
157
|
-
return parsePostureArguments(argv.slice(1));
|
|
158
|
-
if (command === 'http')
|
|
159
|
-
return parseHttpArguments(argv.slice(1));
|
|
160
|
-
if (command === 'tls')
|
|
161
|
-
return parseTlsArguments(argv.slice(1));
|
|
162
|
-
if (command === 'dnssec-validate')
|
|
163
|
-
return parseDnssecValidateArguments(argv.slice(1));
|
|
164
|
-
if (command === 'mail-transport')
|
|
165
|
-
return parseMailTransportArguments(argv.slice(1));
|
|
166
|
-
if (command === 'registry-support')
|
|
167
|
-
return parseRegistrySupportArguments(argv.slice(1));
|
|
168
|
-
if (command === 'registry-doctor')
|
|
169
|
-
return parseRegistryDoctorArguments(argv.slice(1));
|
|
170
|
-
if (command === 'registry-cohort')
|
|
171
|
-
return parseRegistryCohortArguments(argv.slice(1));
|
|
172
|
-
if (command === 'registry-scaffold')
|
|
173
|
-
return parseRegistryScaffoldArguments(argv.slice(1));
|
|
174
|
-
if (command === 'risk-calibrate')
|
|
175
|
-
return parseRiskCalibrateArguments(argv.slice(1));
|
|
176
|
-
if (command === 'lookalike-calibrate')
|
|
177
|
-
return parseLookalikeCalibrateArguments(argv.slice(1));
|
|
178
|
-
if (command === 'verify-artifact')
|
|
179
|
-
return parseVerifyArtifactArguments(argv.slice(1));
|
|
180
|
-
if (command === 'interchange-report')
|
|
181
|
-
return parseInterchangeReportArguments(argv.slice(1));
|
|
182
|
-
if (command === 'inspect-archive')
|
|
183
|
-
return parseInspectArchiveArguments(argv.slice(1));
|
|
184
|
-
if (command === 'sign-artifact')
|
|
185
|
-
return parseSignArtifactArguments(argv.slice(1));
|
|
186
|
-
if (command === 'verify-signature')
|
|
187
|
-
return parseVerifySignatureArguments(argv.slice(1));
|
|
188
|
-
if (command === 'source-report')
|
|
189
|
-
return parseSourceReportArguments(argv.slice(1));
|
|
190
|
-
if (command === 'compare')
|
|
191
|
-
return parseCompareArguments(argv.slice(1));
|
|
192
|
-
if (command === 'page-compare')
|
|
193
|
-
return parsePageCompareArguments(argv.slice(1));
|
|
194
|
-
if (command === 'mail-review')
|
|
195
|
-
return parseMailReviewArguments(argv.slice(1));
|
|
196
|
-
if (command === 'review-evidence')
|
|
197
|
-
return parseReviewEvidenceArguments(argv.slice(1));
|
|
198
|
-
if (command === 'brief')
|
|
199
|
-
return parseBriefArguments(argv.slice(1));
|
|
200
|
-
if (command === 'case-pack')
|
|
201
|
-
return parseCasePackArguments(argv.slice(1));
|
|
202
|
-
if (command === 'domain-control')
|
|
203
|
-
return parseDomainControlArguments(argv.slice(1));
|
|
204
|
-
if (command === 'monitor-once')
|
|
205
|
-
return parseMonitorOnceArguments(argv.slice(1));
|
|
206
|
-
if (command === 'assurance')
|
|
207
|
-
return parseAssuranceArguments(argv.slice(1));
|
|
208
|
-
if (command === 'change-packet')
|
|
209
|
-
return parseChangePacketArguments(argv.slice(1));
|
|
210
|
-
if (command === 'sharing-review')
|
|
211
|
-
return parseSharingReviewArguments(argv.slice(1));
|
|
212
|
-
if (command === 'workflow-plan')
|
|
213
|
-
return parseWorkflowPlanArguments(argv.slice(1));
|
|
214
|
-
if (command === 'workflow-run')
|
|
215
|
-
return parseWorkflowRunArguments(argv.slice(1));
|
|
216
|
-
if (command === 'diff')
|
|
217
|
-
return parseDiffArguments(argv.slice(1));
|
|
218
|
-
if (command === 'reconcile')
|
|
219
|
-
return parseReconcileArguments(argv.slice(1));
|
|
220
|
-
if (command === 'timeline')
|
|
221
|
-
return parseTimelineArguments(argv.slice(1));
|
|
222
|
-
if (command === 'export')
|
|
223
|
-
return parseExportArguments(argv.slice(1));
|
|
110
|
+
const parsed = CLI_PARSERS[command](directLookup ? argv : argv.slice(1));
|
|
111
|
+
if (parsed.action !== command) {
|
|
112
|
+
throw new Error(`CLI parser contract mismatch for ${command}.`);
|
|
113
|
+
}
|
|
114
|
+
return parsed;
|
|
115
|
+
}
|
|
116
|
+
function parseLookupArguments(lookupArguments) {
|
|
224
117
|
let query = null;
|
|
225
118
|
let output = 'terminal';
|
|
226
119
|
let deep = false;
|
|
@@ -232,11 +125,12 @@ function parseCliArgumentsCore(argv) {
|
|
|
232
125
|
let strictExit = false;
|
|
233
126
|
let events = false;
|
|
234
127
|
let plan = false;
|
|
128
|
+
let browse = false;
|
|
235
129
|
let includeAttribution = true;
|
|
236
130
|
let failOn = null;
|
|
237
131
|
let observerLabel = null;
|
|
238
132
|
let vantageLabel = null;
|
|
239
|
-
|
|
133
|
+
let saveLookup = null;
|
|
240
134
|
for (let index = 0; index < lookupArguments.length; index++) {
|
|
241
135
|
const argument = lookupArguments[index];
|
|
242
136
|
if (argument === undefined)
|
|
@@ -289,6 +183,19 @@ function parseCliArgumentsCore(argv) {
|
|
|
289
183
|
throw new CliUsageError('--plan may be supplied only once.');
|
|
290
184
|
plan = true;
|
|
291
185
|
}
|
|
186
|
+
else if (argument === '--browse') {
|
|
187
|
+
if (browse)
|
|
188
|
+
throw new CliUsageError('--browse may be supplied only once.');
|
|
189
|
+
browse = true;
|
|
190
|
+
}
|
|
191
|
+
else if (argument === '--save-lookup') {
|
|
192
|
+
if (saveLookup !== null)
|
|
193
|
+
throw new CliUsageError('--save-lookup may be supplied only once.');
|
|
194
|
+
const value = lookupArguments[++index];
|
|
195
|
+
if (!value || value.startsWith('-'))
|
|
196
|
+
throw new CliUsageError('--save-lookup requires one bounded file path.');
|
|
197
|
+
saveLookup = value;
|
|
198
|
+
}
|
|
292
199
|
else if (argument === '--no-attribution') {
|
|
293
200
|
if (!includeAttribution)
|
|
294
201
|
throw new CliUsageError('--no-attribution may be supplied only once.');
|
|
@@ -330,6 +237,17 @@ function parseCliArgumentsCore(argv) {
|
|
|
330
237
|
throw new CliUsageError('--quiet cannot be combined with machine-readable output.');
|
|
331
238
|
if (detailSet && output !== 'terminal')
|
|
332
239
|
throw new CliUsageError('--summary and --verbose apply only to terminal output.');
|
|
240
|
+
if (browse && output !== 'terminal')
|
|
241
|
+
throw new CliUsageError('--browse applies only to terminal output.');
|
|
242
|
+
if (browse && (detailSet || events || plan || quiet)) {
|
|
243
|
+
throw new CliUsageError('--browse cannot be combined with detail, event, plan, or quiet options.');
|
|
244
|
+
}
|
|
245
|
+
if (browse && query === null) {
|
|
246
|
+
throw new CliUsageError('--browse requires a positional target because interactive stdin is reserved for navigation.');
|
|
247
|
+
}
|
|
248
|
+
if (saveLookup !== null && !browse) {
|
|
249
|
+
throw new CliUsageError('--save-lookup requires --browse so the exact completed Lookup document is saved after the browser closes.');
|
|
250
|
+
}
|
|
333
251
|
if (!includeAttribution && output !== 'markdown' && output !== 'html') {
|
|
334
252
|
throw new CliUsageError('--no-attribution applies only to Markdown or HTML reports.');
|
|
335
253
|
}
|
|
@@ -338,7 +256,7 @@ function parseCliArgumentsCore(argv) {
|
|
|
338
256
|
if (plan && (detailSet || strictExit || events || quiet || failOn !== null)) {
|
|
339
257
|
throw new CliUsageError('--plan cannot be combined with detail, strict-exit, event, or quiet options.');
|
|
340
258
|
}
|
|
341
|
-
return { action: 'lookup', query, output, deep, detail, strictExit, events, plan, includeAttribution, observerLabel, vantageLabel, quiet, color, ...(failOn ? { failOn } : {}) };
|
|
259
|
+
return { action: 'lookup', query, output, deep, detail, strictExit, events, plan, includeAttribution, observerLabel, vantageLabel, quiet, color, ...(browse ? { browse: true } : {}), ...(saveLookup ? { saveLookup } : {}), ...(failOn ? { failOn } : {}) };
|
|
342
260
|
}
|
|
343
261
|
function parseCompletionArguments(argv) {
|
|
344
262
|
if (argv.length !== 1 || !['bash', 'zsh', 'fish', 'powershell'].includes(argv[0] || '')) {
|
|
@@ -431,14 +349,41 @@ function parseOfflineImportArguments(action, argv) {
|
|
|
431
349
|
}
|
|
432
350
|
function parseCommandsArguments(argv) {
|
|
433
351
|
let output = 'terminal';
|
|
352
|
+
let common = false;
|
|
353
|
+
let group = null;
|
|
354
|
+
let mode = null;
|
|
434
355
|
let quiet = false;
|
|
435
356
|
let color = true;
|
|
436
|
-
for (
|
|
357
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
358
|
+
const argument = argv[index];
|
|
437
359
|
if (argument === '--json') {
|
|
438
360
|
if (output !== 'terminal')
|
|
439
361
|
throw new CliUsageError('--json may be supplied only once.');
|
|
440
362
|
output = 'json';
|
|
441
363
|
}
|
|
364
|
+
else if (argument === '--common') {
|
|
365
|
+
if (common)
|
|
366
|
+
throw new CliUsageError('--common may be supplied only once.');
|
|
367
|
+
common = true;
|
|
368
|
+
}
|
|
369
|
+
else if (argument === '--group') {
|
|
370
|
+
if (group !== null)
|
|
371
|
+
throw new CliUsageError('--group may be supplied only once.');
|
|
372
|
+
const value = argv[++index];
|
|
373
|
+
if (!['investigate', 'respond', 'assure', 'utilities'].includes(value ?? '')) {
|
|
374
|
+
throw new CliUsageError('--group requires investigate, respond, assure, or utilities.');
|
|
375
|
+
}
|
|
376
|
+
group = value;
|
|
377
|
+
}
|
|
378
|
+
else if (argument === '--mode') {
|
|
379
|
+
if (mode !== null)
|
|
380
|
+
throw new CliUsageError('--mode may be supplied only once.');
|
|
381
|
+
const value = argv[++index];
|
|
382
|
+
if (value !== 'offline' && value !== 'network') {
|
|
383
|
+
throw new CliUsageError('--mode requires offline or network.');
|
|
384
|
+
}
|
|
385
|
+
mode = value;
|
|
386
|
+
}
|
|
442
387
|
else if (argument === '--quiet')
|
|
443
388
|
quiet = true;
|
|
444
389
|
else if (argument === '--no-color')
|
|
@@ -448,7 +393,7 @@ function parseCommandsArguments(argv) {
|
|
|
448
393
|
}
|
|
449
394
|
if (quiet && output !== 'terminal')
|
|
450
395
|
throw new CliUsageError('--quiet cannot be combined with machine-readable output.');
|
|
451
|
-
return { action: 'commands', output, quiet, color };
|
|
396
|
+
return { action: 'commands', output, common, group, mode, quiet, color };
|
|
452
397
|
}
|
|
453
398
|
function parseDoctorArguments(argv) {
|
|
454
399
|
let network = false;
|
|
@@ -1225,9 +1170,11 @@ function parseCasePackArguments(argv) {
|
|
|
1225
1170
|
}
|
|
1226
1171
|
if (audience === null)
|
|
1227
1172
|
throw new CliUsageError('case-pack requires --audience internal, trusted, or public.');
|
|
1173
|
+
if (!reviewed)
|
|
1174
|
+
throw new CliUsageError('case-pack requires --reviewed to confirm deliberate analyst review.');
|
|
1228
1175
|
if (quiet && output !== 'terminal')
|
|
1229
1176
|
throw new CliUsageError('--quiet cannot be combined with machine-readable output.');
|
|
1230
|
-
return { action: 'case-pack', source, output, audience, reviewed, quiet, color };
|
|
1177
|
+
return { action: 'case-pack', source, output, audience, reviewed: true, quiet, color };
|
|
1231
1178
|
}
|
|
1232
1179
|
function parseMonitorOnceArguments(argv) {
|
|
1233
1180
|
let source = null;
|
|
@@ -1235,6 +1182,8 @@ function parseMonitorOnceArguments(argv) {
|
|
|
1235
1182
|
let output = 'terminal';
|
|
1236
1183
|
let limit = 20;
|
|
1237
1184
|
let concurrency = 2;
|
|
1185
|
+
let limitSupplied = false;
|
|
1186
|
+
let concurrencySupplied = false;
|
|
1238
1187
|
let failOn = null;
|
|
1239
1188
|
let quiet = false;
|
|
1240
1189
|
let color = true;
|
|
@@ -1261,14 +1210,21 @@ function parseMonitorOnceArguments(argv) {
|
|
|
1261
1210
|
previousSource = value;
|
|
1262
1211
|
}
|
|
1263
1212
|
else if (argument === '--limit' || argument === '--concurrency') {
|
|
1213
|
+
if (argument === '--limit' ? limitSupplied : concurrencySupplied) {
|
|
1214
|
+
throw new CliUsageError(`${argument} may be supplied only once.`);
|
|
1215
|
+
}
|
|
1264
1216
|
const value = Number(argv[++index]);
|
|
1265
1217
|
const maximum = argument === '--limit' ? 20 : 3;
|
|
1266
1218
|
if (!Number.isSafeInteger(value) || value < 1 || value > maximum)
|
|
1267
1219
|
throw new CliUsageError(`${argument} requires an integer from 1 to ${maximum}.`);
|
|
1268
|
-
if (argument === '--limit')
|
|
1220
|
+
if (argument === '--limit') {
|
|
1269
1221
|
limit = value;
|
|
1270
|
-
|
|
1222
|
+
limitSupplied = true;
|
|
1223
|
+
}
|
|
1224
|
+
else {
|
|
1271
1225
|
concurrency = value;
|
|
1226
|
+
concurrencySupplied = true;
|
|
1227
|
+
}
|
|
1272
1228
|
}
|
|
1273
1229
|
else if (argument === '--fail-on') {
|
|
1274
1230
|
if (failOn !== null)
|
|
@@ -1380,15 +1336,33 @@ function parseSharingReviewArguments(argv) {
|
|
|
1380
1336
|
}
|
|
1381
1337
|
function parseWorkflowPlanArguments(argv) {
|
|
1382
1338
|
const positional = [];
|
|
1339
|
+
let discovery = null;
|
|
1340
|
+
let explainedRecipe = null;
|
|
1383
1341
|
let output = 'terminal';
|
|
1384
1342
|
let quiet = false;
|
|
1385
1343
|
let color = true;
|
|
1386
|
-
for (
|
|
1344
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
1345
|
+
const argument = argv[index];
|
|
1387
1346
|
if (argument === '--json') {
|
|
1388
1347
|
if (output !== 'terminal')
|
|
1389
1348
|
throw new CliUsageError('--json may be supplied only once.');
|
|
1390
1349
|
output = 'json';
|
|
1391
1350
|
}
|
|
1351
|
+
else if (argument === '--list') {
|
|
1352
|
+
if (discovery !== null)
|
|
1353
|
+
throw new CliUsageError('--list and --explain are mutually exclusive and may be supplied only once.');
|
|
1354
|
+
discovery = 'list';
|
|
1355
|
+
}
|
|
1356
|
+
else if (argument === '--explain') {
|
|
1357
|
+
if (discovery !== null)
|
|
1358
|
+
throw new CliUsageError('--list and --explain are mutually exclusive and may be supplied only once.');
|
|
1359
|
+
const value = argv[++index];
|
|
1360
|
+
if (!INVESTIGATION_PLAN_RECIPES.includes(value)) {
|
|
1361
|
+
throw new CliUsageError(`--explain recipe must be one of: ${INVESTIGATION_PLAN_RECIPES.join(', ')}.`);
|
|
1362
|
+
}
|
|
1363
|
+
discovery = 'explain';
|
|
1364
|
+
explainedRecipe = value;
|
|
1365
|
+
}
|
|
1392
1366
|
else if (argument === '--quiet')
|
|
1393
1367
|
quiet = true;
|
|
1394
1368
|
else if (argument === '--no-color')
|
|
@@ -1398,14 +1372,21 @@ function parseWorkflowPlanArguments(argv) {
|
|
|
1398
1372
|
else
|
|
1399
1373
|
positional.push(argument);
|
|
1400
1374
|
}
|
|
1375
|
+
if (quiet && output !== 'terminal')
|
|
1376
|
+
throw new CliUsageError('--quiet cannot be combined with machine-readable output.');
|
|
1377
|
+
if (discovery !== null) {
|
|
1378
|
+
if (positional.length !== 0)
|
|
1379
|
+
throw new CliUsageError('workflow-plan discovery options do not accept a subject.');
|
|
1380
|
+
if (discovery === 'list')
|
|
1381
|
+
return { action: 'workflow-plan', discovery, output, quiet, color };
|
|
1382
|
+
return { action: 'workflow-plan', discovery, recipe: explainedRecipe, output, quiet, color };
|
|
1383
|
+
}
|
|
1401
1384
|
if (positional.length !== 2)
|
|
1402
|
-
throw new CliUsageError('workflow-plan requires one fixed recipe and one subject
|
|
1385
|
+
throw new CliUsageError('workflow-plan requires one fixed recipe and one subject, --list, or --explain <recipe>.');
|
|
1403
1386
|
const recipe = positional[0];
|
|
1404
1387
|
if (!INVESTIGATION_PLAN_RECIPES.includes(recipe)) {
|
|
1405
1388
|
throw new CliUsageError(`workflow-plan recipe must be one of: ${INVESTIGATION_PLAN_RECIPES.join(', ')}.`);
|
|
1406
1389
|
}
|
|
1407
|
-
if (quiet && output !== 'terminal')
|
|
1408
|
-
throw new CliUsageError('--quiet cannot be combined with machine-readable output.');
|
|
1409
1390
|
return { action: 'workflow-plan', recipe: recipe, subject: positional[1], output, quiet, color };
|
|
1410
1391
|
}
|
|
1411
1392
|
function parseWorkflowRunArguments(argv) {
|
|
@@ -1449,8 +1430,8 @@ function parseWorkflowRunArguments(argv) {
|
|
|
1449
1430
|
if (positional.length !== 2)
|
|
1450
1431
|
throw new CliUsageError('workflow-run requires one fixed recipe and one subject.');
|
|
1451
1432
|
const recipe = positional[0];
|
|
1452
|
-
if (!
|
|
1453
|
-
throw new CliUsageError(`workflow-run recipe must be one of: ${
|
|
1433
|
+
if (!RUNNABLE_INVESTIGATION_PLAN_RECIPES.includes(recipe)) {
|
|
1434
|
+
throw new CliUsageError(`workflow-run recipe must be one of: ${RUNNABLE_INVESTIGATION_PLAN_RECIPES.join(', ')}.`);
|
|
1454
1435
|
}
|
|
1455
1436
|
if (quiet && output !== 'terminal')
|
|
1456
1437
|
throw new CliUsageError('--quiet cannot be combined with machine-readable output.');
|
|
@@ -1774,4 +1755,53 @@ function parseExportArguments(argv) {
|
|
|
1774
1755
|
throw new CliUsageError('--no-attribution applies only to Markdown or HTML reports.');
|
|
1775
1756
|
return { action: 'export', source, format, compact, includeAttribution };
|
|
1776
1757
|
}
|
|
1777
|
-
|
|
1758
|
+
const CLI_PARSERS = Object.freeze({
|
|
1759
|
+
completion: parseCompletionArguments,
|
|
1760
|
+
doctor: parseDoctorArguments,
|
|
1761
|
+
commands: parseCommandsArguments,
|
|
1762
|
+
manual: parseManualArguments,
|
|
1763
|
+
manifest: parseManifestArguments,
|
|
1764
|
+
'map-observations': (argv) => parseOfflineImportArguments('map-observations', argv),
|
|
1765
|
+
'oam-export': (argv) => parseOfflineImportArguments('oam-export', argv),
|
|
1766
|
+
lookup: parseLookupArguments,
|
|
1767
|
+
bulk: parseBulkArguments,
|
|
1768
|
+
'ct-search': parseCtSearchArguments,
|
|
1769
|
+
'ct-intake': parseCtIntakeArguments,
|
|
1770
|
+
discover: parseDiscoverArguments,
|
|
1771
|
+
'discover-scan': parseDiscoverScanArguments,
|
|
1772
|
+
posture: parsePostureArguments,
|
|
1773
|
+
http: parseHttpArguments,
|
|
1774
|
+
tls: parseTlsArguments,
|
|
1775
|
+
'dnssec-validate': parseDnssecValidateArguments,
|
|
1776
|
+
'mail-transport': parseMailTransportArguments,
|
|
1777
|
+
'registry-support': parseRegistrySupportArguments,
|
|
1778
|
+
'registry-doctor': parseRegistryDoctorArguments,
|
|
1779
|
+
'registry-cohort': parseRegistryCohortArguments,
|
|
1780
|
+
'registry-scaffold': parseRegistryScaffoldArguments,
|
|
1781
|
+
'risk-calibrate': parseRiskCalibrateArguments,
|
|
1782
|
+
'lookalike-calibrate': parseLookalikeCalibrateArguments,
|
|
1783
|
+
'verify-artifact': parseVerifyArtifactArguments,
|
|
1784
|
+
'interchange-report': parseInterchangeReportArguments,
|
|
1785
|
+
'inspect-archive': parseInspectArchiveArguments,
|
|
1786
|
+
'sign-artifact': parseSignArtifactArguments,
|
|
1787
|
+
'verify-signature': parseVerifySignatureArguments,
|
|
1788
|
+
'source-report': parseSourceReportArguments,
|
|
1789
|
+
compare: parseCompareArguments,
|
|
1790
|
+
'page-compare': parsePageCompareArguments,
|
|
1791
|
+
'mail-review': parseMailReviewArguments,
|
|
1792
|
+
'review-evidence': parseReviewEvidenceArguments,
|
|
1793
|
+
brief: parseBriefArguments,
|
|
1794
|
+
'case-pack': parseCasePackArguments,
|
|
1795
|
+
'domain-control': parseDomainControlArguments,
|
|
1796
|
+
'monitor-once': parseMonitorOnceArguments,
|
|
1797
|
+
assurance: parseAssuranceArguments,
|
|
1798
|
+
'change-packet': parseChangePacketArguments,
|
|
1799
|
+
'sharing-review': parseSharingReviewArguments,
|
|
1800
|
+
'workflow-plan': parseWorkflowPlanArguments,
|
|
1801
|
+
'workflow-run': parseWorkflowRunArguments,
|
|
1802
|
+
diff: parseDiffArguments,
|
|
1803
|
+
reconcile: parseReconcileArguments,
|
|
1804
|
+
timeline: parseTimelineArguments,
|
|
1805
|
+
export: parseExportArguments,
|
|
1806
|
+
});
|
|
1807
|
+
export { CLI_COMMANDS, CLI_PARSERS, CliUsageError, MAX_CLI_ARGUMENTS, MAX_CLI_ARGUMENT_LENGTH, parseCliArguments };
|