mirror of
https://github.com/morluto/rea.git
synced 2026-11-14 18:52:48 +00:00
Every rea process imported and registered all 52 command registrars
(about 1,900 modules) before running any command. A one-shot command
now loads only the registrar that defines its top-level command.
- src/cli/cliCommandRegistrations.ts holds every registrar in one table,
grouped by tool family, with its module loader and its call. The
complete createCli registers the table with static imports, and the
types check that each entry matches its module.
- src/cli/cliShell.ts owns what does not depend on which commands are
registered: identity, globals, argument policy, completions and the
registration builtins. The full and lazy paths share it.
- scripts/record-cli-commands.mjs records, after tsc, which registrar
defines each top-level command, from the same compiled table. The
bundle keeps the record as an external dist module.
- cli/cliLoader.ts selects the recorded registrar when a known top-level
command runs. It loads the complete CLI for help, --schema, --llms,
completions, builtins, unknown names ("did you mean"), or a missing
record.
- Process-owned CLI resources register their closers when their module
loads (cli/cliResources.ts), so the shell no longer imports
JavaScript-analysis and guidance owners just to close them.
Measured on one pinned core (median of 5 warm runs, base main vs this
change):
- guidance: 1.95 s / 253 MB → 0.42 s / 101 MB
- list-cutter-sessions: 1.97 s → 0.49 s
- inspect-go-binary: 1.95 s → 0.95 s
- setup --dry-run: 2.40 s → 1.88 s
- analyze: 2.39 s → 1.78 s
- --help: 1.99 s → 2.04 s (complete CLI, as before)
Co-Authored-By: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>
144 lines
6.2 KiB
TypeScript
144 lines
6.2 KiB
TypeScript
import type { FridaInstrumentationPort } from "./application/frida/FridaInstrumentationPort.js";
|
|
import {
|
|
CLI_COMMAND_REGISTRATIONS,
|
|
CLI_REGISTRATION_ORDER,
|
|
type CliCommandModules,
|
|
} from "./cli/cliCommandRegistrations.js";
|
|
import type { CliResultOutput } from "./cli/cliResultOutput.js";
|
|
import { createCliShell } from "./cli/cliShell.js";
|
|
import type { CliInstance } from "./cli/types.js";
|
|
import { createDirectAnalysis } from "./composition/directAnalysis.js";
|
|
import * as setupModule from "./cli/setupCommands.js";
|
|
import * as coreAnalysisModule from "./cli/coreAnalysisCommands.js";
|
|
import * as reverseEngineeringModule from "./cli/reverseEngineeringCommands.js";
|
|
import * as cutterModule from "./cli/cutterCommands.js";
|
|
import * as utilityModule from "./cli/utilityCommands.js";
|
|
import * as binaryDiagnosticsModule from "./cli/binaryDiagnosticsCommands.js";
|
|
import * as wasmModule from "./cli/wasmCommands.js";
|
|
import * as apkSignatureModule from "./cli/apkSignatureCommands.js";
|
|
import * as captureModule from "./cli/captureCommands.js";
|
|
import * as signalModule from "./cli/signalCommands.js";
|
|
import * as evmModule from "./cli/evmCommands.js";
|
|
import * as desktopApplicationModule from "./cli/desktopApplicationCommands.js";
|
|
import * as releaseExposureModule from "./cli/releaseExposureCommands.js";
|
|
import * as goModule from "./cli/goCommands.js";
|
|
import * as il2cppModule from "./cli/il2cppCommands.js";
|
|
import * as modelModule from "./cli/modelCommands.js";
|
|
import * as gpuModule from "./cli/gpuCommands.js";
|
|
import * as rustModule from "./cli/rustCommands.js";
|
|
import * as pythonPycModule from "./cli/pythonPycCommands.js";
|
|
import * as erlangModule from "./cli/erlangCommands.js";
|
|
import * as v8CodeCacheModule from "./cli/v8CodeCacheCommands.js";
|
|
import * as sqliteModule from "./cli/sqliteCommands.js";
|
|
import * as artifactModule from "./cli/artifactCommands.js";
|
|
import * as managedModule from "./cli/managedCommands.js";
|
|
import * as firmwareModule from "./cli/firmwareCommands.js";
|
|
import * as androidModule from "./cli/androidCommands.js";
|
|
import * as pcapModule from "./cli/pcapCommands.js";
|
|
import * as flutterModule from "./cli/flutterCommands.js";
|
|
import * as fridaModule from "./cli/fridaCommands.js";
|
|
import * as apktoolModule from "./cli/apktoolCommands.js";
|
|
import * as jebModule from "./cli/jebCommands.js";
|
|
import * as adbModule from "./cli/adbCommands.js";
|
|
import * as browserModule from "./cli/browserCommands.js";
|
|
import * as webRuntimeModule from "./cli/webRuntimeCommands.js";
|
|
import * as webNetworkCaptureModule from "./cli/webNetworkCaptureCommands.js";
|
|
import * as advancedBrowserModule from "./cli/browserAdvancedCommands.js";
|
|
import * as browserScenarioModule from "./cliBrowserScenarioCommands.js";
|
|
import * as electronModule from "./cli/electronCommands.js";
|
|
import * as javaScriptRuntimeObservationModule from "./cli/javascriptRuntimeCommands.js";
|
|
import * as guidanceModule from "./cli/guidanceCommands.js";
|
|
import * as guidedWorkflowModule from "./cli/guidedWorkflowCommands.js";
|
|
import * as analysisViewModule from "./cli/analysisViewCommands.js";
|
|
import * as evidenceModule from "./cliEvidenceCommands.js";
|
|
import * as environmentModule from "./cli/environmentCommands.js";
|
|
import * as processModule from "./cli/processCommands.js";
|
|
import * as desktopCaptureModule from "./cli/desktopCaptureCommands.js";
|
|
import * as javaScriptRecoveryModule from "./cli/javascriptRecoveryCommands.js";
|
|
import * as webScriptModule from "./cli/webScriptCommands.js";
|
|
import * as webModuleModule from "./cli/webModuleCommands.js";
|
|
import * as webSourceLocationModule from "./cli/webSourceLocationCommands.js";
|
|
import * as applicationModule from "./cli/applicationCommands.js";
|
|
import * as nativeFunctionMatchingModule from "./cli/nativeFunctionMatchingCommands.js";
|
|
|
|
export { closeCliResources } from "./cli/cliResources.js";
|
|
|
|
const CLI_COMMAND_MODULES: CliCommandModules = {
|
|
setup: setupModule,
|
|
coreAnalysis: coreAnalysisModule,
|
|
reverseEngineering: reverseEngineeringModule,
|
|
cutter: cutterModule,
|
|
utility: utilityModule,
|
|
binaryDiagnostics: binaryDiagnosticsModule,
|
|
wasm: wasmModule,
|
|
apkSignature: apkSignatureModule,
|
|
capture: captureModule,
|
|
signal: signalModule,
|
|
evm: evmModule,
|
|
desktopApplication: desktopApplicationModule,
|
|
releaseExposure: releaseExposureModule,
|
|
go: goModule,
|
|
il2cpp: il2cppModule,
|
|
model: modelModule,
|
|
gpu: gpuModule,
|
|
rust: rustModule,
|
|
pythonPyc: pythonPycModule,
|
|
erlang: erlangModule,
|
|
v8CodeCache: v8CodeCacheModule,
|
|
sqlite: sqliteModule,
|
|
artifact: artifactModule,
|
|
managed: managedModule,
|
|
firmware: firmwareModule,
|
|
android: androidModule,
|
|
pcap: pcapModule,
|
|
flutter: flutterModule,
|
|
frida: fridaModule,
|
|
apktool: apktoolModule,
|
|
jeb: jebModule,
|
|
adb: adbModule,
|
|
browser: browserModule,
|
|
webRuntime: webRuntimeModule,
|
|
webNetworkCapture: webNetworkCaptureModule,
|
|
advancedBrowser: advancedBrowserModule,
|
|
browserScenario: browserScenarioModule,
|
|
electron: electronModule,
|
|
javaScriptRuntimeObservation: javaScriptRuntimeObservationModule,
|
|
guidance: guidanceModule,
|
|
guidedWorkflow: guidedWorkflowModule,
|
|
analysisView: analysisViewModule,
|
|
evidence: evidenceModule,
|
|
environment: environmentModule,
|
|
process: processModule,
|
|
desktopCapture: desktopCaptureModule,
|
|
javaScriptRecovery: javaScriptRecoveryModule,
|
|
webScript: webScriptModule,
|
|
webModule: webModuleModule,
|
|
webSourceLocation: webSourceLocationModule,
|
|
application: applicationModule,
|
|
nativeFunctionMatching: nativeFunctionMatchingModule,
|
|
};
|
|
|
|
/**
|
|
* Build the complete 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.
|
|
* One-shot commands load only their own registrars; see `cli/cliLoader.ts`.
|
|
*/
|
|
export const createCli = (
|
|
selectedEnvironment: Readonly<
|
|
Record<string, string | undefined>
|
|
> = process.env,
|
|
resultOutput?: CliResultOutput,
|
|
fridaInstrumentation?: FridaInstrumentationPort,
|
|
): CliInstance =>
|
|
createCliShell({
|
|
selectedEnvironment,
|
|
resultOutput,
|
|
fridaInstrumentation,
|
|
createAnalysis: createDirectAnalysis,
|
|
registrations: CLI_REGISTRATION_ORDER.map((id) => ({
|
|
registration: CLI_COMMAND_REGISTRATIONS[id],
|
|
module: CLI_COMMAND_MODULES[id],
|
|
})),
|
|
});
|