From f78f090d5d93075a876f486ef4e057ea019cf6ed Mon Sep 17 00:00:00 2001 From: Mehdi Asadli Date: Tue, 10 Feb 2026 09:47:15 +0400 Subject: [PATCH 1/5] feat: add cli --- src/cli.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/cli.ts diff --git a/src/cli.ts b/src/cli.ts new file mode 100644 index 0000000..9bf92f4 --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,43 @@ +import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { Interpreter } from "./interpreter"; +import { Lexer } from "./lexer"; +import { Parser } from "./parser"; + +function main(): void { + const args = process.argv.slice(2); + + if (args.length === 0) { + console.error("Usage: pushkin "); + process.exit(1); + } + + const filePath = resolve(args[0] as string); + + if (!filePath.endsWith(".push")) { + console.error("Error: File must have a .push extension"); + process.exit(1); + } + + let source: string; + + try { + source = readFileSync(filePath, "utf-8"); + } catch { + console.error(`Error: Could not read file '${filePath}'`); + process.exit(1); + } + + try { + const tokens = new Lexer(source).tokenize(); + const ast = new Parser(tokens).parse(); + new Interpreter().run(ast); + } catch (error) { + if (error instanceof Error) { + console.error(`Error: ${error.message}`); + } + process.exit(1); + } +} + +main(); From 7c6c2a10e5f676e2e35e0aaa3883fa57fe16d29d Mon Sep 17 00:00:00 2001 From: Mehdi Asadli Date: Tue, 10 Feb 2026 09:47:35 +0400 Subject: [PATCH 2/5] chore: update tsup --- tsup.config.ts | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/tsup.config.ts b/tsup.config.ts index e86ac85..0ed5984 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,9 +1,20 @@ import { defineConfig } from "tsup"; -export default defineConfig({ - entry: ["src/index.ts"], - format: ["esm", "cjs"], - dts: true, - clean: true, - target: "esnext", -}); +export default defineConfig([ + { + entry: ["src/index.ts"], + format: ["esm", "cjs"], + dts: true, + clean: true, + target: "esnext", + }, + { + entry: ["src/cli.ts"], + format: ["esm", "cjs"], + clean: false, + target: "esnext", + banner: { + js: "#!/usr/bin/env node", + }, + }, +]); From 0eb8f1d806d667b2eaeebdc18160c08fbbf94907 Mon Sep 17 00:00:00 2001 From: Mehdi Asadli Date: Tue, 10 Feb 2026 09:47:52 +0400 Subject: [PATCH 3/5] chore: add bin to package --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 088063a..a4e9625 100644 --- a/package.json +++ b/package.json @@ -57,5 +57,8 @@ "biome check --write ." ] }, - "type": "module" + "type": "module", + "bin": { + "pushkin": "dist/cli.js" + } } From 5fc1782ce8dd5cf801fee2246e019c80e3aa74c9 Mon Sep 17 00:00:00 2001 From: Mehdi Asadli Date: Tue, 10 Feb 2026 09:49:54 +0400 Subject: [PATCH 4/5] fix: remove hello example --- examples/hello.push | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 examples/hello.push diff --git a/examples/hello.push b/examples/hello.push deleted file mode 100644 index 926638d..0000000 --- a/examples/hello.push +++ /dev/null @@ -1,3 +0,0 @@ -// your first Pushkin program -// logs "Hello, World!" to the console -print("Hello, World!"); \ No newline at end of file From f73d0c2f7f754f75188b073bdf3dfaa6cf72d3b8 Mon Sep 17 00:00:00 2001 From: Mehdi Asadli Date: Tue, 10 Feb 2026 09:50:15 +0400 Subject: [PATCH 5/5] chore: add changeset --- .changeset/short-kids-decide.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/short-kids-decide.md diff --git a/.changeset/short-kids-decide.md b/.changeset/short-kids-decide.md new file mode 100644 index 0000000..c24cfce --- /dev/null +++ b/.changeset/short-kids-decide.md @@ -0,0 +1,5 @@ +--- +"@asmelabs/pushkin": minor +--- + +Add CLI to run .push files via pushkin command