@dirxai/cli 0.3.0 → 0.3.1

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.
Files changed (2) hide show
  1. package/dist/index.js +15 -163
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { readFileSync, existsSync, mkdirSync, writeFileSync, readdirSync, statSync, chmodSync } from 'fs';
3
- import { dirname, resolve, join, extname, relative } from 'path';
2
+ import { readFileSync, existsSync, mkdirSync, writeFileSync, chmodSync } from 'fs';
3
+ import { dirname, resolve, join } from 'path';
4
4
  import { homedir } from 'os';
5
+ import { detectFramework, scanRoutes, getAuthHint } from '@dirxai/core';
5
6
  import { readFile } from 'fs/promises';
6
7
  import { fileURLToPath } from 'url';
7
8
  import { Command } from 'commander';
@@ -184,24 +185,6 @@ Next steps:`);
184
185
  console.log(` 2. Run 'dirx generate' to scan routes`);
185
186
  console.log(` 3. Run 'dirx register --domain <your-domain>' to publish`);
186
187
  }
187
- function detectFramework(target) {
188
- if (existsSync(join(target, "Cargo.toml"))) {
189
- return { lang: "rust", framework: "axum" };
190
- }
191
- if (existsSync(join(target, "go.mod"))) {
192
- return { lang: "go", framework: "net/http" };
193
- }
194
- if (existsSync(join(target, "package.json"))) {
195
- if (existsSync(join(target, "next.config.js")) || existsSync(join(target, "next.config.mjs"))) {
196
- return { lang: "node", framework: "nextjs" };
197
- }
198
- return { lang: "node", framework: "express" };
199
- }
200
- if (existsSync(join(target, "requirements.txt")) || existsSync(join(target, "pyproject.toml"))) {
201
- return { lang: "python", framework: "fastapi" };
202
- }
203
- return { lang: "unknown", framework: "generic" };
204
- }
205
188
  var init_init = __esm({
206
189
  "src/commands/init.ts"() {
207
190
  }
@@ -310,12 +293,8 @@ async function runGenerate(dir, opts) {
310
293
  process.exitCode = 1;
311
294
  return;
312
295
  }
313
- const { framework } = detectFrameworkFromPackage(target);
314
- const patterns = getRoutePatterns(framework);
315
- const routes = [];
316
- if (patterns.length > 0) {
317
- scanDir(target, target, patterns, framework, routes, 0);
318
- }
296
+ const { framework } = detectFramework(target);
297
+ const routes = scanRoutes(target, framework);
319
298
  console.log(`Scanned ${target} (${framework})`);
320
299
  if (routes.length > 0) {
321
300
  console.log(`
@@ -342,106 +321,8 @@ Registering with gateway...`);
342
321
  });
343
322
  }
344
323
  }
345
- function detectFrameworkFromPackage(target) {
346
- const pkgPath = join(target, "package.json");
347
- if (existsSync(pkgPath)) {
348
- try {
349
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
350
- const deps = {
351
- ...pkg.dependencies,
352
- ...pkg.devDependencies
353
- };
354
- if (deps.next) return { framework: "nextjs" };
355
- if (deps.hono) return { framework: "hono" };
356
- if (deps.fastify) return { framework: "fastify" };
357
- if (deps.express) return { framework: "express" };
358
- } catch {
359
- }
360
- }
361
- if (existsSync(join(target, "go.mod")))
362
- return { framework: "go" };
363
- if (existsSync(join(target, "Cargo.toml")))
364
- return { framework: "axum" };
365
- if (existsSync(join(target, "requirements.txt")) || existsSync(join(target, "pyproject.toml")))
366
- return { framework: "fastapi" };
367
- return { framework: "generic" };
368
- }
369
- function getRoutePatterns(framework) {
370
- switch (framework) {
371
- case "express":
372
- case "hono":
373
- case "fastify":
374
- return [".get(", ".post(", ".put(", ".delete(", ".patch(", "router."];
375
- case "nextjs":
376
- return ["export default", "export async function"];
377
- case "fastapi":
378
- return ["@app.get", "@app.post", "@app.put", "@app.delete", "@router."];
379
- case "go":
380
- return ["HandleFunc(", "Get(", "Post(", "Put(", "Delete(", "r.Route("];
381
- case "axum":
382
- return [".route(", ".get(", ".post(", ".put(", ".delete("];
383
- default:
384
- return [];
385
- }
386
- }
387
- function scanDir(root, dir, patterns, framework, routes, depth) {
388
- if (depth > MAX_SCAN_DEPTH) return;
389
- let entries;
390
- try {
391
- entries = readdirSync(dir);
392
- } catch {
393
- return;
394
- }
395
- for (const name of entries) {
396
- if (SKIP_DIRS.has(name)) continue;
397
- const fullPath = join(dir, name);
398
- let stat;
399
- try {
400
- stat = statSync(fullPath);
401
- } catch {
402
- continue;
403
- }
404
- if (stat.isDirectory()) {
405
- scanDir(root, fullPath, patterns, framework, routes, depth + 1);
406
- continue;
407
- }
408
- if (!stat.isFile()) continue;
409
- if (!SCAN_EXTENSIONS.has(extname(name))) continue;
410
- try {
411
- const content = readFileSync(fullPath, "utf-8");
412
- if (patterns.some((p) => content.includes(p))) {
413
- routes.push({
414
- file: relative(root, fullPath),
415
- framework
416
- });
417
- }
418
- } catch {
419
- }
420
- }
421
- }
422
- var MAX_SCAN_DEPTH, SKIP_DIRS, SCAN_EXTENSIONS;
423
324
  var init_generate = __esm({
424
325
  "src/commands/generate.ts"() {
425
- MAX_SCAN_DEPTH = 8;
426
- SKIP_DIRS = /* @__PURE__ */ new Set([
427
- "node_modules",
428
- ".git",
429
- "target",
430
- "__pycache__",
431
- "vendor",
432
- "dist",
433
- "build",
434
- ".next"
435
- ]);
436
- SCAN_EXTENSIONS = /* @__PURE__ */ new Set([
437
- ".ts",
438
- ".tsx",
439
- ".js",
440
- ".jsx",
441
- ".py",
442
- ".go",
443
- ".rs"
444
- ]);
445
326
  }
446
327
  });
447
328
 
@@ -643,38 +524,6 @@ var init_client = __esm({
643
524
  }
644
525
  });
645
526
 
646
- // src/keys/provider-map.ts
647
- function getAuthHint(domain) {
648
- return providers[domain] ?? null;
649
- }
650
- var providers;
651
- var init_provider_map = __esm({
652
- "src/keys/provider-map.ts"() {
653
- providers = {
654
- "api.github.com": {
655
- envVar: "GITHUB_TOKEN",
656
- guideUrl: "https://github.com/settings/tokens"
657
- },
658
- "api.openai.com": {
659
- envVar: "OPENAI_API_KEY",
660
- guideUrl: "https://platform.openai.com/api-keys"
661
- },
662
- "api.anthropic.com": {
663
- envVar: "ANTHROPIC_API_KEY",
664
- guideUrl: "https://console.anthropic.com/settings/keys"
665
- },
666
- "generativelanguage.googleapis.com": {
667
- envVar: "GOOGLE_API_KEY",
668
- guideUrl: "https://aistudio.google.com/apikey"
669
- },
670
- "api.stripe.com": {
671
- envVar: "STRIPE_SECRET_KEY",
672
- guideUrl: "https://dashboard.stripe.com/apikeys"
673
- }
674
- };
675
- }
676
- });
677
-
678
527
  // src/format.ts
679
528
  function isSearchResults(data) {
680
529
  if (!Array.isArray(data) || data.length === 0) return false;
@@ -889,8 +738,8 @@ function registerFsCommands(program2) {
889
738
  try {
890
739
  let payload = opts.data ?? "";
891
740
  if (opts.file) {
892
- const { readFileSync: readFileSync4 } = await import('fs');
893
- payload = readFileSync4(opts.file, "utf-8");
741
+ const { readFileSync: readFileSync3 } = await import('fs');
742
+ payload = readFileSync3(opts.file, "utf-8");
894
743
  }
895
744
  const jsonMode = program2.opts().json === true;
896
745
  const client = await createClient();
@@ -906,8 +755,8 @@ function registerFsCommands(program2) {
906
755
  try {
907
756
  let payload = opts.data ?? "";
908
757
  if (opts.file) {
909
- const { readFileSync: readFileSync4 } = await import('fs');
910
- payload = readFileSync4(opts.file, "utf-8");
758
+ const { readFileSync: readFileSync3 } = await import('fs');
759
+ payload = readFileSync3(opts.file, "utf-8");
911
760
  }
912
761
  const jsonMode = program2.opts().json === true;
913
762
  const client = await createClient();
@@ -952,7 +801,6 @@ function registerFsCommands(program2) {
952
801
  var init_fs = __esm({
953
802
  "src/commands/fs.ts"() {
954
803
  init_client();
955
- init_provider_map();
956
804
  init_format();
957
805
  }
958
806
  });
@@ -963,13 +811,13 @@ __export(keys_exports, {
963
811
  registerKeysCommand: () => registerKeysCommand
964
812
  });
965
813
  async function loadKeyStore() {
966
- const { readFileSync: readFileSync4 } = await import('fs');
814
+ const { readFileSync: readFileSync3 } = await import('fs');
967
815
  const { join: join5 } = await import('path');
968
816
  const { homedir: homedir2 } = await import('os');
969
817
  const dirxHome = process.env.DIRX_HOME ?? join5(homedir2(), ".dirx");
970
818
  const filePath = join5(dirxHome, "keys.json");
971
819
  try {
972
- const text = readFileSync4(filePath, "utf-8");
820
+ const text = readFileSync3(filePath, "utf-8");
973
821
  return JSON.parse(text);
974
822
  } catch {
975
823
  return { keys: {} };
@@ -1122,4 +970,8 @@ var { registerFsCommands: registerFsCommands2 } = await Promise.resolve().then((
1122
970
  registerFsCommands2(program);
1123
971
  var { registerKeysCommand: registerKeysCommand2 } = await Promise.resolve().then(() => (init_keys(), keys_exports));
1124
972
  registerKeysCommand2(program);
973
+ if (process.argv.length <= 2) {
974
+ program.outputHelp();
975
+ process.exit(0);
976
+ }
1125
977
  program.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dirxai/cli",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "DirX — Unified Gateway & CLI for Agents",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -12,7 +12,7 @@
12
12
  "dev": "tsup --watch"
13
13
  },
14
14
  "dependencies": {
15
- "@dirxai/core": "^0.3.0",
15
+ "@dirxai/core": "^0.3.1",
16
16
  "commander": "^13.0.0"
17
17
  },
18
18
  "repository": {