@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.
- package/dist/index.js +15 -163
- 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,
|
|
3
|
-
import { dirname, resolve, join
|
|
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 } =
|
|
314
|
-
const
|
|
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:
|
|
893
|
-
payload =
|
|
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:
|
|
910
|
-
payload =
|
|
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:
|
|
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 =
|
|
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.
|
|
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.
|
|
15
|
+
"@dirxai/core": "^0.3.1",
|
|
16
16
|
"commander": "^13.0.0"
|
|
17
17
|
},
|
|
18
18
|
"repository": {
|