@routecraft/cli 0.5.0-canary.4 → 0.5.0-canary.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- var[a,p]=process.version.slice(1).split(".").map(Number);a>18||a===18&&p>=19||(console.error(`[routecraft] Node.js ${process.version} is not supported. Routecraft requires Node.js 18.19.0 or later (e.g. 20 or 22). Please upgrade Node or configure your MCP client to use a newer Node.`),process.exit(1));var m=process.argv.slice(2).some(e=>!e.startsWith("-")&&e.endsWith(".ts"));if(m&&!process.env.CRAFT_TSX_LOADER){let{execFileSync:e}=await import('child_process'),{createRequire:t}=await import('module'),r=t(import.meta.url).resolve("tsx/esm");process.on("SIGINT",()=>{}),process.on("SIGTERM",()=>{});try{e(process.execPath,["--import",r,...process.execArgv,process.argv[1],...process.argv.slice(2)],{stdio:"inherit",env:{...process.env,CRAFT_TSX_LOADER:"1"}}),process.exit(0);}catch(o){process.exit(o.status??1);}}var{Command:d}=await import('commander'),s=new d;s.name("craft").description("A modern routing framework for TypeScript").version("0.5.0-canary.4").enablePositionalOptions().option("--log-level <level>","Log level (e.g. info, warn, error, silent to disable)").option("--log-file <path>","Write logs to a file (keeps stdout clear for MCP stdio)").showSuggestionAfterError().showHelpAfterError().exitOverride(e=>{e.code==="commander.unknownCommand"&&process.exit(0);});process.argv.length<=2&&s.help({error:false});s.command("run").description("Run routes from a single TypeScript/JavaScript file").argument("<file>","Path to a file containing routes").argument("[args...]","CLI command and flags to pass through to CLI adapter routes").option("--env <path>","Load environment variables from a .env file (default: .env)").passThroughOptions().action(async(e,t,r)=>{let o=s.opts();o.logLevel!==void 0&&(process.env.LOG_LEVEL=o.logLevel,process.env.CRAFT_LOG_LEVEL=o.logLevel),o.logFile!==void 0&&(process.env.LOG_FILE=o.logFile,process.env.CRAFT_LOG_FILE=o.logFile);let{loadEnvFile:n}=await import('./util-GX4G3K5I.js');r.env!==void 0?n(r.env):n();let{runCommand:c}=await import('./run-3Y3G7OTJ.js'),i=await c(e,t);if(!i.success){i.message&&console.error(i.message);let l=i.code??1;setImmediate(()=>process.exit(l));return}});s.command("tui").description("Launch the Terminal UI to monitor Routecraft execution history").option("--db <path>","Path to the telemetry SQLite database",".routecraft/telemetry.db").action(async e=>{let{resolve:t,isAbsolute:r}=await import('path'),o=r(e.db)?e.db:t(process.cwd(),e.db),{renderTui:n}=await import('./tui/app.js');await n(o);});s.parse();//# sourceMappingURL=index.js.map
2
+ var[a,p]=process.version.slice(1).split(".").map(Number);a>18||a===18&&p>=19||(console.error(`[routecraft] Node.js ${process.version} is not supported. Routecraft requires Node.js 18.19.0 or later (e.g. 20 or 22). Please upgrade Node or configure your MCP client to use a newer Node.`),process.exit(1));var m=process.argv.slice(2).some(e=>!e.startsWith("-")&&e.endsWith(".ts"));if(m&&!process.env.CRAFT_TSX_LOADER){let{execFileSync:e}=await import('child_process'),{createRequire:t}=await import('module'),r=t(import.meta.url).resolve("tsx/esm");process.on("SIGINT",()=>{}),process.on("SIGTERM",()=>{});try{e(process.execPath,["--import",r,...process.execArgv,process.argv[1],...process.argv.slice(2)],{stdio:"inherit",env:{...process.env,CRAFT_TSX_LOADER:"1"}}),process.exit(0);}catch(o){process.exit(o.status??1);}}var{Command:d}=await import('commander'),s=new d;s.name("craft").description("A modern routing framework for TypeScript").version("0.5.0-canary.6").enablePositionalOptions().option("--log-level <level>","Log level (e.g. info, warn, error, silent to disable)").option("--log-file <path>","Write logs to a file (keeps stdout clear for MCP stdio)").showSuggestionAfterError().showHelpAfterError().exitOverride(e=>{e.code==="commander.unknownCommand"&&process.exit(0);});process.argv.length<=2&&s.help({error:false});s.command("run").description("Run routes from a single TypeScript/JavaScript file").argument("<file>","Path to a file containing routes").argument("[args...]","CLI command and flags to pass through to CLI adapter routes").option("--env <path>","Load environment variables from a .env file (default: .env)").passThroughOptions().action(async(e,t,r)=>{let o=s.opts();o.logLevel!==void 0&&(process.env.LOG_LEVEL=o.logLevel,process.env.CRAFT_LOG_LEVEL=o.logLevel),o.logFile!==void 0&&(process.env.LOG_FILE=o.logFile,process.env.CRAFT_LOG_FILE=o.logFile);let{loadEnvFile:n}=await import('./util-GX4G3K5I.js');r.env!==void 0?n(r.env):n();let{runCommand:c}=await import('./run-3Y3G7OTJ.js'),i=await c(e,t);if(!i.success){i.message&&console.error(i.message);let l=i.code??1;setImmediate(()=>process.exit(l));return}});s.command("tui").description("Launch the Terminal UI to monitor Routecraft execution history").option("--db <path>","Path to the telemetry SQLite database",".routecraft/telemetry.db").action(async e=>{let{resolve:t,isAbsolute:r}=await import('path'),o=r(e.db)?e.db:t(process.cwd(),e.db),{renderTui:n}=await import('./tui/app.js');await n(o);});s.parse();//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["major","minor","hasTSFile","arg","execFileSync","createRequire","tsxEsmPath","err","Command","program","filePath","args","options","globalOpts","loadEnvFile","runCommand","result","code","resolve","isAbsolute","dbPath","renderTui"],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\n\n/**\n * Routecraft CLI — single entry point.\n *\n * 1. Check Node version (Pino 10 needs Node 18.19+)\n * 2. Define program and parse; log options are global and applied before lazy-loading run/util (which load the logger)\n */\n\n// ── 1. Node version gate ────────────────────────────────────────────\nconst [major, minor] = process.version.slice(1).split(\".\").map(Number) as [\n number,\n number,\n];\n\nif (!(major > 18 || (major === 18 && minor >= 19))) {\n // eslint-disable-next-line no-console\n console.error(\n `[routecraft] Node.js ${process.version} is not supported. ` +\n `Routecraft requires Node.js 18.19.0 or later (e.g. 20 or 22). ` +\n `Please upgrade Node or configure your MCP client to use a newer Node.`,\n );\n process.exit(1);\n}\n\n// ── 2. Re-exec with tsx loader if a .ts file is being run ───────────────────\n// Node's native --experimental-strip-types does not handle extensionless\n// imports or .js-to-.ts resolution. tsx (via --import tsx/esm) does.\n// We set CRAFT_TSX_LOADER=1 before re-execing to avoid an infinite loop.\nconst hasTSFile = process.argv\n .slice(2)\n .some((arg) => !arg.startsWith(\"-\") && arg.endsWith(\".ts\"));\n\nif (hasTSFile && !process.env[\"CRAFT_TSX_LOADER\"]) {\n const { execFileSync } = await import(\"node:child_process\");\n const { createRequire } = await import(\"node:module\");\n // Resolve tsx/esm relative to the CLI package so it works regardless of CWD\n const tsxEsmPath = createRequire(import.meta.url).resolve(\"tsx/esm\");\n\n // Let the child handle SIGINT/SIGTERM for graceful shutdown.\n // Without this the parent dies on the first signal, orphaning the child\n // mid-teardown (connections not closed, logs truncated).\n process.on(\"SIGINT\", () => {});\n process.on(\"SIGTERM\", () => {});\n\n try {\n execFileSync(\n process.execPath,\n [\n \"--import\",\n tsxEsmPath,\n ...process.execArgv,\n process.argv[1]!,\n ...process.argv.slice(2),\n ],\n { stdio: \"inherit\", env: { ...process.env, CRAFT_TSX_LOADER: \"1\" } },\n );\n process.exit(0);\n } catch (err: unknown) {\n process.exit(\n (err as NodeJS.ErrnoException & { status?: number }).status ?? 1,\n );\n }\n}\n\n// ── 3. CLI definition (only Commander; run/util are lazy-loaded so logger sees env) ─\nconst { Command } = await import(\"commander\");\nconst program = new Command();\n\nprogram\n .name(\"craft\")\n .description(\"A modern routing framework for TypeScript\")\n .version(\"0.5.0-canary.4\")\n .enablePositionalOptions()\n .option(\n \"--log-level <level>\",\n \"Log level (e.g. info, warn, error, silent to disable)\",\n )\n .option(\n \"--log-file <path>\",\n \"Write logs to a file (keeps stdout clear for MCP stdio)\",\n )\n .showSuggestionAfterError()\n .showHelpAfterError()\n .exitOverride((err) => {\n if (err.code === \"commander.unknownCommand\") {\n process.exit(0);\n }\n });\n\n// Show help by default if no arguments provided\nif (process.argv.length <= 2) {\n program.help({ error: false });\n}\n\n/**\n * The 'run' command executes routes from a single file.\n *\n * Example:\n * craft run ./my-routes.ts\n * craft run ./my-cli.ts greet --name World\n */\nprogram\n .command(\"run\")\n .description(\"Run routes from a single TypeScript/JavaScript file\")\n .argument(\"<file>\", \"Path to a file containing routes\")\n .argument(\n \"[args...]\",\n \"CLI command and flags to pass through to CLI adapter routes\",\n )\n .option(\n \"--env <path>\",\n \"Load environment variables from a .env file (default: .env)\",\n )\n .passThroughOptions()\n .action(async (filePath, args: string[], options) => {\n // Apply global log options to env before any import that creates the logger\n const globalOpts = program.opts();\n if (globalOpts[\"logLevel\"] !== undefined) {\n process.env[\"LOG_LEVEL\"] = globalOpts[\"logLevel\"];\n process.env[\"CRAFT_LOG_LEVEL\"] = globalOpts[\"logLevel\"];\n }\n if (globalOpts[\"logFile\"] !== undefined) {\n process.env[\"LOG_FILE\"] = globalOpts[\"logFile\"];\n process.env[\"CRAFT_LOG_FILE\"] = globalOpts[\"logFile\"];\n }\n\n const { loadEnvFile } = await import(\"./util.js\");\n if (options.env !== undefined) {\n loadEnvFile(options.env);\n } else {\n loadEnvFile();\n }\n\n const { runCommand } = await import(\"./run.js\");\n const result = await runCommand(filePath, args);\n if (!result.success) {\n if (result.message) {\n // eslint-disable-next-line no-console\n console.error(result.message);\n }\n // Defer exit so pino/sonic-boom can finish initializing and avoid \"sonic boom is not ready yet\"\n const code = result.code ?? 1;\n setImmediate(() => process.exit(code));\n return;\n }\n // Don't call process.exit() — let the event loop drain naturally.\n // process.exit() triggers C++ static destructors that race with ONNX\n // Runtime cleanup (onnxruntime#25038: \"mutex lock failed\").\n });\n\n/**\n * The 'tui' command launches the Terminal UI for monitoring Routecraft execution.\n *\n * Example:\n * craft tui\n * craft tui --db .routecraft/telemetry.db\n */\nprogram\n .command(\"tui\")\n .description(\"Launch the Terminal UI to monitor Routecraft execution history\")\n .option(\n \"--db <path>\",\n \"Path to the telemetry SQLite database\",\n \".routecraft/telemetry.db\",\n )\n .action(async (options) => {\n const { resolve, isAbsolute } = await import(\"node:path\");\n const dbPath = isAbsolute(options.db)\n ? options.db\n : resolve(process.cwd(), options.db);\n\n const { renderTui } = await import(\"./tui/app.js\");\n await renderTui(dbPath);\n });\n\n// Parse the command line arguments and execute the appropriate command\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["major","minor","hasTSFile","arg","execFileSync","createRequire","tsxEsmPath","err","Command","program","filePath","args","options","globalOpts","loadEnvFile","runCommand","result","code","resolve","isAbsolute","dbPath","renderTui"],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\n\n/**\n * Routecraft CLI — single entry point.\n *\n * 1. Check Node version (Pino 10 needs Node 18.19+)\n * 2. Define program and parse; log options are global and applied before lazy-loading run/util (which load the logger)\n */\n\n// ── 1. Node version gate ────────────────────────────────────────────\nconst [major, minor] = process.version.slice(1).split(\".\").map(Number) as [\n number,\n number,\n];\n\nif (!(major > 18 || (major === 18 && minor >= 19))) {\n // eslint-disable-next-line no-console\n console.error(\n `[routecraft] Node.js ${process.version} is not supported. ` +\n `Routecraft requires Node.js 18.19.0 or later (e.g. 20 or 22). ` +\n `Please upgrade Node or configure your MCP client to use a newer Node.`,\n );\n process.exit(1);\n}\n\n// ── 2. Re-exec with tsx loader if a .ts file is being run ───────────────────\n// Node's native --experimental-strip-types does not handle extensionless\n// imports or .js-to-.ts resolution. tsx (via --import tsx/esm) does.\n// We set CRAFT_TSX_LOADER=1 before re-execing to avoid an infinite loop.\nconst hasTSFile = process.argv\n .slice(2)\n .some((arg) => !arg.startsWith(\"-\") && arg.endsWith(\".ts\"));\n\nif (hasTSFile && !process.env[\"CRAFT_TSX_LOADER\"]) {\n const { execFileSync } = await import(\"node:child_process\");\n const { createRequire } = await import(\"node:module\");\n // Resolve tsx/esm relative to the CLI package so it works regardless of CWD\n const tsxEsmPath = createRequire(import.meta.url).resolve(\"tsx/esm\");\n\n // Let the child handle SIGINT/SIGTERM for graceful shutdown.\n // Without this the parent dies on the first signal, orphaning the child\n // mid-teardown (connections not closed, logs truncated).\n process.on(\"SIGINT\", () => {});\n process.on(\"SIGTERM\", () => {});\n\n try {\n execFileSync(\n process.execPath,\n [\n \"--import\",\n tsxEsmPath,\n ...process.execArgv,\n process.argv[1]!,\n ...process.argv.slice(2),\n ],\n { stdio: \"inherit\", env: { ...process.env, CRAFT_TSX_LOADER: \"1\" } },\n );\n process.exit(0);\n } catch (err: unknown) {\n process.exit(\n (err as NodeJS.ErrnoException & { status?: number }).status ?? 1,\n );\n }\n}\n\n// ── 3. CLI definition (only Commander; run/util are lazy-loaded so logger sees env) ─\nconst { Command } = await import(\"commander\");\nconst program = new Command();\n\nprogram\n .name(\"craft\")\n .description(\"A modern routing framework for TypeScript\")\n .version(\"0.5.0-canary.6\")\n .enablePositionalOptions()\n .option(\n \"--log-level <level>\",\n \"Log level (e.g. info, warn, error, silent to disable)\",\n )\n .option(\n \"--log-file <path>\",\n \"Write logs to a file (keeps stdout clear for MCP stdio)\",\n )\n .showSuggestionAfterError()\n .showHelpAfterError()\n .exitOverride((err) => {\n if (err.code === \"commander.unknownCommand\") {\n process.exit(0);\n }\n });\n\n// Show help by default if no arguments provided\nif (process.argv.length <= 2) {\n program.help({ error: false });\n}\n\n/**\n * The 'run' command executes routes from a single file.\n *\n * Example:\n * craft run ./my-routes.ts\n * craft run ./my-cli.ts greet --name World\n */\nprogram\n .command(\"run\")\n .description(\"Run routes from a single TypeScript/JavaScript file\")\n .argument(\"<file>\", \"Path to a file containing routes\")\n .argument(\n \"[args...]\",\n \"CLI command and flags to pass through to CLI adapter routes\",\n )\n .option(\n \"--env <path>\",\n \"Load environment variables from a .env file (default: .env)\",\n )\n .passThroughOptions()\n .action(async (filePath, args: string[], options) => {\n // Apply global log options to env before any import that creates the logger\n const globalOpts = program.opts();\n if (globalOpts[\"logLevel\"] !== undefined) {\n process.env[\"LOG_LEVEL\"] = globalOpts[\"logLevel\"];\n process.env[\"CRAFT_LOG_LEVEL\"] = globalOpts[\"logLevel\"];\n }\n if (globalOpts[\"logFile\"] !== undefined) {\n process.env[\"LOG_FILE\"] = globalOpts[\"logFile\"];\n process.env[\"CRAFT_LOG_FILE\"] = globalOpts[\"logFile\"];\n }\n\n const { loadEnvFile } = await import(\"./util.js\");\n if (options.env !== undefined) {\n loadEnvFile(options.env);\n } else {\n loadEnvFile();\n }\n\n const { runCommand } = await import(\"./run.js\");\n const result = await runCommand(filePath, args);\n if (!result.success) {\n if (result.message) {\n // eslint-disable-next-line no-console\n console.error(result.message);\n }\n // Defer exit so pino/sonic-boom can finish initializing and avoid \"sonic boom is not ready yet\"\n const code = result.code ?? 1;\n setImmediate(() => process.exit(code));\n return;\n }\n // Don't call process.exit() — let the event loop drain naturally.\n // process.exit() triggers C++ static destructors that race with ONNX\n // Runtime cleanup (onnxruntime#25038: \"mutex lock failed\").\n });\n\n/**\n * The 'tui' command launches the Terminal UI for monitoring Routecraft execution.\n *\n * Example:\n * craft tui\n * craft tui --db .routecraft/telemetry.db\n */\nprogram\n .command(\"tui\")\n .description(\"Launch the Terminal UI to monitor Routecraft execution history\")\n .option(\n \"--db <path>\",\n \"Path to the telemetry SQLite database\",\n \".routecraft/telemetry.db\",\n )\n .action(async (options) => {\n const { resolve, isAbsolute } = await import(\"node:path\");\n const dbPath = isAbsolute(options.db)\n ? options.db\n : resolve(process.cwd(), options.db);\n\n const { renderTui } = await import(\"./tui/app.js\");\n await renderTui(dbPath);\n });\n\n// Parse the command line arguments and execute the appropriate command\nprogram.parse();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@routecraft/cli",
3
- "version": "0.5.0-canary.4",
3
+ "version": "0.5.0-canary.6",
4
4
  "description": "CLI for running Routecraft routes",
5
5
  "private": false,
6
6
  "type": "module",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@opentelemetry/sdk-trace-base": "^2.7.0",
26
- "@routecraft/routecraft": "^0.5.0-canary.4",
26
+ "@routecraft/routecraft": "^0.5.0-canary.6",
27
27
  "agent-browser": "^0.17.1",
28
28
  "better-sqlite3": "^11.10.0",
29
29
  "cheerio": "^1.2.0",
@@ -32,6 +32,7 @@
32
32
  "dotenv": "^17.4.2",
33
33
  "imapflow": "^1.3.2",
34
34
  "ink": "^5.2.1",
35
+ "jose": "^6.2.2",
35
36
  "mailparser": "^3.9.8",
36
37
  "nodemailer": "^6.10.1",
37
38
  "papaparse": "^5.5.3",
@@ -54,7 +55,7 @@
54
55
  "craft": "./dist/index.js"
55
56
  },
56
57
  "engines": {
57
- "node": ">=18.19.0"
58
+ "node": ">=22.0.0"
58
59
  },
59
60
  "keywords": [
60
61
  "routecraft",