mirror of
https://github.com/morluto/rea
synced 2026-10-26 22:28:27 -04:00
9d7779d365
Reuse the nonempty NUL-free local path contract before normalization in artifact commands, auxiliary inputs, and output destinations. Empty selections now fail at parsing instead of selecting the working directory; explicit relative paths preserve their target. Public CLI checks cover primary and auxiliary empty paths, exact relative-file digest, explicit current-directory selection, symlink parent semantics, and environment export inputs. Correct the desktop fixture to assert the existing CLI validation envelope.
88 lines
3.2 KiB
TypeScript
88 lines
3.2 KiB
TypeScript
import { z } from "incur";
|
|
import { createSqliteDatabaseService } from "../composition/sqlite.js";
|
|
import { CLI_COMMANDS } from "../cliCommandNames.js";
|
|
import { logCliCommand } from "../cliLogging.js";
|
|
import type { Logger } from "pino";
|
|
import type { CliInstance } from "./types.js";
|
|
import { withCommandCancellation } from "./commandCancellation.js";
|
|
import { localPathStringSchema } from "../domain/localPath.js";
|
|
import { absoluteCallerPath } from "../filesystem/callerPath.js";
|
|
import { finishAnalysisCommand } from "./finishAnalysisCommand.js";
|
|
import { inspectSqliteDatabaseInputSchema } from "../domain/sqlite/sqliteDatabase.js";
|
|
|
|
/** Resolve an operator-selected SQLite snapshot through the shared inspection workflow. */
|
|
export const registerSqliteCommands = (
|
|
cli: CliInstance,
|
|
logger: Logger,
|
|
environment: Readonly<NodeJS.ProcessEnv>,
|
|
): void => {
|
|
const service = createSqliteDatabaseService(environment);
|
|
cli.command(CLI_COMMANDS.inspectSqliteDatabase, {
|
|
description:
|
|
"Inspect SQLite schema and optional ordinary-table rows from a local snapshot",
|
|
args: z.object({
|
|
path: localPathStringSchema.describe("Local SQLite database snapshot"),
|
|
}),
|
|
options: z.object({
|
|
workerTimeoutMs: inspectSqliteDatabaseInputSchema.shape.worker_timeout_ms,
|
|
table: z
|
|
.string()
|
|
.optional()
|
|
.describe("Exact ordinary table name to read"),
|
|
column: z
|
|
.array(z.string())
|
|
.optional()
|
|
.describe(
|
|
"Repeat to select exact row columns in the requested order; requires table",
|
|
),
|
|
schemaScope: z
|
|
.enum(["inventory", "selected_table", "database"])
|
|
.optional()
|
|
.describe(
|
|
"Compact inventory by default, or selected-table details when table is supplied; database requests full schema",
|
|
),
|
|
rowLimit: z
|
|
.number()
|
|
.int()
|
|
.min(1)
|
|
.optional()
|
|
.describe(
|
|
"Positive safe integer row count; default 20; requires table",
|
|
),
|
|
}),
|
|
run: ({ args, options }) =>
|
|
withCommandCancellation((signal) =>
|
|
logCliCommand(logger, CLI_COMMANDS.inspectSqliteDatabase, () =>
|
|
finishAnalysisCommand(
|
|
() =>
|
|
service.inspect(
|
|
{
|
|
path: absoluteCallerPath(args.path),
|
|
...(options.workerTimeoutMs === undefined
|
|
? {}
|
|
: { worker_timeout_ms: options.workerTimeoutMs }),
|
|
...(options.table === undefined
|
|
? {}
|
|
: { table: options.table }),
|
|
...(options.rowLimit === undefined
|
|
? {}
|
|
: { row_limit: options.rowLimit }),
|
|
...(options.column === undefined
|
|
? {}
|
|
: { columns: options.column }),
|
|
...(options.schemaScope === undefined
|
|
? {}
|
|
: { schema_scope: options.schemaScope }),
|
|
},
|
|
{ signal },
|
|
),
|
|
service,
|
|
"sqlite",
|
|
"inspect_sqlite_database",
|
|
signal,
|
|
),
|
|
),
|
|
),
|
|
});
|
|
};
|