2026-10-13 03:35:35 +08:00
import { registerCaptureCommands } from "./cli/captureCommands.js" ;
2026-10-13 04:59:02 +08:00
import { registerSignalCommands } from "./cli/signalCommands.js" ;
2026-10-11 20:49:00 +09:00
import { registerWasmCommands } from "./cli/wasmCommands.js" ;
2026-10-09 20:02:52 +08:00
import { snapshotEnvironment } from "./process/snapshotEnvironment.js" ;
import { createDirectAnalysis } from "./composition/directAnalysis.js" ;
2026-10-08 15:32:05 +08:00
import { registerEvmCommands } from "./cli/evmCommands.js" ;
2026-10-11 23:34:02 -04:00
import { registerGoCommands } from "./cli/goCommands.js" ;
2026-10-13 11:50:30 -07:00
import { registerRustCommands } from "./cli/rustCommands.js" ;
2026-10-13 02:33:23 +08:00
import { registerSqliteCommands } from "./cli/sqliteCommands.js" ;
2026-10-08 21:45:48 -07:00
import { registerAnalysisViewCommands } from "./cli/analysisViewCommands.js" ;
2026-10-08 14:22:08 +08:00
import { registerBinaryDiagnosticsCommands } from "./cli/binaryDiagnosticsCommands.js" ;
2026-10-12 11:01:58 -03:00
import { registerFridaCommands } from "./cli/fridaCommands.js" ;
import type { FridaInstrumentationPort } from "./application/frida/FridaInstrumentationPort.js" ;
2026-07-18 04:11:29 +00:00
import { Cli } from "incur" ;
2026-10-18 05:33:21 +08:00
import { normalizeCliArguments } from "./cliOutput.js" ;
2026-07-12 07:44:21 +08:00
2026-07-18 04:11:29 +00:00
import { createLogger , parseLogLevel } from "./logger.js" ;
2026-10-12 06:07:37 -07:00
import { projectAnalysisError } from "./domain/analysisErrorProjection.js" ;
2026-07-12 07:44:21 +08:00
import { PRODUCT_IDENTITY } from "./identity.js" ;
2026-10-08 22:11:54 +08:00
import { npxRegistrationCommand } from "./application/ClientRegistrationIdentity.js" ;
2026-07-18 04:11:29 +00:00
import { registerSetupCommands } from "./cli/setupCommands.js" ;
import { registerCoreAnalysisCommands } from "./cli/coreAnalysisCommands.js" ;
import { registerUtilityCommands } from "./cli/utilityCommands.js" ;
import { registerArtifactCommands } from "./cli/artifactCommands.js" ;
import { registerManagedCommands } from "./cli/managedCommands.js" ;
2026-10-06 22:16:04 +08:00
import { registerFirmwareCommands } from "./cli/firmwareCommands.js" ;
2026-10-06 20:46:48 +08:00
import { registerAndroidCommands } from "./cli/androidCommands.js" ;
2026-10-10 17:04:12 +02:00
import { registerApktoolCommands } from "./cli/apktoolCommands.js" ;
2026-10-13 06:53:03 +02:00
import { registerPcapCommands } from "./cli/pcapCommands.js" ;
2026-10-12 16:35:55 +02:00
import { registerFlutterCommands } from "./cli/flutterCommands.js" ;
2026-10-10 17:03:27 +02:00
import { registerJebCommands } from "./cli/jebCommands.js" ;
2026-10-10 17:01:24 +02:00
import { registerAdbCommands } from "./cli/adbCommands.js" ;
2026-07-13 03:15:01 +00:00
import { registerEvidenceCommands } from "./cliEvidenceCommands.js" ;
2026-10-19 12:06:29 -07:00
import { registerEnvironmentCommands } from "./cli/environmentCommands.js" ;
2026-10-06 05:04:25 +08:00
import { registerProcessCommands } from "./cli/processCommands.js" ;
import { registerBrowserCommands } from "./cli/browserCommands.js" ;
2026-10-07 05:24:32 +08:00
import { registerWebScriptCommands } from "./cli/webScriptCommands.js" ;
2026-10-07 14:59:52 +08:00
import { registerWebModuleCommands } from "./cli/webModuleCommands.js" ;
2026-10-07 16:21:18 +08:00
import { registerWebSourceLocationCommands } from "./cli/webSourceLocationCommands.js" ;
2026-10-07 21:45:07 +08:00
import { registerWebRuntimeCommands } from "./cli/webRuntimeCommands.js" ;
2026-10-08 07:53:41 +08:00
import { registerWebNetworkCaptureCommands } from "./cli/webNetworkCaptureCommands.js" ;
2026-10-07 12:46:13 +08:00
import { registerJavaScriptRecoveryCommands } from "./cli/javascriptRecoveryCommands.js" ;
2026-10-06 05:04:25 +08:00
import { registerAdvancedBrowserCommands } from "./cli/browserAdvancedCommands.js" ;
2026-07-24 13:18:58 +00:00
import { registerBrowserScenarioCommands } from "./cliBrowserScenarioCommands.js" ;
2026-10-06 05:04:25 +08:00
import { registerElectronCommands } from "./cli/electronCommands.js" ;
2026-07-24 13:18:58 +00:00
import { registerJavaScriptRuntimeObservationCommands } from "./cliJavaScriptRuntimeCommands.js" ;
2026-10-06 05:04:25 +08:00
import { registerApplicationCommands } from "./cli/applicationCommands.js" ;
2026-10-08 20:11:11 -07:00
import { presentOmittableDefaults } from "./cli/omittableDefaults.js" ;
2026-07-18 04:11:29 +00:00
import type { CliInstance } from "./cli/types.js" ;
2026-10-10 06:22:20 +08:00
import {
streamCliCommandResults ,
type CliResultOutput ,
2026-10-13 03:33:27 +08:00
} from "./cli/cliResultOutput.js" ;
2026-10-14 04:47:34 +08:00
import { registerReverseEngineeringCommands } from "./cli/reverseEngineeringCommands.js" ;
import { registerCutterCommands } from "./cli/cutterCommands.js" ;
2026-07-12 07:44:21 +08:00
2026-10-12 06:07:37 -07:00
/** Describe CLI settings that are invalid before any command runs, as MCP does. */
export const cliConfigurationError = (
selectedEnvironment : Readonly < Record < string , string | undefined >>,
) : string | undefined => {
const value = selectedEnvironment . REA_LOG_LEVEL ;
if ( value === undefined ) return undefined ;
const level = parseLogLevel ( value );
return level . ok ? undefined : projectAnalysisError ( level . error ). message ;
};
2026-07-12 08:45:35 +08:00
/**
* Build the one-shot Incur CLI without starting Hopper at import time.
* Analysis commands acquire and close their own sessions; bare `mcp` and
* `--mcp` are intercepted by the executable dispatcher before this module loads.
*/
2026-10-05 20:00:16 +08:00
export const createCli = (
2026-10-09 20:02:52 +08:00
selectedEnvironment : Readonly <
Record < string , string | undefined >
> = process . env ,
2026-10-08 03:44:51 +08:00
resultOutput? : CliResultOutput ,
2026-10-12 11:01:58 -03:00
fridaInstrumentation? : FridaInstrumentationPort ,
2026-10-05 20:00:16 +08:00
) : CliInstance => {
2026-10-09 20:02:52 +08:00
const environment = snapshotEnvironment ( selectedEnvironment );
const analysis = createDirectAnalysis ( environment );
2026-10-12 06:07:37 -07:00
// The executable reports an invalid level through cliConfigurationError.
const level =
environment . REA_LOG_LEVEL === undefined
? undefined
: parseLogLevel ( environment . REA_LOG_LEVEL );
2026-07-12 10:57:34 +08:00
const logger = createLogger (
"cli" ,
2026-10-12 06:07:37 -07:00
level ? . ok === true ? level . value : "silent" ,
2026-07-12 10:57:34 +08:00
);
2026-07-12 07:44:21 +08:00
const cli = Cli . create ( PRODUCT_IDENTITY . cliBinary , {
2026-07-14 01:12:27 +00:00
version : PRODUCT_IDENTITY.packageVersion ,
2026-07-13 19:17:15 +00:00
description : "Reverse engineer anything from your terminal or agent." ,
2026-07-12 07:44:21 +08:00
mcp : {
2026-10-08 22:11:54 +08:00
command : npxRegistrationCommand (). join ( " " ),
2026-07-12 07:44:21 +08:00
instructions :
2026-07-12 20:49:30 +08:00
"Ask what software, artifact, protocol, or behavior the user wants to understand, then choose the available investigation capabilities that can produce evidence." ,
2026-07-12 07:44:21 +08:00
},
2026-10-05 23:27:46 -07:00
sync : false ,
2026-10-18 05:33:21 +08:00
update : {
// Incur's update:false only suppresses notices. Reject its explicit
// installer so ambiguous flags cannot bypass REA's verified workflow.
install : () => {
throw new Error (
"Use 'rea update' to update the identified installation. The '--update' alias accepts only global output flags." ,
);
},
},
2026-07-12 07:44:21 +08:00
});
2026-10-09 20:02:52 +08:00
registerSetupCommands ( cli , logger , environment );
2026-10-14 04:47:34 +08:00
registerReverseEngineeringCommands ( cli , logger , environment );
registerCutterCommands ( cli , logger , environment );
2026-10-10 06:22:20 +08:00
registerCoreAnalysisCommands ( cli , logger , analysis . runDirectAnalysis );
2026-10-09 20:02:52 +08:00
registerUtilityCommands ( cli , logger , environment , analysis );
2026-10-11 20:49:00 +09:00
registerWasmCommands ( cli , logger , environment );
2026-10-13 03:35:35 +08:00
registerCaptureCommands ( cli , logger , environment );
2026-10-13 04:59:02 +08:00
registerSignalCommands ( cli , logger , environment );
2026-10-08 15:32:05 +08:00
registerEvmCommands ( cli , logger , environment );
2026-10-11 23:34:02 -04:00
registerGoCommands ( cli , logger );
2026-10-13 11:50:30 -07:00
registerRustCommands ( cli , logger );
2026-10-13 02:33:23 +08:00
registerSqliteCommands ( cli , logger , environment );
2026-10-09 20:02:52 +08:00
registerArtifactCommands ( cli , logger , analysis . runProviderAnalysis );
registerManagedCommands ( cli , logger , analysis . runProviderAnalysis );
2026-10-06 20:46:48 +08:00
registerAndroidCommands ( cli , logger , environment );
2026-10-10 17:04:12 +02:00
registerApktoolCommands ( cli , logger , environment );
2026-10-13 06:53:03 +02:00
registerPcapCommands ( cli , logger , environment );
2026-10-12 16:35:55 +02:00
registerFlutterCommands ( cli , logger );
2026-10-10 17:03:27 +02:00
registerJebCommands ( cli , logger , environment );
2026-10-10 17:01:24 +02:00
registerAdbCommands ( cli , logger , environment );
2026-10-06 22:16:04 +08:00
registerFirmwareCommands ( cli , logger , environment );
2026-10-08 14:22:08 +08:00
registerBinaryDiagnosticsCommands ( cli , logger , environment );
2026-10-08 21:45:48 -07:00
registerAnalysisViewCommands ( cli , logger );
2026-10-12 11:01:58 -03:00
registerFridaCommands ( cli , logger , fridaInstrumentation );
2026-07-13 03:15:01 +00:00
registerEvidenceCommands ( cli , logger );
2026-10-19 12:06:29 -07:00
registerEnvironmentCommands ( cli , logger , environment );
2026-10-05 20:16:44 +08:00
registerProcessCommands ( cli , logger , environment );
2026-07-14 12:27:13 +08:00
registerBrowserCommands ( cli , logger );
2026-10-07 05:24:32 +08:00
registerWebScriptCommands ( cli , logger );
2026-10-07 14:59:52 +08:00
registerWebModuleCommands ( cli , logger , environment );
2026-10-07 16:21:18 +08:00
registerWebSourceLocationCommands ( cli , logger , environment );
2026-10-07 21:45:07 +08:00
registerWebRuntimeCommands ( cli , logger );
2026-10-08 07:53:41 +08:00
registerWebNetworkCaptureCommands ( cli , logger , environment );
2026-10-07 12:46:13 +08:00
registerJavaScriptRecoveryCommands ( cli , logger , environment );
2026-07-14 17:47:50 +08:00
registerAdvancedBrowserCommands ( cli , logger );
2026-10-09 20:02:52 +08:00
registerBrowserScenarioCommands ( cli , logger , environment );
2026-10-10 06:22:20 +08:00
registerElectronCommands ( cli , logger , environment );
2026-10-05 20:16:44 +08:00
registerJavaScriptRuntimeObservationCommands ( cli , logger );
2026-10-05 21:15:04 +08:00
registerApplicationCommands ( cli , logger );
2026-10-08 20:11:11 -07:00
presentOmittableDefaults ( cli );
2026-10-10 06:22:20 +08:00
if ( resultOutput !== undefined ) streamCliCommandResults ( cli , resultOutput );
2026-10-18 05:33:21 +08:00
const serve = cli . serve . bind ( cli );
cli . serve = ( arguments_ = process . argv . slice ( 2 ), options ) =>
serve ( normalizeCliArguments ( arguments_ ), options );
2026-07-13 03:15:01 +00:00
return cli ;
};