dinorex 1.0.2 → 1.0.4

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/auth.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ export interface AuthData {
2
+ token: string;
3
+ user: {
4
+ id: string;
5
+ name: string;
6
+ email: string;
7
+ plan: string;
8
+ scansThisMonth: number;
9
+ scanLimit: number | null;
10
+ scansRemaining: number | null;
11
+ };
12
+ }
13
+ export declare function loadAuth(): AuthData | null;
14
+ export declare function saveAuth(data: AuthData): void;
15
+ export declare function clearAuth(): void;
16
+ export declare function getApiUrl(): string;
17
+ export declare function apiRequest<T>(endpoint: string, options?: {
18
+ method?: string;
19
+ body?: unknown;
20
+ token?: string;
21
+ }): Promise<T>;
22
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC;CACH;AAED,wBAAgB,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAO1C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAG7C;AAED,wBAAgB,SAAS,IAAI,IAAI,CAIhC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAsB,UAAU,CAAC,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
package/dist/auth.js ADDED
@@ -0,0 +1,51 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync } from "fs";
2
+ import path from "path";
3
+ import os from "os";
4
+ const AUTH_DIR = path.join(os.homedir(), ".dinorex");
5
+ const AUTH_FILE = path.join(AUTH_DIR, "auth.json");
6
+ export function loadAuth() {
7
+ try {
8
+ if (!existsSync(AUTH_FILE))
9
+ return null;
10
+ return JSON.parse(readFileSync(AUTH_FILE, "utf-8"));
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+ export function saveAuth(data) {
17
+ mkdirSync(AUTH_DIR, { recursive: true });
18
+ writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2));
19
+ }
20
+ export function clearAuth() {
21
+ try {
22
+ if (existsSync(AUTH_FILE))
23
+ rmSync(AUTH_FILE);
24
+ }
25
+ catch { }
26
+ }
27
+ export function getApiUrl() {
28
+ return process.env.DINOREX_API_URL || "https://dinorex-server.onrender.com";
29
+ }
30
+ export async function apiRequest(endpoint, options = {}) {
31
+ const { method = "GET", body, token } = options;
32
+ const url = `${getApiUrl()}${endpoint}`;
33
+ const headers = {
34
+ "Content-Type": "application/json",
35
+ };
36
+ if (token)
37
+ headers["Authorization"] = `Bearer ${token}`;
38
+ const res = await fetch(url, {
39
+ method,
40
+ headers,
41
+ body: body ? JSON.stringify(body) : undefined,
42
+ });
43
+ const data = (await res.json());
44
+ if (!res.ok) {
45
+ const msg = data.error || `Request failed (${res.status})`;
46
+ const hint = data.hint;
47
+ throw new Error(hint ? `${msg}\n ${hint}` : msg);
48
+ }
49
+ return data;
50
+ }
51
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAChF,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAenD,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAa,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAc;IACrC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,qCAAqC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,UAII,EAAE;IAEN,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAChD,MAAM,GAAG,GAAG,GAAG,SAAS,EAAE,GAAG,QAAQ,EAAE,CAAC;IAExC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAExD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0C,CAAC;IAEzE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAI,IAA2B,CAAC,KAAK,IAAI,mBAAmB,GAAG,CAAC,MAAM,GAAG,CAAC;QACnF,MAAM,IAAI,GAAI,IAA0B,CAAC,IAAI,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/cli.js CHANGED
@@ -2,76 +2,186 @@
2
2
  import { program } from "commander";
3
3
  import chalk from "chalk";
4
4
  import ora from "ora";
5
+ import * as readline from "readline";
5
6
  import { readFileSync } from "fs";
6
7
  import { fileURLToPath } from "url";
7
8
  import path from "path";
8
9
  import { execSync } from "child_process";
9
- import { createHash } from "crypto";
10
+ import { loadAuth, saveAuth, clearAuth, apiRequest } from "./auth.js";
10
11
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
12
  const pkgPath = path.join(__dirname, "../package.json");
12
13
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
14
+ // ── Helpers ───────────────────────────────────────────────────────────────
13
15
  function banner() {
14
16
  console.log();
15
17
  console.log(chalk.green.bold(" 🦕 DINOREX") + chalk.dim(" v" + pkg.version));
16
18
  console.log(chalk.dim(" AI-powered API documentation — one command, full docs."));
17
19
  console.log();
18
20
  }
19
- function checkApiKey(options) {
20
- const isAnthropic = options.provider === "anthropic" ||
21
- process.env.DINOREX_PROVIDER === "anthropic";
22
- if (isAnthropic) {
23
- if (options.apiKey)
24
- process.env.ANTHROPIC_API_KEY = options.apiKey;
25
- if (!process.env.ANTHROPIC_API_KEY) {
26
- console.log(chalk.red(" ✗ ANTHROPIC_API_KEY is not set.\n"));
27
- console.log(chalk.dim(" Option 1 — env var: export ANTHROPIC_API_KEY=sk-ant-..."));
28
- console.log(chalk.dim(" Option 2 flag: dinorex scan --provider anthropic --api-key sk-ant-..."));
29
- console.log();
30
- process.exit(1);
21
+ function prompt(question, options = {}) {
22
+ return new Promise((resolve) => {
23
+ const rl = readline.createInterface({
24
+ input: process.stdin,
25
+ output: options.hidden ? undefined : process.stdout,
26
+ });
27
+ if (options.hidden) {
28
+ process.stdout.write(question);
29
+ process.stdin.setRawMode?.(true);
30
+ let value = "";
31
+ process.stdin.resume();
32
+ process.stdin.setEncoding("utf8");
33
+ const onData = (char) => {
34
+ if (char === "\n" || char === "\r" || char === "\u0003") {
35
+ process.stdin.setRawMode?.(false);
36
+ process.stdin.pause();
37
+ process.stdin.removeListener("data", onData);
38
+ process.stdout.write("\n");
39
+ resolve(value);
40
+ }
41
+ else if (char === "\u007F") {
42
+ value = value.slice(0, -1);
43
+ }
44
+ else {
45
+ value += char;
46
+ process.stdout.write("*");
47
+ }
48
+ };
49
+ process.stdin.on("data", onData);
50
+ rl.close();
31
51
  }
52
+ else {
53
+ rl.question(question, (answer) => {
54
+ rl.close();
55
+ resolve(answer.trim());
56
+ });
57
+ }
58
+ });
59
+ }
60
+ function printUser(auth) {
61
+ const plan = auth.user.plan === "PRO"
62
+ ? chalk.yellow("PRO ⚡")
63
+ : chalk.dim("Free");
64
+ const scans = auth.user.plan === "PRO"
65
+ ? chalk.green("unlimited")
66
+ : chalk.white(`${auth.user.scansRemaining ?? 0}/${auth.user.scanLimit} remaining this month`);
67
+ console.log(chalk.dim(` Logged in as: `) + chalk.white(auth.user.email));
68
+ console.log(chalk.dim(` Plan: `) + plan + chalk.dim(" | Scans: ") + scans);
69
+ console.log();
70
+ }
71
+ // ── Auth flow — called automatically before scan if not logged in ─────────
72
+ async function ensureAuth() {
73
+ const existing = loadAuth();
74
+ if (existing)
75
+ return existing;
76
+ console.log(chalk.yellow(" You need an account to use Dinorex.\n"));
77
+ const choice = await prompt(" Do you have an account? (yes/no): ");
78
+ console.log();
79
+ if (choice.toLowerCase().startsWith("y")) {
80
+ return await runLogin();
32
81
  }
33
82
  else {
34
- if (options.apiKey)
35
- process.env.GROQ_API_KEY = options.apiKey;
36
- if (!process.env.GROQ_API_KEY) {
37
- console.log(chalk.red(" ✗ GROQ_API_KEY is not set.\n"));
38
- console.log(chalk.dim(" Get a free key at: https://console.groq.com"));
39
- console.log(chalk.dim(" Then: export GROQ_API_KEY=gsk_your_key_here"));
40
- console.log(chalk.dim(" Or: dinorex scan --api-key gsk_..."));
41
- console.log(chalk.dim(" To use Anthropic instead: dinorex scan --provider anthropic --api-key sk-ant-..."));
42
- console.log();
43
- process.exit(1);
44
- }
83
+ return await runSignup();
45
84
  }
46
85
  }
47
- // ── dinorex scan [dir] ────────────────────────────────────────────────────
86
+ async function runSignup() {
87
+ console.log(chalk.green.bold(" Create your free account\n"));
88
+ const name = await prompt(" Name: ");
89
+ const email = await prompt(" Email: ");
90
+ const password = await prompt(" Password: ", { hidden: true });
91
+ const spinner = ora({ text: "Creating account…", color: "green" }).start();
92
+ try {
93
+ const res = await apiRequest("/auth/signup", { method: "POST", body: { name, email, password } });
94
+ const auth = { token: res.token, user: res.user };
95
+ saveAuth(auth);
96
+ spinner.succeed(chalk.green(res.message));
97
+ return auth;
98
+ }
99
+ catch (err) {
100
+ spinner.fail(chalk.red(err.message));
101
+ process.exit(1);
102
+ }
103
+ }
104
+ async function runLogin() {
105
+ console.log(chalk.green.bold(" Login to Dinorex\n"));
106
+ const email = await prompt(" Email: ");
107
+ const password = await prompt(" Password: ", { hidden: true });
108
+ const spinner = ora({ text: "Logging in…", color: "green" }).start();
109
+ try {
110
+ const res = await apiRequest("/auth/login", { method: "POST", body: { email, password } });
111
+ const auth = { token: res.token, user: res.user };
112
+ saveAuth(auth);
113
+ spinner.succeed(chalk.green(res.message));
114
+ return auth;
115
+ }
116
+ catch (err) {
117
+ spinner.fail(chalk.red(err.message));
118
+ process.exit(1);
119
+ }
120
+ }
121
+ // ── Commands ──────────────────────────────────────────────────────────────
48
122
  program
49
123
  .name("dinorex")
50
124
  .version(pkg.version)
51
125
  .description("AI-powered API documentation generator");
126
+ // ── dinorex signup ────────────────────────────────────────────────────────
127
+ program
128
+ .command("signup")
129
+ .description("Create a free Dinorex account")
130
+ .action(async () => {
131
+ banner();
132
+ const auth = await runSignup();
133
+ printUser(auth);
134
+ });
135
+ // ── dinorex login ─────────────────────────────────────────────────────────
136
+ program
137
+ .command("login")
138
+ .description("Login to your Dinorex account")
139
+ .action(async () => {
140
+ banner();
141
+ const auth = await runLogin();
142
+ printUser(auth);
143
+ });
144
+ // ── dinorex logout ────────────────────────────────────────────────────────
145
+ program
146
+ .command("logout")
147
+ .description("Logout of your Dinorex account")
148
+ .action(() => {
149
+ banner();
150
+ clearAuth();
151
+ console.log(chalk.green(" ✓ Logged out successfully. 🦕\n"));
152
+ });
153
+ // ── dinorex whoami ────────────────────────────────────────────────────────
154
+ program
155
+ .command("whoami")
156
+ .description("Show current logged-in user")
157
+ .action(() => {
158
+ banner();
159
+ const auth = loadAuth();
160
+ if (!auth) {
161
+ console.log(chalk.yellow(" Not logged in. Run: dinorex login\n"));
162
+ return;
163
+ }
164
+ printUser(auth);
165
+ });
166
+ // ── dinorex scan [dir] ────────────────────────────────────────────────────
52
167
  program
53
168
  .command("scan [directory]")
54
169
  .alias("init")
55
170
  .description("Scan a project and launch the interactive docs UI")
56
171
  .option("-p, --port <port>", "Port for the docs server", "4321")
57
172
  .option("--no-open", "Skip auto-opening browser")
58
- .option("--api-key <key>", "API key (Groq or Anthropic)")
59
- .option("--provider <name>", "AI provider: groq (default) or anthropic")
60
173
  .action(async (directory = ".", options) => {
61
174
  banner();
62
- checkApiKey(options);
175
+ // ── Auth check ──
176
+ const auth = await ensureAuth();
177
+ printUser(auth);
63
178
  const targetDir = path.resolve(directory);
64
179
  const port = parseInt(options.port, 10);
65
- const isAnthropic = options.provider === "anthropic" || process.env.DINOREX_PROVIDER === "anthropic";
66
180
  const { scanProject } = await import("./scanner.js");
67
- const agentFile = isAnthropic ? "./agent.js" : "./agent.groq.js";
68
- const { analyzeWithAI, analyzeIncremental } = await import(agentFile);
69
- const { startServer } = await import("./server.js");
70
181
  const { loadStore, saveStore, diffScan } = await import("./store.js");
71
- console.log(chalk.dim(` 📂 ${targetDir}`));
72
- const providerLabel = isAnthropic ? "anthropic" : "groq (free)";
73
- console.log(chalk.dim(` 🤖 Provider: ${providerLabel}\n`));
74
- // ── 1. Scan ──
182
+ const { startServer } = await import("./server.js");
183
+ console.log(chalk.dim(` 📂 ${targetDir}\n`));
184
+ // ── 1. Scan files locally ──
75
185
  const s1 = ora({ text: "Scanning project files…", color: "green" }).start();
76
186
  let scanResult;
77
187
  try {
@@ -89,65 +199,99 @@ program
89
199
  }
90
200
  s1.succeed(chalk.green("Discovered: ") +
91
201
  chalk.white(`${summary.routes} routes ${summary.controllers} controllers ${summary.services} services ${summary.models} models`));
92
- // ── 2. AI analysis (full or incremental) ──
93
- const stored = loadStore(targetDir);
202
+ // ── 2. Check local cache vs changed files ──
94
203
  const allFiles = [
95
204
  ...collected.routes,
96
205
  ...collected.controllers,
97
206
  ...collected.services,
98
207
  ...collected.models,
99
208
  ];
209
+ const stored = loadStore(targetDir);
100
210
  let spec;
101
211
  if (stored?.spec && stored?.hashes) {
102
212
  const diff = diffScan(stored.hashes, allFiles);
103
213
  const hasChanges = diff.newFiles.length || diff.changedFiles.length || diff.removedFiles.length;
104
- if (hasChanges) {
214
+ if (!hasChanges) {
215
+ spec = stored.spec;
216
+ console.log(chalk.dim(" ✓ No changes since last scan — using cached spec."));
217
+ }
218
+ else {
219
+ // ── 3a. Send changed files to server ──
105
220
  const s2 = ora({
106
- text: `Incremental update — ${diff.newFiles.length} new, ${diff.changedFiles.length} changed files…`,
221
+ text: `Sending ${diff.newFiles.length} new, ${diff.changedFiles.length} changed files to Dinorex…`,
107
222
  color: "cyan",
108
223
  }).start();
109
224
  try {
110
- const result = await analyzeIncremental(stored.spec, diff);
111
- spec = result.spec;
112
- const hashes = {};
113
- for (const f of allFiles) {
114
- hashes[f.path] = { hash: createHash("md5").update(f.content).digest("hex") };
115
- }
116
- saveStore(targetDir, { spec, hashes, lastScan: new Date().toISOString() });
117
- s2.succeed(chalk.cyan("Incremental update complete."));
225
+ const res = await apiRequest("/scan", {
226
+ method: "POST",
227
+ token: auth.token,
228
+ body: {
229
+ projectName: path.basename(targetDir),
230
+ routes: diff.newFiles.filter(f => collected.routes.find(r => r.path === f.path))
231
+ .concat(diff.changedFiles.filter(f => collected.routes.find(r => r.path === f.path))),
232
+ controllers: diff.newFiles.filter(f => collected.controllers.find(r => r.path === f.path))
233
+ .concat(diff.changedFiles.filter(f => collected.controllers.find(r => r.path === f.path))),
234
+ services: diff.newFiles.filter(f => collected.services.find(r => r.path === f.path))
235
+ .concat(diff.changedFiles.filter(f => collected.services.find(r => r.path === f.path))),
236
+ models: diff.newFiles.filter(f => collected.models.find(r => r.path === f.path))
237
+ .concat(diff.changedFiles.filter(f => collected.models.find(r => r.path === f.path))),
238
+ existingSpec: stored.spec,
239
+ removedFiles: diff.removedFiles,
240
+ },
241
+ });
242
+ spec = res.spec;
243
+ saveStore(targetDir, { spec: res.spec, hashes: diff.newHashes, lastScan: new Date().toISOString() });
244
+ const u = res.usage;
245
+ const usageStr = u.plan === "PRO"
246
+ ? chalk.yellow("PRO — unlimited")
247
+ : chalk.dim(`${u.scansThisMonth}/${u.scanLimit} scans used`);
248
+ s2.succeed(chalk.cyan("Incremental update complete. ") + usageStr);
118
249
  }
119
- catch (e) {
120
- s2.fail(chalk.red(e.message));
250
+ catch (err) {
251
+ s2.fail(chalk.red(err.message));
121
252
  process.exit(1);
122
253
  }
123
254
  }
124
- else {
125
- spec = stored.spec;
126
- console.log(chalk.dim(" ✓ No changes since last scan — using cached spec."));
127
- }
128
255
  }
129
256
  else {
130
- const s2 = ora({ text: "Running full AI analysis (~15s)…", color: "cyan" }).start();
257
+ // ── 3b. Full scan send all files to server ──
258
+ const s2 = ora({ text: "Sending files to Dinorex server for analysis…", color: "cyan" }).start();
131
259
  try {
132
- spec = await analyzeWithAI(collected, path.basename(targetDir));
260
+ const res = await apiRequest("/scan", {
261
+ method: "POST",
262
+ token: auth.token,
263
+ body: {
264
+ projectName: path.basename(targetDir),
265
+ routes: collected.routes,
266
+ controllers: collected.controllers,
267
+ services: collected.services,
268
+ models: collected.models,
269
+ },
270
+ });
271
+ spec = res.spec;
272
+ const { createHash } = await import("crypto");
133
273
  const hashes = {};
134
274
  for (const f of allFiles) {
135
275
  hashes[f.path] = { hash: createHash("md5").update(f.content).digest("hex") };
136
276
  }
137
- saveStore(targetDir, { spec, hashes, lastScan: new Date().toISOString() });
138
- s2.succeed(chalk.cyan("Analysis complete ") +
139
- chalk.white(`${spec.collections.reduce((a, c) => a + c.endpoints.length, 0)} endpoints across ${spec.collections.length} collections`));
277
+ saveStore(targetDir, { spec: res.spec, hashes, lastScan: new Date().toISOString() });
278
+ const u = res.usage;
279
+ const usageStr = u.plan === "PRO"
280
+ ? chalk.yellow("PRO — unlimited")
281
+ : chalk.dim(`${u.scansRemaining} scans remaining this month`);
282
+ const totalEndpoints = spec.collections.reduce((a, c) => a + c.endpoints.length, 0);
283
+ s2.succeed(chalk.cyan(`${totalEndpoints} endpoints across ${spec.collections.length} collections — `) + usageStr);
140
284
  }
141
- catch (e) {
142
- s2.fail(chalk.red(e.message));
285
+ catch (err) {
286
+ s2.fail(chalk.red(err.message));
143
287
  process.exit(1);
144
288
  }
145
289
  }
146
- // ── 3. Start server ──
147
- const s3 = ora({ text: `Starting docs server on :${port}…`, color: "yellow" }).start();
290
+ // ── 4. Start local UI server ──
291
+ const s3 = ora({ text: `Starting docs UI on :${port}…`, color: "yellow" }).start();
148
292
  let srv;
149
293
  try {
150
- srv = await startServer(targetDir, { port, _cachedSpec: spec });
294
+ srv = await startServer(targetDir, { port, _cachedSpec: spec ?? null });
151
295
  }
152
296
  catch (e) {
153
297
  s3.fail(chalk.red(e.message));
@@ -156,8 +300,7 @@ program
156
300
  s3.succeed(chalk.yellow("Docs server running!"));
157
301
  console.log();
158
302
  console.log(chalk.green.bold(` ✓ Dinorex docs → ${srv.url}`));
159
- console.log();
160
- console.log(chalk.dim(" Tip: run dinorex scan again anytime to pick up new endpoints."));
303
+ console.log(chalk.dim(" Tip: run dinorex scan again to pick up new endpoints."));
161
304
  console.log(chalk.dim(" Ctrl+C to stop.\n"));
162
305
  if (options.open !== false) {
163
306
  try {
@@ -175,5 +318,19 @@ program
175
318
  process.exit(0);
176
319
  });
177
320
  });
321
+ // ── dinorex upgrade ───────────────────────────────────────────────────────
322
+ program
323
+ .command("upgrade")
324
+ .description("Upgrade to Dinorex Pro for unlimited scans")
325
+ .action(() => {
326
+ banner();
327
+ const auth = loadAuth();
328
+ if (auth?.user.plan === "PRO") {
329
+ console.log(chalk.yellow(" You're already on Pro! 🎉\n"));
330
+ return;
331
+ }
332
+ console.log(chalk.green(" Upgrade to Dinorex Pro for unlimited scans.\n"));
333
+ console.log(chalk.white(" → https://dinorex-server.onrender.com/upgrade\n"));
334
+ });
178
335
  program.parse();
179
336
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAwB,CAAC;AAc9E,SAAS,MAAM;IACb,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,OAAsC;IACzD,MAAM,WAAW,GACd,OAAuB,CAAC,QAAQ,KAAK,WAAW;QACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,WAAW,CAAC;IAE/C,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC,CAAC;YACzG,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC,CAAC;YAC7G,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,WAAW,CAAC,wCAAwC,CAAC,CAAC;AAEzD,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,KAAK,CAAC,MAAM,CAAC;KACb,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAChD,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,CAAC;KACxD,MAAM,CAAC,mBAAmB,EAAE,0CAA0C,CAAC;KACvE,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG,EAAE,OAAoB,EAAE,EAAE;IACtD,MAAM,EAAE,CAAC;IACT,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAExC,MAAM,WAAW,GACf,OAAO,CAAC,QAAQ,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,WAAW,CAAC;IAEnF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACjE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,aAAa,IAAI,CAAC,CAAC,CAAC;IAE5D,gBAAgB;IAChB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5E,IAAI,UAAU,CAAC;IACf,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,IAAI,CACL,KAAK,CAAC,GAAG,CAAC,0EAA0E,CAAC,CACtF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,EAAE,CAAC,OAAO,CACR,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;QACzB,KAAK,CAAC,KAAK,CACT,GAAG,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,WAAW,iBAAiB,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,SAAS,CACvH,CACJ,CAAC;IAEF,6CAA6C;IAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG;QACf,GAAG,SAAS,CAAC,MAAM;QACnB,GAAG,SAAS,CAAC,WAAW;QACxB,GAAG,SAAS,CAAC,QAAQ;QACrB,GAAG,SAAS,CAAC,MAAM;KACpB,CAAC;IACF,IAAI,IAAI,CAAC;IAET,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,UAAU,GACd,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAE/E,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,EAAE,GAAG,GAAG,CAAC;gBACb,IAAI,EAAE,wBAAwB,IAAI,CAAC,QAAQ,CAAC,MAAM,SAAS,IAAI,CAAC,YAAY,CAAC,MAAM,iBAAiB;gBACpG,KAAK,EAAE,MAAM;aACd,CAAC,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC3D,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gBACnB,MAAM,MAAM,GAAqC,EAAE,CAAC;gBACpD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/E,CAAC;gBACD,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAC3E,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACpF,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YAChE,MAAM,MAAM,GAAqC,EAAE,CAAC;YACpD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/E,CAAC;YACD,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC3E,EAAE,CAAC,OAAO,CACR,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;gBAChC,KAAK,CAAC,KAAK,CACT,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,CAA2B,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,qBAAqB,IAAI,CAAC,WAAW,CAAC,MAAM,cAAc,CAC5J,CACJ,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,4BAA4B,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACvF,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ;gBAC3B,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE;gBACnB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;oBAC5B,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE;oBACpB,CAAC,CAAC,YAAY,GAAG,CAAC,GAAG,EAAE,CAAC;YAC9B,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}