From 2709f9c1fd36c4e41f51543a488619a09897239a Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Tue, 15 Jul 2025 16:18:54 -0400 Subject: [PATCH 01/11] feat(cli): support buildArgs in docker builder --- .changeset/eighty-squids-float.md | 5 +++++ apps/cli/src/builder/docker.ts | 7 +++++-- apps/cli/src/config.ts | 4 ++++ apps/cli/tests/integration/builder/docker.test.ts | 5 +++++ apps/cli/tests/unit/config.test.ts | 7 ++++++- 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 .changeset/eighty-squids-float.md diff --git a/.changeset/eighty-squids-float.md b/.changeset/eighty-squids-float.md new file mode 100644 index 00000000..22dbd22f --- /dev/null +++ b/.changeset/eighty-squids-float.md @@ -0,0 +1,5 @@ +--- +"@cartesi/cli": patch +--- + +support buildArgs in docker builder diff --git a/apps/cli/src/builder/docker.ts b/apps/cli/src/builder/docker.ts index 532cad0a..8677b030 100644 --- a/apps/cli/src/builder/docker.ts +++ b/apps/cli/src/builder/docker.ts @@ -7,7 +7,7 @@ import { crane, genext2fs, mksquashfs } from "../exec/index.js"; type ImageBuildOptions = Pick< DockerDriveConfig, - "context" | "dockerfile" | "tags" | "target" + "buildArgs" | "context" | "dockerfile" | "tags" | "target" >; type ImageInfo = { @@ -21,7 +21,7 @@ type ImageInfo = { * Build Docker image (linux/riscv64). Returns image id. */ const buildImage = async (options: ImageBuildOptions): Promise => { - const { context, dockerfile, tags, target } = options; + const { buildArgs, context, dockerfile, tags, target } = options; const buildResult = tmp.tmpNameSync(); const args = [ "buildx", @@ -39,6 +39,9 @@ const buildImage = async (options: ImageBuildOptions): Promise => { // set tags for the image built args.push(...tags.flatMap((tag) => ["--tag", tag])); + // set build args + args.push(...buildArgs.flatMap((arg) => ["--build-arg", arg])); + if (target) { args.push("--target", target); } diff --git a/apps/cli/src/config.ts b/apps/cli/src/config.ts index 71240dc7..057388ee 100644 --- a/apps/cli/src/config.ts +++ b/apps/cli/src/config.ts @@ -99,6 +99,7 @@ export type DirectoryDriveConfig = { export type DockerDriveConfig = { builder: "docker"; + buildArgs: string[]; // default is empty array context: string; dockerfile: string; extraSize: number; // default is 0 (no extra size) @@ -163,6 +164,7 @@ type TomlTable = { [key: string]: TomlPrimitive }; export const defaultRootDriveConfig = (): DriveConfig => ({ builder: "docker", + buildArgs: [], context: ".", dockerfile: "Dockerfile", // file on current working directory extraSize: 0, @@ -410,6 +412,7 @@ const parseDrive = (drive: TomlPrimitive): DriveConfig => { } case "docker": { const { + buildArgs, context, dockerfile, extraSize, @@ -423,6 +426,7 @@ const parseDrive = (drive: TomlPrimitive): DriveConfig => { } = drive as TomlTable; return { builder: "docker", + buildArgs: parseStringArray(buildArgs), image: parseOptionalString(image), context: parseString(context, "."), dockerfile: parseString(dockerfile, "Dockerfile"), diff --git a/apps/cli/tests/integration/builder/docker.test.ts b/apps/cli/tests/integration/builder/docker.test.ts index 912640e2..93c81aba 100644 --- a/apps/cli/tests/integration/builder/docker.test.ts +++ b/apps/cli/tests/integration/builder/docker.test.ts @@ -17,6 +17,7 @@ describe("when building with the docker builder", () => { tmpdirTest("should fail without correct context", async ({ tmpdir }) => { const destination = tmpdir; const drive: DockerDriveConfig = { + buildArgs: [], builder: "docker", context: ".", dockerfile: "Dockerfile", @@ -34,6 +35,7 @@ describe("when building with the docker builder", () => { tmpdirTest("should fail a non-riscv image", async ({ tmpdir }) => { const destination = tmpdir; const drive: DockerDriveConfig = { + buildArgs: [], builder: "docker", context: path.join(__dirname, "data"), dockerfile: "Dockerfile", @@ -53,6 +55,7 @@ describe("when building with the docker builder", () => { async ({ tmpdir }) => { const destination = tmpdir; const drive: DockerDriveConfig = { + buildArgs: [], builder: "docker", context: path.join(__dirname, "fixtures"), dockerfile: path.join(__dirname, "fixtures", "Dockerfile"), @@ -72,6 +75,7 @@ describe("when building with the docker builder", () => { tmpdirTest("should build an ext2 drive", async ({ tmpdir }) => { const destination = tmpdir; const drive: DockerDriveConfig = { + buildArgs: [], builder: "docker", context: path.join(__dirname, "fixtures"), dockerfile: path.join(__dirname, "fixtures", "Dockerfile"), @@ -90,6 +94,7 @@ describe("when building with the docker builder", () => { tmpdirTest.skip("should build a sqfs drive", async ({ tmpdir }) => { const destination = tmpdir; const drive: DockerDriveConfig = { + buildArgs: [], builder: "docker", context: path.join(__dirname, "fixtures"), dockerfile: path.join(__dirname, "fixtures", "Dockerfile"), diff --git a/apps/cli/tests/unit/config.test.ts b/apps/cli/tests/unit/config.test.ts index 1f91b8ee..3376e1ac 100644 --- a/apps/cli/tests/unit/config.test.ts +++ b/apps/cli/tests/unit/config.test.ts @@ -74,6 +74,7 @@ shared = true`); ...defaultConfig(), drives: { root: { + buildArgs: [], builder: "docker", dockerfile: "backend/Dockerfile", context: ".", @@ -123,7 +124,11 @@ shared = true`); `; expect(parse(entrypointConfig)).toEqual({ ...defaultConfig(), - machine: { ...defaultMachineConfig(), noRollup: true, entrypoint: "echo 'Hello, World!'" }, + machine: { + ...defaultMachineConfig(), + noRollup: true, + entrypoint: "echo 'Hello, World!'", + }, }); }); }); From 65bc746a849b7c62f99107499a593343d6cb8127 Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 13:06:17 -0400 Subject: [PATCH 02/11] =?UTF-8?q?feat(cli):=20change=20from=20=E2=80=94app?= =?UTF-8?q?end-entrypoint=20to=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/odd-coins-juggle.md | 5 +++++ apps/cli/src/machine.ts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changeset/odd-coins-juggle.md diff --git a/.changeset/odd-coins-juggle.md b/.changeset/odd-coins-juggle.md new file mode 100644 index 00000000..73669d2c --- /dev/null +++ b/.changeset/odd-coins-juggle.md @@ -0,0 +1,5 @@ +--- +"@cartesi/cli": patch +--- + +change from —append-entrypoint to command diff --git a/apps/cli/src/machine.ts b/apps/cli/src/machine.ts index 20929b4c..3d6452fe 100644 --- a/apps/cli/src/machine.ts +++ b/apps/cli/src/machine.ts @@ -83,7 +83,6 @@ export const bootMachine = async ( ...flashDrives, `--ram-image=${ramImage}`, `--ram-length=${ramLength}`, - `--append-entrypoint=${entrypoint}`, ]; if (assertRollingTemplate) { args.push("--assert-rolling-template"); @@ -109,6 +108,8 @@ export const bootMachine = async ( if (user) { args.push(`--user=${user}`); } + args.push("--"); + args.push(entrypoint); return cartesiMachine.boot(args, { cwd: destination, From 20860eb8ed463b7fdc1226fe5b77c827be71be5e Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 13:21:11 -0400 Subject: [PATCH 03/11] feat(cli): add hidden debug flag to not remove intermediate build files --- .changeset/old-knives-search.md | 5 +++++ apps/cli/src/builder/directory.ts | 5 ++++- apps/cli/src/builder/docker.ts | 7 +++++-- apps/cli/src/commands/build.ts | 19 ++++++++++++++----- .../integration/builder/directory.test.ts | 10 +++++----- .../tests/integration/builder/docker.test.ts | 18 +++++++++--------- 6 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 .changeset/old-knives-search.md diff --git a/.changeset/old-knives-search.md b/.changeset/old-knives-search.md new file mode 100644 index 00000000..93eeb6bb --- /dev/null +++ b/.changeset/old-knives-search.md @@ -0,0 +1,5 @@ +--- +"@cartesi/cli": patch +--- + +add hidden debug flag to not remove intermediate build files diff --git a/apps/cli/src/builder/directory.ts b/apps/cli/src/builder/directory.ts index bfd58dbd..b4e5f40d 100644 --- a/apps/cli/src/builder/directory.ts +++ b/apps/cli/src/builder/directory.ts @@ -8,6 +8,7 @@ export const build = async ( drive: DirectoryDriveConfig, sdkImage: string, destination: string, + debug: boolean, ): Promise => { const filename = `${name}.${drive.format}`; @@ -40,6 +41,8 @@ export const build = async ( } } finally { // delete copied - await fs.remove(dest); + if (!debug) { + await fs.remove(dest); + } } }; diff --git a/apps/cli/src/builder/docker.ts b/apps/cli/src/builder/docker.ts index 8677b030..de7cf4ca 100644 --- a/apps/cli/src/builder/docker.ts +++ b/apps/cli/src/builder/docker.ts @@ -86,6 +86,7 @@ export const build = async ( drive: DockerDriveConfig, sdkImage: string, destination: string, + debug: boolean, ): Promise => { const { format } = drive; @@ -145,8 +146,10 @@ export const build = async ( } } finally { // delete intermediate files - await fs.remove(path.join(destination, ocitar)); - await fs.remove(path.join(destination, tar)); + if (!debug) { + await fs.remove(path.join(destination, ocitar)); + await fs.remove(path.join(destination, tar)); + } } return imageInfo; diff --git a/apps/cli/src/commands/build.ts b/apps/cli/src/commands/build.ts index 979ac472..2eb1e19a 100755 --- a/apps/cli/src/commands/build.ts +++ b/apps/cli/src/commands/build.ts @@ -1,4 +1,4 @@ -import { Command } from "@commander-js/extra-typings"; +import { Command, Option } from "@commander-js/extra-typings"; import fs from "fs-extra"; import path from "node:path"; import tmp from "tmp"; @@ -18,13 +18,14 @@ const buildDrive = async ( drive: DriveConfig, sdkImage: string, destination: string, + debug: boolean, ): Promise => { switch (drive.builder) { case "directory": { - return buildDirectory(name, drive, sdkImage, destination); + return buildDirectory(name, drive, sdkImage, destination, debug); } case "docker": { - return buildDocker(name, drive, sdkImage, destination); + return buildDocker(name, drive, sdkImage, destination, debug); } case "empty": { return buildEmpty(name, drive, sdkImage, destination); @@ -48,8 +49,16 @@ export const createBuildCommand = () => { "path to the configuration file", "cartesi.toml", ) + .addOption( + new Option( + "--debug", + "enable debug mode (do not remove intermediate files)", + ) + .default(false) + .hideHelp(), + ) .option("-d, --drives-only", "only build drives, do not boot machine") - .action(async ({ config, drivesOnly }) => { + .action(async ({ config, debug, drivesOnly }) => { // clean up temp files we create along the process tmp.setGracefulCleanup(); @@ -66,7 +75,7 @@ export const createBuildCommand = () => { const results = Object.entries(c.drives).reduce< Record> >((acc, [name, drive]) => { - acc[name] = buildDrive(name, drive, c.sdk, destination); + acc[name] = buildDrive(name, drive, c.sdk, destination, debug); return acc; }, {}); diff --git a/apps/cli/tests/integration/builder/directory.test.ts b/apps/cli/tests/integration/builder/directory.test.ts index af70fcc7..574d1fa5 100644 --- a/apps/cli/tests/integration/builder/directory.test.ts +++ b/apps/cli/tests/integration/builder/directory.test.ts @@ -20,7 +20,7 @@ describe("when building with the directory builder", () => { format: "ext2", }; await expect( - build("root", drive, image, destination), + build("root", drive, image, destination, false), ).rejects.toThrow("no such file or directory"); }, ); @@ -38,7 +38,7 @@ describe("when building with the directory builder", () => { format: "ext2", }; await expect( - build("root", drive, image, destination), + build("root", drive, image, destination, false), ).rejects.toThrow("too few blocks"); }, ); @@ -55,7 +55,7 @@ describe("when building with the directory builder", () => { extraSize: 1024 * 1024, // 1Mb format: "ext2", }; - await build("root", drive, image, destination); + await build("root", drive, image, destination, false); const filename = path.join(destination, "root.ext2"); const stat = fs.statSync(filename); expect(stat.size).toEqual(1069056); @@ -72,7 +72,7 @@ describe("when building with the directory builder", () => { extraSize: 0, format: "ext2", }; - await build("root", drive, image, destination); + await build("root", drive, image, destination, false); const filename = path.join(destination, "root.ext2"); const stat = fs.statSync(filename); expect(stat.size).toEqual(32768); @@ -89,7 +89,7 @@ describe("when building with the directory builder", () => { extraSize: 0, format: "sqfs", }; - await build("root", drive, image, destination); + await build("root", drive, image, destination, false); const filename = path.join(destination, "root.sqfs"); const stat = fs.statSync(filename); expect(stat.size).toEqual(4096); diff --git a/apps/cli/tests/integration/builder/docker.test.ts b/apps/cli/tests/integration/builder/docker.test.ts index 93c81aba..625580ae 100644 --- a/apps/cli/tests/integration/builder/docker.test.ts +++ b/apps/cli/tests/integration/builder/docker.test.ts @@ -27,9 +27,9 @@ describe("when building with the docker builder", () => { image: undefined, target: undefined, }; - await expect(build("root", drive, image, destination)).rejects.toThrow( - "exit code 1", - ); + await expect( + build("root", drive, image, destination, false), + ).rejects.toThrow("exit code 1"); }); tmpdirTest("should fail a non-riscv image", async ({ tmpdir }) => { @@ -45,9 +45,9 @@ describe("when building with the docker builder", () => { image: "debian:bookworm-slim", target: undefined, }; - await expect(build("root", drive, image, destination)).rejects.toThrow( - "Expected riscv64", - ); + await expect( + build("root", drive, image, destination, false), + ).rejects.toThrow("Expected riscv64"); }); tmpdirTest( @@ -65,7 +65,7 @@ describe("when building with the docker builder", () => { image: undefined, target: "test", }; - await build("root", drive, image, destination); + await build("root", drive, image, destination, false); const filename = path.join(destination, "root.ext2"); const stat = fs.statSync(filename); expect(stat.size).toEqual(85917696); @@ -85,7 +85,7 @@ describe("when building with the docker builder", () => { image: undefined, target: undefined, }; - await build("root", drive, image, destination); + await build("root", drive, image, destination, false); const filename = path.join(destination, "root.ext2"); const stat = fs.statSync(filename); expect(stat.size).toEqual(85917696); @@ -104,7 +104,7 @@ describe("when building with the docker builder", () => { image: undefined, target: undefined, }; - await build("root", drive, image, destination); + await build("root", drive, image, destination, false); const filename = path.join(destination, "root.sqfs"); const stat = fs.statSync(filename); expect(stat.size).toEqual(29327360); From 076ff95ef64d4cb1cd99bd28bcc3dd5528f1f1b8 Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 14:25:36 -0400 Subject: [PATCH 04/11] feat(cli): remove unused image argument from shell command --- .changeset/good-colts-remain.md | 5 +++++ apps/cli/src/commands/shell.ts | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .changeset/good-colts-remain.md diff --git a/.changeset/good-colts-remain.md b/.changeset/good-colts-remain.md new file mode 100644 index 00000000..67273447 --- /dev/null +++ b/.changeset/good-colts-remain.md @@ -0,0 +1,5 @@ +--- +"@cartesi/cli": patch +--- + +remove unused image argument from shell command diff --git a/apps/cli/src/commands/shell.ts b/apps/cli/src/commands/shell.ts index 43bcfb1d..4df12916 100755 --- a/apps/cli/src/commands/shell.ts +++ b/apps/cli/src/commands/shell.ts @@ -7,7 +7,6 @@ import { bootMachine } from "../machine.js"; export const createShellCommand = () => { return new Command("shell") - .argument("[image]", "image ID|name") .option("--command ", "shell command to run", "/bin/sh") .option( "-c, --config ", @@ -15,7 +14,7 @@ export const createShellCommand = () => { "cartesi.toml", ) .option("--run-as-root", "run as root user", false) - .action(async (image, { command, config, runAsRoot }) => { + .action(async ({ command, config, runAsRoot }) => { // get application configuration from 'cartesi.toml' const c = getApplicationConfig(config); From 59c1c5430e69ad6adbe6caba4a526d71ee5579cd Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 14:28:36 -0400 Subject: [PATCH 05/11] =?UTF-8?q?feat(cli):=20add=20missing=20=E2=80=9Cunt?= =?UTF-8?q?il=E2=80=9D=20usage=20at=20logs=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/shaky-plants-live.md | 5 +++++ apps/cli/src/commands/logs.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/shaky-plants-live.md diff --git a/.changeset/shaky-plants-live.md b/.changeset/shaky-plants-live.md new file mode 100644 index 00000000..6dce69ba --- /dev/null +++ b/.changeset/shaky-plants-live.md @@ -0,0 +1,5 @@ +--- +"@cartesi/cli": patch +--- + +add missing "until" usage at logs command diff --git a/apps/cli/src/commands/logs.ts b/apps/cli/src/commands/logs.ts index 6da987be..062b86a7 100644 --- a/apps/cli/src/commands/logs.ts +++ b/apps/cli/src/commands/logs.ts @@ -33,6 +33,7 @@ export const createLogsCommand = () => { if (color === false) logOptions.push("--no-color"); if (since) logOptions.push("--since", since); if (tail) logOptions.push("--tail", tail); + if (until) logOptions.push("--until", until); await execa( "docker", [ From cf62504924fd2b008948d5a09c1ed837a5781e42 Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 14:31:19 -0400 Subject: [PATCH 06/11] lint(cli): remove unused error from catch blocks --- apps/cli/src/builder/docker.ts | 2 +- apps/cli/src/commands/send.ts | 2 +- apps/cli/src/exec/cartesi-machine.ts | 2 +- apps/cli/src/exec/rollups.ts | 2 +- apps/cli/src/prompts.ts | 4 ++-- apps/cli/src/wallet.ts | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/cli/src/builder/docker.ts b/apps/cli/src/builder/docker.ts index de7cf4ca..76739372 100644 --- a/apps/cli/src/builder/docker.ts +++ b/apps/cli/src/builder/docker.ts @@ -101,7 +101,7 @@ export const build = async ( image = drive.image; try { imageInfo = await getImageInfo(image); - } catch (error) { + } catch { await execa("docker", ["image", "pull", image]); imageInfo = await getImageInfo(image); } diff --git a/apps/cli/src/commands/send.ts b/apps/cli/src/commands/send.ts index a1549b80..ddad60a9 100755 --- a/apps/cli/src/commands/send.ts +++ b/apps/cli/src/commands/send.ts @@ -63,7 +63,7 @@ const getInput = async ( case "uint256": try { return BigInt(v); - } catch (e) { + } catch { throw new Error(`Invalid uint value: ${v}`); } case "bytes": diff --git a/apps/cli/src/exec/cartesi-machine.ts b/apps/cli/src/exec/cartesi-machine.ts index ce8c3474..5d7dda6c 100644 --- a/apps/cli/src/exec/cartesi-machine.ts +++ b/apps/cli/src/exec/cartesi-machine.ts @@ -29,7 +29,7 @@ export const version = async ( return parse(output.version); } return null; - } catch (e: unknown) { + } catch { return null; } }; diff --git a/apps/cli/src/exec/rollups.ts b/apps/cli/src/exec/rollups.ts index 8ec7c15b..d63a6254 100644 --- a/apps/cli/src/exec/rollups.ts +++ b/apps/cli/src/exec/rollups.ts @@ -66,7 +66,7 @@ export const getDeployments = async ( "list", ]); return JSON.parse(stdout).map(parseDeployment); - } catch (e: unknown) { + } catch { return []; } }; diff --git a/apps/cli/src/prompts.ts b/apps/cli/src/prompts.ts index 4936fb07..145e2355 100644 --- a/apps/cli/src/prompts.ts +++ b/apps/cli/src/prompts.ts @@ -145,7 +145,7 @@ export const abiParamsInput = async ( try { parseAbiParameters(value); return true; - } catch (e) { + } catch { return "Invalid ABI parameters"; } }, @@ -177,7 +177,7 @@ export const abiParamsInput = async ( try { BigInt(value); return true; - } catch (e) { + } catch { return "Invalid number"; } }, diff --git a/apps/cli/src/wallet.ts b/apps/cli/src/wallet.ts index fac6ddf8..560cbba0 100644 --- a/apps/cli/src/wallet.ts +++ b/apps/cli/src/wallet.ts @@ -29,7 +29,7 @@ const getRpcUrl = async (options: { const projectName = getProjectName(options); const host = await getProjectPort({ projectName }); return `http://${host}/anvil`; - } catch (e) { + } catch { return await input({ message: "RPC URL", default: `http://127.0.0.1:${PREFERRED_PORT}/anvil`, From 11f5bd7d4b87747d39ee4c10a84579513e5a7a81 Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 14:32:13 -0400 Subject: [PATCH 07/11] lint(cli): remove unused vars --- apps/cli/src/commands/deposit.ts | 2 +- apps/cli/src/commands/logs.ts | 2 +- apps/cli/src/commands/send.ts | 2 +- apps/cli/src/prompts.ts | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/cli/src/commands/deposit.ts b/apps/cli/src/commands/deposit.ts index ef6fe303..d5b117e0 100644 --- a/apps/cli/src/commands/deposit.ts +++ b/apps/cli/src/commands/deposit.ts @@ -15,7 +15,7 @@ export const createDepositCommand = () => { "name of project (used by docker compose and cartesi-rollups-node)", ) .option("--rpc-url ", "RPC URL of the Cartesi Devnet") - .action(async (options, command) => { + .action(async (_options, command) => { // get registered subcommands const commands = command.commands; diff --git a/apps/cli/src/commands/logs.ts b/apps/cli/src/commands/logs.ts index 062b86a7..74e2dc3e 100644 --- a/apps/cli/src/commands/logs.ts +++ b/apps/cli/src/commands/logs.ts @@ -25,7 +25,7 @@ export const createLogsCommand = () => { "Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)", ) .configureHelp({ showGlobalOptions: true }) - .action(async (options, command) => { + .action(async (options) => { const { follow, color, since, tail, until } = options; const projectName = getProjectName(options); const logOptions: string[] = ["--no-log-prefix"]; diff --git a/apps/cli/src/commands/send.ts b/apps/cli/src/commands/send.ts index ddad60a9..e450c6b8 100755 --- a/apps/cli/src/commands/send.ts +++ b/apps/cli/src/commands/send.ts @@ -116,7 +116,7 @@ export const createSendCommand = () => { "name of project (used by docker compose and cartesi-rollups-node)", ) .option("--rpc-url ", "RPC URL of the Cartesi Devnet") - .action(async (input, options, program) => { + .action(async (input, options) => { const { application, from } = options; const projectName = getProjectName(options); diff --git a/apps/cli/src/prompts.ts b/apps/cli/src/prompts.ts index 145e2355..20a51078 100644 --- a/apps/cli/src/prompts.ts +++ b/apps/cli/src/prompts.ts @@ -226,7 +226,6 @@ export const selectAuto = ( const list = config.discardDisabled ? choices.filter((c) => !(c instanceof Separator) && !c.disabled) : choices; - const a = choices.filter((c) => c.type !== "separator"); if (list.length === 1) { const choice = list[0]; From 9d2f81089346558afbd8f6e8d4b35c4ca5707d47 Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 14:54:17 -0400 Subject: [PATCH 08/11] lint(cli): fix some lint errors --- apps/cli/src/commands/deposit/erc20.ts | 5 ++--- apps/cli/src/commands/deposit/erc721.ts | 5 ++--- apps/cli/src/commands/deposit/ether.ts | 3 +-- apps/cli/src/commands/run.ts | 4 ++-- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/apps/cli/src/commands/deposit/erc20.ts b/apps/cli/src/commands/deposit/erc20.ts index 61b6ed8d..11cd4e63 100755 --- a/apps/cli/src/commands/deposit/erc20.ts +++ b/apps/cli/src/commands/deposit/erc20.ts @@ -3,13 +3,13 @@ import chalk from "chalk"; import ora from "ora"; import { type Address, + type PublicClient, erc20Abi, formatUnits, getAddress, isAddress, isHex, parseUnits, - type PublicClient, } from "viem"; import { getProjectName } from "../../base.js"; import { @@ -75,8 +75,7 @@ const parseToken = async (options: { }; export const createErc20Command = () => { - // biome-ignore lint/complexity/noBannedTypes: commander pattern - return new Command<[], {}, DepositCommandOpts>("erc20") + return new Command<[], Record, DepositCommandOpts>("erc20") .description("Deposit ERC-20 to the application") .configureHelp({ showGlobalOptions: true }) .argument("[amount]", "amount to send") diff --git a/apps/cli/src/commands/deposit/erc721.ts b/apps/cli/src/commands/deposit/erc721.ts index b3c50c07..412ee6c6 100755 --- a/apps/cli/src/commands/deposit/erc721.ts +++ b/apps/cli/src/commands/deposit/erc721.ts @@ -5,11 +5,11 @@ import { type Address, BaseError, ContractFunctionRevertedError, + type PublicClient, erc721Abi, getAddress, isAddress, isHex, - type PublicClient, } from "viem"; import { getProjectName } from "../../base.js"; import { @@ -70,8 +70,7 @@ const parseToken = async (options: { }; export const createErc721Command = () => { - // biome-ignore lint/complexity/noBannedTypes: commander pattern - return new Command<[], {}, DepositCommandOpts>("erc721") + return new Command<[], Record, DepositCommandOpts>("erc721") .description("Deposit ERC-721 to the application") .configureHelp({ showGlobalOptions: true }) .argument("[token-id]", "token ID") diff --git a/apps/cli/src/commands/deposit/ether.ts b/apps/cli/src/commands/deposit/ether.ts index 9a44f2fb..2b0bf6c7 100755 --- a/apps/cli/src/commands/deposit/ether.ts +++ b/apps/cli/src/commands/deposit/ether.ts @@ -9,8 +9,7 @@ import { connect } from "../../wallet.js"; import type { DepositCommandOpts } from "../deposit.js"; export const createEtherCommand = () => { - // biome-ignore lint/complexity/noBannedTypes: commander pattern - return new Command<[], {}, DepositCommandOpts>("ether") + return new Command<[], Record, DepositCommandOpts>("ether") .description("Deposit ether to the application") .configureHelp({ showGlobalOptions: true }) .argument("[amount]", "amount, in ETH units") diff --git a/apps/cli/src/commands/run.ts b/apps/cli/src/commands/run.ts index 2fc9bf3e..76823aa9 100755 --- a/apps/cli/src/commands/run.ts +++ b/apps/cli/src/commands/run.ts @@ -13,9 +13,9 @@ import { getMachineHash, getProjectName } from "../base.js"; import { DEFAULT_SDK_VERSION, PREFERRED_PORT } from "../config.js"; import { AVAILABLE_SERVICES, + type RollupsDeployment, deployApplication, removeApplication, - type RollupsDeployment, startEnvironment, stopEnvironment, waitHealthyEnvironment, @@ -33,7 +33,7 @@ const shell = async (options: { const { build, epochLength, log, projectName } = options; // keep track of last deployment - let lastDeployment: RollupsDeployment | undefined = undefined; + let lastDeployment: RollupsDeployment | undefined; let salt = 0; // deploy for the first time From 5eb9b8f748c986cae8bf68942b7c9e01010f6914 Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 14:55:21 -0400 Subject: [PATCH 09/11] fix(cli): fix amount display in erc20 deposit --- .changeset/ten-beers-glow.md | 5 +++++ apps/cli/src/commands/deposit/erc20.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/ten-beers-glow.md diff --git a/.changeset/ten-beers-glow.md b/.changeset/ten-beers-glow.md new file mode 100644 index 00000000..99f31dc8 --- /dev/null +++ b/.changeset/ten-beers-glow.md @@ -0,0 +1,5 @@ +--- +"@cartesi/cli": patch +--- + +fix amount display in erc20 deposit diff --git a/apps/cli/src/commands/deposit/erc20.ts b/apps/cli/src/commands/deposit/erc20.ts index 11cd4e63..7b2c8f49 100755 --- a/apps/cli/src/commands/deposit/erc20.ts +++ b/apps/cli/src/commands/deposit/erc20.ts @@ -146,7 +146,7 @@ export const createErc20Command = () => { // approve if needed if (allowance < amount) { - progress.start(`Approving ${amountStr}...`); + progress.start(`Approving ${amountLabel}...`); const { request } = await testClient.simulateContract({ abi: erc20Abi, account, @@ -156,7 +156,7 @@ export const createErc20Command = () => { }); const hash = await testClient.writeContract(request); await testClient.waitForTransactionReceipt({ hash }); - progress.succeed(`Approved ${amountStr}`); + progress.succeed(`Approved ${amountLabel}`); } // simulate deposit call From 88e06c703cb465f8715e20c8d73546c422879375 Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Wed, 16 Jul 2025 15:01:53 -0400 Subject: [PATCH 10/11] chore: bump biome --- apps/cli/biome.json | 2 +- biome.json | 12 ++++--- package.json | 3 +- pnpm-lock.yaml | 81 +++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 2 +- 5 files changed, 54 insertions(+), 46 deletions(-) diff --git a/apps/cli/biome.json b/apps/cli/biome.json index c75d2b82..9a4374fc 100644 --- a/apps/cli/biome.json +++ b/apps/cli/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json", "extends": ["../../biome.json"], "linter": { "rules": { diff --git a/biome.json b/biome.json index 6bed27eb..4d1a6890 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,12 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json", + "assist": { + "actions": { + "source": { + "organizeImports": "off" + } + } + }, "formatter": { "enabled": false }, @@ -8,8 +15,5 @@ "rules": { "recommended": true } - }, - "organizeImports": { - "enabled": true } } diff --git a/package.json b/package.json index fb5107e9..d75acf0d 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "test": "turbo test" }, "devDependencies": { + "@biomejs/biome": "catalog:", "@changesets/cli": "^2.29.4", "prettier": "^3.5.3", "turbo": "^2.5.4" @@ -21,5 +22,5 @@ "engines": { "node": ">=20.0.0" }, - "packageManager": "pnpm@10.12.2" + "packageManager": "pnpm@10.13.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a7d51a4..b11bb8e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,13 +7,16 @@ settings: catalogs: default: '@biomejs/biome': - specifier: ^1.9.4 - version: 1.9.4 + specifier: ^2.1.2 + version: 2.1.2 importers: .: devDependencies: + '@biomejs/biome': + specifier: 'catalog:' + version: 2.1.2 '@changesets/cli': specifier: ^2.29.4 version: 2.29.4 @@ -101,7 +104,7 @@ importers: devDependencies: '@biomejs/biome': specifier: 'catalog:' - version: 1.9.4 + version: 2.1.2 '@cartesi/devnet': specifier: 2.0.0-alpha.7 version: 2.0.0-alpha.7 @@ -312,55 +315,55 @@ packages: resolution: {integrity: sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==} engines: {node: '>=6.9.0'} - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + '@biomejs/biome@2.1.2': + resolution: {integrity: sha512-yq8ZZuKuBVDgAS76LWCfFKHSYIAgqkxVB3mGVVpOe2vSkUTs7xG46zXZeNPRNVjiJuw0SZ3+J2rXiYx0RUpfGg==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + '@biomejs/cli-darwin-arm64@2.1.2': + resolution: {integrity: sha512-leFAks64PEIjc7MY/cLjE8u5OcfBKkcDB0szxsWUB4aDfemBep1WVKt0qrEyqZBOW8LPHzrFMyDl3FhuuA0E7g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + '@biomejs/cli-darwin-x64@2.1.2': + resolution: {integrity: sha512-Nmmv7wRX5Nj7lGmz0FjnWdflJg4zii8Ivruas6PBKzw5SJX/q+Zh2RfnO+bBnuKLXpj8kiI2x2X12otpH6a32A==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + '@biomejs/cli-linux-arm64-musl@2.1.2': + resolution: {integrity: sha512-qgHvafhjH7Oca114FdOScmIKf1DlXT1LqbOrrbR30kQDLFPEOpBG0uzx6MhmsrmhGiCFCr2obDamu+czk+X0HQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + '@biomejs/cli-linux-arm64@2.1.2': + resolution: {integrity: sha512-NWNy2Diocav61HZiv2enTQykbPP/KrA/baS7JsLSojC7Xxh2nl9IczuvE5UID7+ksRy2e7yH7klm/WkA72G1dw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + '@biomejs/cli-linux-x64-musl@2.1.2': + resolution: {integrity: sha512-xlB3mU14ZUa3wzLtXfmk2IMOGL+S0aHFhSix/nssWS/2XlD27q+S6f0dlQ8WOCbYoXcuz8BCM7rCn2lxdTrlQA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + '@biomejs/cli-linux-x64@2.1.2': + resolution: {integrity: sha512-Km/UYeVowygTjpX6sGBzlizjakLoMQkxWbruVZSNE6osuSI63i4uCeIL+6q2AJlD3dxoiBJX70dn1enjQnQqwA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + '@biomejs/cli-win32-arm64@2.1.2': + resolution: {integrity: sha512-G8KWZli5ASOXA3yUQgx+M4pZRv3ND16h77UsdunUL17uYpcL/UC7RkWTdkfvMQvogVsAuz5JUcBDjgZHXxlKoA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + '@biomejs/cli-win32-x64@2.1.2': + resolution: {integrity: sha512-9zajnk59PMpjBkty3bK2IrjUsUHvqe9HWwyAWQBjGLE7MIBjbX2vwv1XPEhmO2RRuGoTkVx3WCanHrjAytICLA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -4127,39 +4130,39 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@biomejs/biome@1.9.4': + '@biomejs/biome@2.1.2': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 - - '@biomejs/cli-darwin-arm64@1.9.4': + '@biomejs/cli-darwin-arm64': 2.1.2 + '@biomejs/cli-darwin-x64': 2.1.2 + '@biomejs/cli-linux-arm64': 2.1.2 + '@biomejs/cli-linux-arm64-musl': 2.1.2 + '@biomejs/cli-linux-x64': 2.1.2 + '@biomejs/cli-linux-x64-musl': 2.1.2 + '@biomejs/cli-win32-arm64': 2.1.2 + '@biomejs/cli-win32-x64': 2.1.2 + + '@biomejs/cli-darwin-arm64@2.1.2': optional: true - '@biomejs/cli-darwin-x64@1.9.4': + '@biomejs/cli-darwin-x64@2.1.2': optional: true - '@biomejs/cli-linux-arm64-musl@1.9.4': + '@biomejs/cli-linux-arm64-musl@2.1.2': optional: true - '@biomejs/cli-linux-arm64@1.9.4': + '@biomejs/cli-linux-arm64@2.1.2': optional: true - '@biomejs/cli-linux-x64-musl@1.9.4': + '@biomejs/cli-linux-x64-musl@2.1.2': optional: true - '@biomejs/cli-linux-x64@1.9.4': + '@biomejs/cli-linux-x64@2.1.2': optional: true - '@biomejs/cli-win32-arm64@1.9.4': + '@biomejs/cli-win32-arm64@2.1.2': optional: true - '@biomejs/cli-win32-x64@1.9.4': + '@biomejs/cli-win32-x64@2.1.2': optional: true '@cartesi/devnet@2.0.0-alpha.7': {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f9bd564e..75ce844a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,7 +3,7 @@ packages: - packages/* catalog: - "@biomejs/biome": ^1.9.4 + "@biomejs/biome": ^2.1.2 onlyBuiltDependencies: - "@biomejs/biome" From c6c8705801c46317079e86c85640b4b611b655fa Mon Sep 17 00:00:00 2001 From: Danilo Tuler Date: Fri, 18 Jul 2025 09:57:58 -0400 Subject: [PATCH 11/11] chore: configure vscode --- .vscode/settings.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index f546e78b..b964237c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,8 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.codeActionsOnSave": { "source.organizeImports": "explicit" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" } }