@asiyst/cli 0.2.0 → 0.2.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/README.md CHANGED
@@ -7,12 +7,12 @@ The `asiyst` CLI connects a website that uses `@asiyst/sdk` to an Asiyst project
7
7
  ```sh
8
8
  npx asiyst
9
9
  # or
10
- npm install -g asiyst
10
+ npm install -g @asiyst/cli
11
11
  ```
12
12
 
13
13
  ## Commands
14
14
 
15
- `asiyst` detects the current project. Use `asiyst init` to start the browser-only authentication and project connection flow. Other commands are `login`, `logout`, `status`, `verify`, `doctor`, and `dashboard`.
15
+ `asiyst` detects the current project and opens an interactive command prompt. Use `asiyst connect` (or `asiyst init`) to start the browser-only authentication and project connection flow. Other commands are `login`, `logout`, `status`, `verify`, `doctor`/`diagnostics`, `dashboard`, `avatar`, `trust`, and `revoke-trust`.
16
16
 
17
17
  The CLI creates a short-lived, single-use session through `POST /api/cli/sessions`, opens its returned URL, and polls `GET /api/cli/sessions/:sessionId/status`. Passwords, AI provider keys, Supabase keys, and private API credentials are never requested, placed in URLs, or logged.
18
18
 
package/dist/index.js CHANGED
@@ -4,15 +4,39 @@
4
4
  var ok = (label, detail = "") => console.log(`\u2713 ${label}${detail ? ` (${detail})` : ""}`);
5
5
  var fail = (label, detail = "") => console.log(`\u2717 ${label}${detail ? `: ${detail}` : ""}`);
6
6
  function banner() {
7
- console.log("\n\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E\n\u2502 ASIIYST \u2502\n\u2502 AI Assistant Platform \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F\n");
7
+ console.log(`
8
+ \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E
9
+ \u2502 \u2502
10
+ \u2502 ASIYST \u2502
11
+ \u2502 AI ASSISTANT PLATFORM \u2502
12
+ \u2502 v0.2.0 \u2502
13
+ \u2502 \u2502
14
+ \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F
15
+ `);
8
16
  }
9
17
  function projectChecks(project) {
10
- project.packageJson ? ok("Project detected") : fail("Project not detected", "package.json is missing");
11
- process.version ? ok("Node.js detected", process.version) : fail("Node.js not detected");
12
- ok("npm detected", "use npm to install dependencies");
18
+ project.packageJson ? ok("Project detected", typeof project.packageJson.name === "string" ? project.packageJson.name : project.cwd) : fail("Project not detected", "package.json is missing");
13
19
  ok("Framework detected", project.framework);
20
+ ok("Language detected", project.language);
21
+ ok("Node.js detected", process.version);
22
+ ok("Package manager detected", project.packageManager);
14
23
  project.sdkVersion ? ok("@asiyst/sdk detected", project.sdkVersion) : fail("@asiyst/sdk is not installed", "npm install @asiyst/sdk");
15
24
  }
25
+ function homeStatus(project, connection = "Not connected") {
26
+ console.log("\nPROJECT STATUS");
27
+ console.log(` Project ${typeof project.packageJson?.name === "string" ? project.packageJson.name : "Not detected"}
28
+ Framework ${project.framework}
29
+ Language ${project.language}
30
+ Node.js ${process.version}
31
+ Package Manager ${project.packageManager}
32
+ @asiyst/sdk ${project.sdkVersion || "Not installed"}`);
33
+ console.log("\nASIYST STATUS");
34
+ console.log(` Connection ${connection}
35
+ Avatar Not configured
36
+ AI Provider Not configured
37
+ Project ID ${project.config.projectId || "\u2014"}`);
38
+ if (connection === "Not connected") console.log("\n Connect website to show stats.");
39
+ }
16
40
  function printVerification(results) {
17
41
  console.log("\nAsiyst Installation Verification\n");
18
42
  for (const result of results) result.ok ? ok(result.name, result.detail) : fail(result.name, result.detail);
@@ -69,11 +93,15 @@ function detectProject(cwd = process.cwd()) {
69
93
  }
70
94
  }
71
95
  const env = { ...readEnv(cwd), ...process.env };
96
+ const packageManager = existsSync(resolve(cwd, "pnpm-lock.yaml")) ? "pnpm" : existsSync(resolve(cwd, "yarn.lock")) ? "yarn" : existsSync(resolve(cwd, "bun.lockb")) || existsSync(resolve(cwd, "bun.lock")) ? "bun" : "npm";
97
+ const sourceFiles = ["tsconfig.json", "src", "app"].some((entry) => existsSync(resolve(cwd, entry)));
72
98
  return {
73
99
  cwd,
74
100
  packageJson,
75
101
  sdkVersion: packageJson ? dependencyVersion(packageJson) : void 0,
76
102
  framework: detectFramework(cwd, packageJson),
103
+ language: sourceFiles ? "TypeScript" : "JavaScript",
104
+ packageManager,
77
105
  config: {
78
106
  projectId: env.ASIIYST_PROJECT_ID,
79
107
  publicKey: env.ASIIYST_PUBLIC_KEY
@@ -190,7 +218,7 @@ ${session.connectUrl}`);
190
218
  if (result.state === "expired") throw new Error("Connection session expired.");
191
219
  if (result.state === "cancelled") throw new Error("Connection session was cancelled.");
192
220
  if (Number.isFinite(expires) && Date.now() >= expires) throw new Error("Connection session expired.");
193
- await new Promise((resolve3) => setTimeout(resolve3, 2e3));
221
+ await new Promise((resolve4) => setTimeout(resolve4, 2e3));
194
222
  }
195
223
  }
196
224
  async function confirm(question) {
@@ -201,8 +229,61 @@ async function confirm(question) {
201
229
  return /^y(es)?$/i.test(answer.trim());
202
230
  }
203
231
 
232
+ // src/config/trust.ts
233
+ import { existsSync as existsSync3, mkdirSync, readFileSync as readFileSync3, writeFileSync } from "fs";
234
+ import { homedir } from "os";
235
+ import { join, resolve as resolve3 } from "path";
236
+ var trustFile = join(homedir(), ".config", "asiyst", "trusted-folders.json");
237
+ function readTrusted() {
238
+ if (!existsSync3(trustFile)) return [];
239
+ try {
240
+ const parsed = JSON.parse(readFileSync3(trustFile, "utf8"));
241
+ return Array.isArray(parsed) && parsed.every((item) => typeof item === "string") ? parsed : [];
242
+ } catch {
243
+ return [];
244
+ }
245
+ }
246
+ function isTrusted(cwd) {
247
+ return readTrusted().includes(resolve3(cwd));
248
+ }
249
+ function trustFolder(cwd) {
250
+ const folder = resolve3(cwd);
251
+ const trusted = readTrusted();
252
+ if (!trusted.includes(folder)) trusted.push(folder);
253
+ mkdirSync(join(homedir(), ".config", "asiyst"), { recursive: true, mode: 448 });
254
+ writeFileSync(trustFile, JSON.stringify(trusted, null, 2), { encoding: "utf8", mode: 384 });
255
+ }
256
+ function revokeTrust(cwd) {
257
+ const folder = resolve3(cwd);
258
+ const trusted = readTrusted().filter((item) => item !== folder);
259
+ if (existsSync3(trustFile)) writeFileSync(trustFile, JSON.stringify(trusted, null, 2), { encoding: "utf8", mode: 384 });
260
+ }
261
+
262
+ // src/commands/trust.ts
263
+ async function ensureTrusted(cwd = process.cwd()) {
264
+ if (isTrusted(cwd)) return true;
265
+ if (!await confirm(`Trust this project folder?
266
+ ${cwd}
267
+
268
+ Asiyst may read project files and modify Asiyst configuration during setup.`)) {
269
+ console.log("Folder not trusted.\nAsiyst setup cancelled.");
270
+ return false;
271
+ }
272
+ trustFolder(cwd);
273
+ console.log("\u2713 Folder trusted.");
274
+ return true;
275
+ }
276
+ async function trustCommand(cwd = process.cwd()) {
277
+ await ensureTrusted(cwd);
278
+ }
279
+ function revokeTrustCommand(cwd = process.cwd()) {
280
+ revokeTrust(cwd);
281
+ console.log("\u2713 Folder trust revoked.");
282
+ }
283
+
204
284
  // src/commands/init.ts
205
285
  async function initCommand(cwd = process.cwd(), api = new ApiClient()) {
286
+ if (!await ensureTrusted(cwd)) return;
206
287
  const project = detectProject(cwd);
207
288
  if (!project.packageJson) throw new Error("No package.json found. Run this command from your website project.");
208
289
  console.log(`Detected ${project.framework} project.`);
@@ -299,59 +380,112 @@ async function doctorCommand(cwd = process.cwd(), api = new ApiClient()) {
299
380
 
300
381
  // src/commands/dashboard.ts
301
382
  async function dashboardCommand() {
302
- const url = "https://asiyst.com/dashboard";
383
+ const configured = process.env.ASIIYST_DASHBOARD_URL || "https://asiyst.com/dashboard";
384
+ const parsed = new URL(configured);
385
+ if (parsed.protocol !== "https:" && !(parsed.hostname === "localhost" && parsed.protocol === "http:")) throw new Error("Configured dashboard URL must use HTTPS.");
386
+ const url = parsed.toString();
303
387
  if (!await openBrowser(url)) console.log(`Open ${url}`);
304
388
  else console.log(`Opening ${url}`);
305
389
  }
306
390
 
307
- // src/index.ts
391
+ // src/commands/avatar.ts
392
+ async function avatarCommand(cwd = process.cwd(), api = new ApiClient()) {
393
+ const project = detectProject(cwd);
394
+ if (!project.config.projectId) {
395
+ console.log("Avatar\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nNo avatar configured.\n\nCreate your avatar in the Asiyst dashboard.");
396
+ const url = "https://asiyst.com/dashboard/avatar";
397
+ if (await openBrowser(url)) console.log(`Opening ${url}`);
398
+ else console.log(`Open ${url}`);
399
+ return;
400
+ }
401
+ const info = await api.projectInfo(project.config.projectId);
402
+ console.log(`Avatar
403
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
404
+ Status ${info.avatarStatus || "Not configured"}
405
+
406
+ Configure your avatar in the Asiyst dashboard.`);
407
+ }
408
+
409
+ // src/commands/interactive.ts
308
410
  import { createInterface as createInterface2 } from "readline/promises";
309
411
  import { stdin as input2, stdout as output2 } from "process";
412
+ var commands = ["connect", "status", "diagnostics", "dashboard", "avatar", "help", "version", "trust", "revoke-trust", "logout", "exit"];
413
+ function resolveInput(value) {
414
+ const input3 = value.trim().toLowerCase();
415
+ if (/^(connect|connect my website|connect this website|connect website|init)/.test(input3)) return "connect";
416
+ if (/^(status|check status|check .*installation)/.test(input3)) return "status";
417
+ if (/diagnos|doctor/.test(input3)) return "diagnostics";
418
+ if (/dashboard/.test(input3)) return "dashboard";
419
+ if (/avatar|configure my avatar|create avatar/.test(input3)) return "avatar";
420
+ if (/^(help|\?)$/.test(input3)) return "help";
421
+ if (/^(version|--version)$/.test(input3)) return "version";
422
+ return input3;
423
+ }
424
+ function interactiveHelp() {
425
+ console.log("\nASIYST CLI\n\nUsage: asiyst [command]\n\nCore Commands\n connect Connect this project to Asiyst\n status Show project and connection status\n diagnostics Diagnose installation problems\n dashboard Open Asiyst dashboard\n avatar Manage avatar configuration\n help Show available commands\n version Show CLI version\n trust Trust this project folder\n revoke-trust Revoke folder trust\n\nExamples\n asiyst connect\n asiyst status\n asiyst diagnostics\n asiyst dashboard");
426
+ }
427
+ async function interactiveHome() {
428
+ const project = detectProject();
429
+ homeStatus(project);
430
+ console.log("\n> Type a command or ask anything...\n\nSuggestions: [connect] [status] [diagnostics] [dashboard] [avatar] [help]");
431
+ const readline = createInterface2({ input: input2, output: output2, historySize: 50, completer: (line) => [commands.filter((item) => item.startsWith(line)), line] });
432
+ readline.on("SIGINT", () => readline.close());
433
+ for (; ; ) {
434
+ let value;
435
+ try {
436
+ value = await readline.question("\n> ");
437
+ } catch {
438
+ break;
439
+ }
440
+ const command = resolveInput(value);
441
+ if (command === "exit" || command === "quit" || !command) break;
442
+ if (command === "connect") await initCommand();
443
+ else if (command === "status") await statusCommand();
444
+ else if (command === "diagnostics") await doctorCommand();
445
+ else if (command === "dashboard") await dashboardCommand();
446
+ else if (command === "avatar") await avatarCommand();
447
+ else if (command === "logout") logoutCommand();
448
+ else if (command === "trust") await trustCommand();
449
+ else if (command === "revoke-trust") revokeTrustCommand();
450
+ else if (command === "help") interactiveHelp();
451
+ else if (command === "version") console.log("0.2.0");
452
+ else console.log(`Unknown command: ${value}
453
+ Run \`asiyst help\` for available commands.`);
454
+ }
455
+ readline.close();
456
+ }
457
+
458
+ // src/index.ts
310
459
  import { fileURLToPath } from "url";
311
460
  var CLI_VERSION = "0.2.0";
312
461
  function help() {
313
- console.log(`Asiyst CLI ${CLI_VERSION}
314
-
315
- Usage: asiyst [command]
316
-
317
- Commands:
318
- init Connect the current project
319
- login Authenticate in the browser
320
- logout Remove local CLI session information
321
- status Show safe project status
322
- verify Verify the live SDK integration
323
- doctor Diagnose the local project and API
324
- dashboard Open the Asiyst dashboard
325
- --help Show this help
326
- --version Show the CLI version`);
462
+ interactiveHelp();
327
463
  }
328
464
  async function main(argv = process.argv.slice(2)) {
329
465
  const command = argv[0] || "";
330
466
  if (command === "--help" || command === "-h") return help();
331
467
  if (command === "--version" || command === "-v") return console.log(CLI_VERSION);
332
- if (command === "init") return initCommand();
468
+ if (command === "init" || command === "connect") return initCommand();
333
469
  if (command === "login") return loginCommand();
334
470
  if (command === "logout") return logoutCommand();
335
471
  if (command === "status") return statusCommand();
336
472
  if (command === "verify") return verifyCommand();
337
473
  if (command === "doctor") return doctorCommand();
474
+ if (command === "diagnostics") return doctorCommand();
338
475
  if (command === "dashboard") return dashboardCommand();
476
+ if (command === "avatar") return avatarCommand();
477
+ if (command === "trust") return trustCommand();
478
+ if (command === "revoke-trust") return revokeTrustCommand();
479
+ if (command === "help") return help();
480
+ if (command === "version") return console.log(CLI_VERSION);
339
481
  banner();
340
- const project = detectProject();
341
- projectChecks(project);
342
482
  if (!process.stdin.isTTY) {
483
+ const project = detectProject();
484
+ projectChecks(project);
343
485
  console.log("\nRun `npx asiyst init` to connect this project, or `npx asiyst --help` for commands.");
344
486
  return;
345
487
  }
346
- console.log("\nWhat would you like to do?\n\n1. Connect this project\n2. Verify installation\n3. View project status\n4. Open dashboard\n5. Run diagnostics\n6. Exit\n");
347
- const readline = createInterface2({ input: input2, output: output2 });
348
- const choice = await readline.question("Select an option [1-6]: ");
349
- readline.close();
350
- if (choice === "1") return initCommand();
351
- if (choice === "2") return verifyCommand();
352
- if (choice === "3") return statusCommand();
353
- if (choice === "4") return dashboardCommand();
354
- if (choice === "5") return doctorCommand();
488
+ return interactiveHome();
355
489
  }
356
490
  if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
357
491
  main().catch((error) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/output.ts","../src/detection/project.ts","../src/api/client.ts","../src/config/local.ts","../src/commands/shared.ts","../src/browser/open.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/status.ts","../src/commands/verify.ts","../src/commands/doctor.ts","../src/commands/dashboard.ts","../src/index.ts"],"sourcesContent":["import type { ProjectDetection, VerificationResult } from \"../types.js\";\r\n\r\nexport const ok = (label: string, detail = \"\") => console.log(`✓ ${label}${detail ? ` (${detail})` : \"\"}`);\r\nexport const fail = (label: string, detail = \"\") => console.log(`✗ ${label}${detail ? `: ${detail}` : \"\"}`);\r\nexport function banner(): void {\r\n console.log(\"\\n╭────────────────────────────────────╮\\n│ ASIIYST │\\n│ AI Assistant Platform │\\n╰────────────────────────────────────╯\\n\");\r\n}\r\nexport function projectChecks(project: ProjectDetection): void {\r\n project.packageJson ? ok(\"Project detected\") : fail(\"Project not detected\", \"package.json is missing\");\r\n process.version ? ok(\"Node.js detected\", process.version) : fail(\"Node.js not detected\");\r\n ok(\"npm detected\", \"use npm to install dependencies\");\r\n ok(\"Framework detected\", project.framework);\r\n project.sdkVersion ? ok(\"@asiyst/sdk detected\", project.sdkVersion) : fail(\"@asiyst/sdk is not installed\", \"npm install @asiyst/sdk\");\r\n}\r\nexport function printVerification(results: VerificationResult[]): boolean {\r\n console.log(\"\\nAsiyst Installation Verification\\n\");\r\n for (const result of results) result.ok ? ok(result.name, result.detail) : fail(result.name, result.detail);\r\n const success = results.length > 0 && results.every((result) => result.ok);\r\n if (success) console.log(\"\\n────────────────────────────\\n\\nASIYST IS READY ✓\");\r\n return success;\r\n}\r\n","import { existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ProjectDetection } from \"../types.js\";\r\n\r\nfunction dependencyVersion(pkg: Record<string, unknown>): string | undefined {\r\n const sections = [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"optionalDependencies\"];\r\n for (const section of sections) {\r\n const values = pkg[section];\r\n if (values && typeof values === \"object\" && \"@asiyst/sdk\" in values) {\r\n const version = (values as Record<string, unknown>)[\"@asiyst/sdk\"];\r\n return typeof version === \"string\" ? version : undefined;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function detectFramework(cwd: string, pkg: Record<string, unknown> | null): string {\r\n const deps: Record<string, unknown> = Object.assign({}, pkg?.dependencies, pkg?.devDependencies);\r\n if (typeof deps.next === \"string\") return \"Next.js\";\r\n if (typeof deps.react === \"string\") return \"React\";\r\n if (typeof deps.vite === \"string\") return \"Vite\";\r\n if (typeof deps.vue === \"string\") return \"Vue\";\r\n if (existsSync(resolve(cwd, \"vite.config.ts\")) || existsSync(resolve(cwd, \"vite.config.js\"))) return \"Vite\";\r\n if (existsSync(resolve(cwd, \"next.config.js\")) || existsSync(resolve(cwd, \"next.config.mjs\"))) return \"Next.js\";\r\n return \"Vanilla JavaScript/TypeScript\";\r\n}\r\n\r\nfunction readEnv(cwd: string): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const path = resolve(cwd, \".env\");\r\n if (!existsSync(path)) return result;\r\n for (const line of readFileSync(path, \"utf8\").split(/\\r?\\n/)) {\r\n const match = /^\\s*(?:export\\s+)?([A-Z0-9_]+)\\s*=\\s*(.*?)\\s*$/.exec(line);\r\n if (match && !match[1].toLowerCase().includes(\"secret\") && !match[1].toLowerCase().includes(\"token\")) {\r\n result[match[1]] = match[2].replace(/^(['\"])(.*)\\1$/, \"$2\");\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function detectProject(cwd = process.cwd()): ProjectDetection {\r\n const path = resolve(cwd, \"package.json\");\r\n let packageJson: Record<string, unknown> | null = null;\r\n if (existsSync(path)) {\r\n try {\r\n const value: unknown = JSON.parse(readFileSync(path, \"utf8\"));\r\n if (value && typeof value === \"object\" && !Array.isArray(value)) packageJson = value as Record<string, unknown>;\r\n } catch {\r\n packageJson = null;\r\n }\r\n }\r\n const env = { ...readEnv(cwd), ...process.env } as Record<string, string | undefined>;\r\n return {\r\n cwd,\r\n packageJson,\r\n sdkVersion: packageJson ? dependencyVersion(packageJson) : undefined,\r\n framework: detectFramework(cwd, packageJson),\r\n config: {\r\n projectId: env.ASIIYST_PROJECT_ID,\r\n publicKey: env.ASIIYST_PUBLIC_KEY,\r\n },\r\n };\r\n}\r\n","import type { CliSession, SafeProjectInfo, SessionState, VerificationResult } from \"../types.js\";\r\n\r\nexport class ApiError extends Error {\r\n constructor(message: string, readonly status?: number) {\r\n super(message);\r\n this.name = \"ApiError\";\r\n }\r\n}\r\n\r\nexport class ApiClient {\r\n readonly baseUrl: string;\r\n constructor(baseUrl = process.env.ASIIYST_API_URL || \"https://asiyst.com\", private readonly fetcher: typeof fetch = fetch) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\r\n }\r\n\r\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\r\n let response: Response;\r\n try {\r\n response = await this.fetcher(`${this.baseUrl}${path}`, {\r\n ...init,\r\n headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\", ...init?.headers },\r\n });\r\n } catch (error) {\r\n throw new ApiError(`Unable to reach Asiyst API: ${error instanceof Error ? error.message : \"network error\"}`);\r\n }\r\n const body: unknown = await response.json().catch(() => undefined);\r\n if (!response.ok) throw new ApiError(`Asiyst API returned HTTP ${response.status}`, response.status);\r\n return body as T;\r\n }\r\n\r\n createSession(): Promise<CliSession> {\r\n return this.request<unknown>(\"/api/cli/sessions\", { method: \"POST\", body: JSON.stringify({}) }).then((value) => {\r\n if (!value || typeof value !== \"object\") throw new ApiError(\"Asiyst returned an invalid session response\");\r\n const session = value as Record<string, unknown>;\r\n if (typeof session.sessionId !== \"string\" || typeof session.connectUrl !== \"string\" || typeof session.expiresAt !== \"string\") {\r\n throw new ApiError(\"Asiyst returned an invalid session response\");\r\n }\r\n const url = new URL(session.connectUrl);\r\n const localApi = this.baseUrl.startsWith(\"http://localhost\") || this.baseUrl.startsWith(\"http://127.0.0.1\");\r\n if (url.protocol !== \"https:\" && !(localApi && url.protocol === \"http:\")) {\r\n throw new ApiError(\"Asiyst returned an insecure connection URL\");\r\n }\r\n return { sessionId: session.sessionId, connectUrl: url.toString(), expiresAt: session.expiresAt };\r\n });\r\n }\r\n\r\n sessionStatus(sessionId: string): Promise<{ state: SessionState; project?: SafeProjectInfo }> {\r\n return this.request(`/api/cli/sessions/${encodeURIComponent(sessionId)}/status`);\r\n }\r\n\r\n projectInfo(projectId: string): Promise<SafeProjectInfo> {\r\n return this.request(`/api/cli/projects/${encodeURIComponent(projectId)}`);\r\n }\r\n\r\n verify(projectId: string, publicKey: string, domain?: string): Promise<VerificationResult[]> {\r\n return this.request<unknown>(\"/api/cli/verification\", {\r\n method: \"POST\",\r\n body: JSON.stringify({ projectId, publicKey, domain }),\r\n }).then((value) => {\r\n if (!Array.isArray(value) || !value.every((item) => item && typeof item === \"object\" && typeof (item as Record<string, unknown>).name === \"string\" && typeof (item as Record<string, unknown>).ok === \"boolean\")) {\r\n throw new ApiError(\"Asiyst returned an invalid verification response\");\r\n }\r\n return value as VerificationResult[];\r\n });\r\n }\r\n}\r\n","import { existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ProjectDetection } from \"../types.js\";\r\n\r\nexport function hasConfiguration(project: ProjectDetection): boolean {\r\n return Boolean(project.config.projectId && project.config.publicKey);\r\n}\r\n\r\nexport function configWarning(cwd: string): string | undefined {\r\n const envPath = resolve(cwd, \".env\");\r\n if (existsSync(envPath)) {\r\n const ignored = existsSync(resolve(cwd, \".gitignore\")) &&\r\n readFileSync(resolve(cwd, \".gitignore\"), \"utf8\").split(/\\r?\\n/).some((line) => line.trim() === \".env\" || line.trim() === \".env.*\");\r\n if (!ignored) return \"Your .env file is not clearly ignored by .gitignore; do not commit public or private configuration accidentally.\";\r\n }\r\n return undefined;\r\n}\r\n","import { createInterface } from \"node:readline/promises\";\r\nimport { stdin as input, stdout as output } from \"node:process\";\r\nimport { ApiClient } from \"../api/client.js\";\r\nimport { openBrowser } from \"../browser/open.js\";\r\nimport type { CliSession, SafeProjectInfo } from \"../types.js\";\r\n\r\nexport async function connect(api = new ApiClient()): Promise<{ session: CliSession; project?: SafeProjectInfo }> {\r\n const session = await api.createSession();\r\n console.log(`Opening Asiyst...\\n${session.connectUrl}`);\r\n if (!(await openBrowser(session.connectUrl))) console.log(\"Automatic browser opening failed; open the URL above.\");\r\n console.log(\"● Waiting for authentication\\n● Waiting for project selection\\n● Waiting for connection\");\r\n const expires = Date.parse(session.expiresAt);\r\n for (;;) {\r\n const result = await api.sessionStatus(session.sessionId);\r\n if (result.state === \"completed\") return { session, project: result.project };\r\n if (result.state === \"expired\") throw new Error(\"Connection session expired.\");\r\n if (result.state === \"cancelled\") throw new Error(\"Connection session was cancelled.\");\r\n if (Number.isFinite(expires) && Date.now() >= expires) throw new Error(\"Connection session expired.\");\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n }\r\n}\r\n\r\nexport async function confirm(question: string): Promise<boolean> {\r\n if (!process.stdin.isTTY) return true;\r\n const readline = createInterface({ input, output });\r\n const answer = await readline.question(`${question} [y/N] `);\r\n readline.close();\r\n return /^y(es)?$/i.test(answer.trim());\r\n}\r\n","import { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nconst execFileAsync = promisify(execFile);\r\n\r\nexport async function openBrowser(url: string): Promise<boolean> {\r\n const command = process.platform === \"win32\" ? \"rundll32.exe\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\r\n const args = process.platform === \"win32\" ? [\"url.dll,FileProtocolHandler\", url] : [url];\r\n try {\r\n await execFileAsync(command, args);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { configWarning, hasConfiguration } from \"../config/local.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { ok } from \"../ui/output.js\";\r\nimport { connect, confirm } from \"./shared.js\";\r\n\r\nexport async function initCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n if (!project.packageJson) throw new Error(\"No package.json found. Run this command from your website project.\");\r\n console.log(`Detected ${project.framework} project.`);\r\n if (!project.sdkVersion) {\r\n console.log(\"\\n@asiyst/sdk is not installed.\\nRun: npm install @asiyst/sdk\");\r\n return;\r\n }\r\n if (!(await confirm(\"Connect this project to Asiyst?\"))) return;\r\n const result = await connect(api);\r\n ok(\"Asiyst account connected\");\r\n ok(\"Project connected\", result.project?.projectName);\r\n if (result.project?.projectId) {\r\n console.log(`\\nProject ID: ${result.project.projectId}\\nPublic Key: ${result.project.publicKey || project.config.publicKey || \"Use the public key from the Asiyst project settings.\"}`);\r\n }\r\n const warning = configWarning(cwd);\r\n if (warning) console.log(`\\nWarning: ${warning}`);\r\n console.log(\"\\nUse the public SDK API:\\n\\nimport { Asiyst } from \\\"@asiyst/sdk\\\";\\n\\nawait Asiyst.init({ projectId: \\\"PROJECT_ID\\\", publicKey: \\\"PUBLIC_KEY\\\" });\");\r\n console.log(\"\\nRun `npx asiyst verify` after starting your website.\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { connect } from \"./shared.js\";\r\nexport async function loginCommand(api = new ApiClient()): Promise<void> {\r\n await connect(api);\r\n console.log(\"✓ Already connected to Asiyst.\");\r\n}\r\n","export function logoutCommand(): void {\r\n console.log(\"✓ Local CLI session information removed (the CLI does not store passwords or private credentials).\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nexport async function statusCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n console.log(`Project name: ${typeof project.packageJson?.name === \"string\" ? project.packageJson.name : \"Unknown\"}\\nSDK version: ${project.sdkVersion || \"Not installed\"}`);\r\n if (!project.config.projectId) { console.log(\"Connection status: Not configured\"); return; }\r\n const info = await api.projectInfo(project.config.projectId);\r\n for (const [key, value] of Object.entries(info)) if (value !== undefined) console.log(`${key}: ${value}`);\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { printVerification, ok, fail } from \"../ui/output.js\";\r\nexport async function verifyCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n if (!project.packageJson) { fail(\"Project detected\", \"package.json is missing\"); process.exitCode = 1; return; }\r\n ok(\"Project detected\");\r\n if (!project.sdkVersion) { fail(\"SDK installed\", \"npm install @asiyst/sdk\"); process.exitCode = 1; return; }\r\n ok(\"SDK installed\", project.sdkVersion);\r\n if (!project.config.projectId || !project.config.publicKey) { fail(\"Configuration found\", \"set ASIIYST_PROJECT_ID and ASIIYST_PUBLIC_KEY\"); process.exitCode = 1; return; }\r\n ok(\"Configuration found\");\r\n try {\r\n const results = await api.verify(project.config.projectId, project.config.publicKey, process.env.ASIIYST_DOMAIN);\r\n if (!printVerification(results)) process.exitCode = 1;\r\n } catch (error) {\r\n fail(\"API reachable\", error instanceof Error ? error.message : \"verification failed\");\r\n process.exitCode = 1;\r\n }\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { ok, fail } from \"../ui/output.js\";\r\nexport async function doctorCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n ok(\"System\", process.platform);\r\n ok(\"Node.js\", process.version);\r\n ok(\"npm\", \"available through npm\");\r\n project.packageJson ? ok(\"Project\", cwd) : fail(\"Project\", \"package.json is missing\");\r\n project.sdkVersion ? ok(\"SDK\", project.sdkVersion) : fail(\"SDK\", \"not installed\");\r\n project.config.projectId && project.config.publicKey ? ok(\"Configuration\") : fail(\"Configuration\", \"public project values are missing\");\r\n try { await api.projectInfo(project.config.projectId || \"\"); ok(\"Asiyst API\"); } catch (error) { fail(\"Asiyst API\", error instanceof Error ? error.message : \"unreachable\"); }\r\n}\r\n","import { openBrowser } from \"../browser/open.js\";\r\nexport async function dashboardCommand(): Promise<void> {\r\n const url = \"https://asiyst.com/dashboard\";\r\n if (!(await openBrowser(url))) console.log(`Open ${url}`);\r\n else console.log(`Opening ${url}`);\r\n}\r\n","import { banner, projectChecks } from \"./ui/output.js\";\r\nimport { detectProject } from \"./detection/project.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport { loginCommand } from \"./commands/login.js\";\r\nimport { logoutCommand } from \"./commands/logout.js\";\r\nimport { statusCommand } from \"./commands/status.js\";\r\nimport { verifyCommand } from \"./commands/verify.js\";\r\nimport { doctorCommand } from \"./commands/doctor.js\";\r\nimport { dashboardCommand } from \"./commands/dashboard.js\";\r\nimport { createInterface } from \"node:readline/promises\";\r\nimport { stdin as input, stdout as output } from \"node:process\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nexport const CLI_VERSION = \"0.2.0\";\r\nfunction help(): void {\r\n console.log(`Asiyst CLI ${CLI_VERSION}\\n\\nUsage: asiyst [command]\\n\\nCommands:\\n init Connect the current project\\n login Authenticate in the browser\\n logout Remove local CLI session information\\n status Show safe project status\\n verify Verify the live SDK integration\\n doctor Diagnose the local project and API\\n dashboard Open the Asiyst dashboard\\n --help Show this help\\n --version Show the CLI version`);\r\n}\r\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\r\n const command = argv[0] || \"\";\r\n if (command === \"--help\" || command === \"-h\") return help();\r\n if (command === \"--version\" || command === \"-v\") return console.log(CLI_VERSION);\r\n if (command === \"init\") return initCommand();\r\n if (command === \"login\") return loginCommand();\r\n if (command === \"logout\") return logoutCommand();\r\n if (command === \"status\") return statusCommand();\r\n if (command === \"verify\") return verifyCommand();\r\n if (command === \"doctor\") return doctorCommand();\r\n if (command === \"dashboard\") return dashboardCommand();\r\n banner();\r\n const project = detectProject();\r\n projectChecks(project);\r\n if (!process.stdin.isTTY) {\r\n console.log(\"\\nRun `npx asiyst init` to connect this project, or `npx asiyst --help` for commands.\");\r\n return;\r\n }\r\n console.log(\"\\nWhat would you like to do?\\n\\n1. Connect this project\\n2. Verify installation\\n3. View project status\\n4. Open dashboard\\n5. Run diagnostics\\n6. Exit\\n\");\r\n const readline = createInterface({ input, output });\r\n const choice = await readline.question(\"Select an option [1-6]: \");\r\n readline.close();\r\n if (choice === \"1\") return initCommand();\r\n if (choice === \"2\") return verifyCommand();\r\n if (choice === \"3\") return statusCommand();\r\n if (choice === \"4\") return dashboardCommand();\r\n if (choice === \"5\") return doctorCommand();\r\n}\r\nif (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {\r\n main().catch((error: unknown) => { console.error(`\\nError: ${error instanceof Error ? error.message : \"command failed\"}`); process.exitCode = 1; });\r\n}\r\n"],"mappings":"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","names":["existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","createInterface","input","output"]}
1
+ {"version":3,"sources":["../src/ui/output.ts","../src/detection/project.ts","../src/api/client.ts","../src/config/local.ts","../src/commands/shared.ts","../src/browser/open.ts","../src/config/trust.ts","../src/commands/trust.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/status.ts","../src/commands/verify.ts","../src/commands/doctor.ts","../src/commands/dashboard.ts","../src/commands/avatar.ts","../src/commands/interactive.ts","../src/index.ts"],"sourcesContent":["import type { ProjectDetection, VerificationResult } from \"../types.js\";\r\n\r\nexport const ok = (label: string, detail = \"\") => console.log(`✓ ${label}${detail ? ` (${detail})` : \"\"}`);\r\nexport const fail = (label: string, detail = \"\") => console.log(`✗ ${label}${detail ? `: ${detail}` : \"\"}`);\r\nexport function banner(): void {\r\n console.log(`\\n╭──────────────────────────────────────────────╮\\n│ │\\n│ ASIYST │\\n│ AI ASSISTANT PLATFORM │\\n│ v0.2.0 │\\n│ │\\n╰──────────────────────────────────────────────╯\\n`);\r\n}\r\nexport function projectChecks(project: ProjectDetection): void {\r\n project.packageJson ? ok(\"Project detected\", typeof project.packageJson.name === \"string\" ? project.packageJson.name : project.cwd) : fail(\"Project not detected\", \"package.json is missing\");\r\n ok(\"Framework detected\", project.framework);\r\n ok(\"Language detected\", project.language);\r\n ok(\"Node.js detected\", process.version);\r\n ok(\"Package manager detected\", project.packageManager);\r\n project.sdkVersion ? ok(\"@asiyst/sdk detected\", project.sdkVersion) : fail(\"@asiyst/sdk is not installed\", \"npm install @asiyst/sdk\");\r\n}\r\nexport function homeStatus(project: ProjectDetection, connection = \"Not connected\"): void {\r\n console.log(\"\\nPROJECT STATUS\");\r\n console.log(` Project ${typeof project.packageJson?.name === \"string\" ? project.packageJson.name : \"Not detected\"}\\n Framework ${project.framework}\\n Language ${project.language}\\n Node.js ${process.version}\\n Package Manager ${project.packageManager}\\n @asiyst/sdk ${project.sdkVersion || \"Not installed\"}`);\r\n console.log(\"\\nASIYST STATUS\");\r\n console.log(` Connection ${connection}\\n Avatar Not configured\\n AI Provider Not configured\\n Project ID ${project.config.projectId || \"—\"}`);\r\n if (connection === \"Not connected\") console.log(\"\\n Connect website to show stats.\");\r\n}\r\nexport function printVerification(results: VerificationResult[]): boolean {\r\n console.log(\"\\nAsiyst Installation Verification\\n\");\r\n for (const result of results) result.ok ? ok(result.name, result.detail) : fail(result.name, result.detail);\r\n const success = results.length > 0 && results.every((result) => result.ok);\r\n if (success) console.log(\"\\n────────────────────────────\\n\\nASIYST IS READY ✓\");\r\n return success;\r\n}\r\n","import { existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ProjectDetection } from \"../types.js\";\r\n\r\nfunction dependencyVersion(pkg: Record<string, unknown>): string | undefined {\r\n const sections = [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"optionalDependencies\"];\r\n for (const section of sections) {\r\n const values = pkg[section];\r\n if (values && typeof values === \"object\" && \"@asiyst/sdk\" in values) {\r\n const version = (values as Record<string, unknown>)[\"@asiyst/sdk\"];\r\n return typeof version === \"string\" ? version : undefined;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function detectFramework(cwd: string, pkg: Record<string, unknown> | null): string {\r\n const deps: Record<string, unknown> = Object.assign({}, pkg?.dependencies, pkg?.devDependencies);\r\n if (typeof deps.next === \"string\") return \"Next.js\";\r\n if (typeof deps.react === \"string\") return \"React\";\r\n if (typeof deps.vite === \"string\") return \"Vite\";\r\n if (typeof deps.vue === \"string\") return \"Vue\";\r\n if (existsSync(resolve(cwd, \"vite.config.ts\")) || existsSync(resolve(cwd, \"vite.config.js\"))) return \"Vite\";\r\n if (existsSync(resolve(cwd, \"next.config.js\")) || existsSync(resolve(cwd, \"next.config.mjs\"))) return \"Next.js\";\r\n return \"Vanilla JavaScript/TypeScript\";\r\n}\r\n\r\nfunction readEnv(cwd: string): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const path = resolve(cwd, \".env\");\r\n if (!existsSync(path)) return result;\r\n for (const line of readFileSync(path, \"utf8\").split(/\\r?\\n/)) {\r\n const match = /^\\s*(?:export\\s+)?([A-Z0-9_]+)\\s*=\\s*(.*?)\\s*$/.exec(line);\r\n if (match && !match[1].toLowerCase().includes(\"secret\") && !match[1].toLowerCase().includes(\"token\")) {\r\n result[match[1]] = match[2].replace(/^(['\"])(.*)\\1$/, \"$2\");\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function detectProject(cwd = process.cwd()): ProjectDetection {\r\n const path = resolve(cwd, \"package.json\");\r\n let packageJson: Record<string, unknown> | null = null;\r\n if (existsSync(path)) {\r\n try {\r\n const value: unknown = JSON.parse(readFileSync(path, \"utf8\"));\r\n if (value && typeof value === \"object\" && !Array.isArray(value)) packageJson = value as Record<string, unknown>;\r\n } catch {\r\n packageJson = null;\r\n }\r\n }\r\n const env = { ...readEnv(cwd), ...process.env } as Record<string, string | undefined>;\r\n const packageManager = existsSync(resolve(cwd, \"pnpm-lock.yaml\")) ? \"pnpm\" :\r\n existsSync(resolve(cwd, \"yarn.lock\")) ? \"yarn\" :\r\n existsSync(resolve(cwd, \"bun.lockb\")) || existsSync(resolve(cwd, \"bun.lock\")) ? \"bun\" : \"npm\";\r\n const sourceFiles = [\"tsconfig.json\", \"src\", \"app\"].some((entry) => existsSync(resolve(cwd, entry)));\r\n return {\r\n cwd,\r\n packageJson,\r\n sdkVersion: packageJson ? dependencyVersion(packageJson) : undefined,\r\n framework: detectFramework(cwd, packageJson),\r\n language: sourceFiles ? \"TypeScript\" : \"JavaScript\",\r\n packageManager,\r\n config: {\r\n projectId: env.ASIIYST_PROJECT_ID,\r\n publicKey: env.ASIIYST_PUBLIC_KEY,\r\n },\r\n };\r\n}\r\n","import type { CliSession, SafeProjectInfo, SessionState, VerificationResult } from \"../types.js\";\r\n\r\nexport class ApiError extends Error {\r\n constructor(message: string, readonly status?: number) {\r\n super(message);\r\n this.name = \"ApiError\";\r\n }\r\n}\r\n\r\nexport class ApiClient {\r\n readonly baseUrl: string;\r\n constructor(baseUrl = process.env.ASIIYST_API_URL || \"https://asiyst.com\", private readonly fetcher: typeof fetch = fetch) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\r\n }\r\n\r\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\r\n let response: Response;\r\n try {\r\n response = await this.fetcher(`${this.baseUrl}${path}`, {\r\n ...init,\r\n headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\", ...init?.headers },\r\n });\r\n } catch (error) {\r\n throw new ApiError(`Unable to reach Asiyst API: ${error instanceof Error ? error.message : \"network error\"}`);\r\n }\r\n const body: unknown = await response.json().catch(() => undefined);\r\n if (!response.ok) throw new ApiError(`Asiyst API returned HTTP ${response.status}`, response.status);\r\n return body as T;\r\n }\r\n\r\n createSession(): Promise<CliSession> {\r\n return this.request<unknown>(\"/api/cli/sessions\", { method: \"POST\", body: JSON.stringify({}) }).then((value) => {\r\n if (!value || typeof value !== \"object\") throw new ApiError(\"Asiyst returned an invalid session response\");\r\n const session = value as Record<string, unknown>;\r\n if (typeof session.sessionId !== \"string\" || typeof session.connectUrl !== \"string\" || typeof session.expiresAt !== \"string\") {\r\n throw new ApiError(\"Asiyst returned an invalid session response\");\r\n }\r\n const url = new URL(session.connectUrl);\r\n const localApi = this.baseUrl.startsWith(\"http://localhost\") || this.baseUrl.startsWith(\"http://127.0.0.1\");\r\n if (url.protocol !== \"https:\" && !(localApi && url.protocol === \"http:\")) {\r\n throw new ApiError(\"Asiyst returned an insecure connection URL\");\r\n }\r\n return { sessionId: session.sessionId, connectUrl: url.toString(), expiresAt: session.expiresAt };\r\n });\r\n }\r\n\r\n sessionStatus(sessionId: string): Promise<{ state: SessionState; project?: SafeProjectInfo }> {\r\n return this.request(`/api/cli/sessions/${encodeURIComponent(sessionId)}/status`);\r\n }\r\n\r\n projectInfo(projectId: string): Promise<SafeProjectInfo> {\r\n return this.request(`/api/cli/projects/${encodeURIComponent(projectId)}`);\r\n }\r\n\r\n verify(projectId: string, publicKey: string, domain?: string): Promise<VerificationResult[]> {\r\n return this.request<unknown>(\"/api/cli/verification\", {\r\n method: \"POST\",\r\n body: JSON.stringify({ projectId, publicKey, domain }),\r\n }).then((value) => {\r\n if (!Array.isArray(value) || !value.every((item) => item && typeof item === \"object\" && typeof (item as Record<string, unknown>).name === \"string\" && typeof (item as Record<string, unknown>).ok === \"boolean\")) {\r\n throw new ApiError(\"Asiyst returned an invalid verification response\");\r\n }\r\n return value as VerificationResult[];\r\n });\r\n }\r\n}\r\n","import { existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve } from \"node:path\";\r\nimport type { ProjectDetection } from \"../types.js\";\r\n\r\nexport function hasConfiguration(project: ProjectDetection): boolean {\r\n return Boolean(project.config.projectId && project.config.publicKey);\r\n}\r\n\r\nexport function configWarning(cwd: string): string | undefined {\r\n const envPath = resolve(cwd, \".env\");\r\n if (existsSync(envPath)) {\r\n const ignored = existsSync(resolve(cwd, \".gitignore\")) &&\r\n readFileSync(resolve(cwd, \".gitignore\"), \"utf8\").split(/\\r?\\n/).some((line) => line.trim() === \".env\" || line.trim() === \".env.*\");\r\n if (!ignored) return \"Your .env file is not clearly ignored by .gitignore; do not commit public or private configuration accidentally.\";\r\n }\r\n return undefined;\r\n}\r\n","import { createInterface } from \"node:readline/promises\";\r\nimport { stdin as input, stdout as output } from \"node:process\";\r\nimport { ApiClient } from \"../api/client.js\";\r\nimport { openBrowser } from \"../browser/open.js\";\r\nimport type { CliSession, SafeProjectInfo } from \"../types.js\";\r\n\r\nexport async function connect(api = new ApiClient()): Promise<{ session: CliSession; project?: SafeProjectInfo }> {\r\n const session = await api.createSession();\r\n console.log(`Opening Asiyst...\\n${session.connectUrl}`);\r\n if (!(await openBrowser(session.connectUrl))) console.log(\"Automatic browser opening failed; open the URL above.\");\r\n console.log(\"● Waiting for authentication\\n● Waiting for project selection\\n● Waiting for connection\");\r\n const expires = Date.parse(session.expiresAt);\r\n for (;;) {\r\n const result = await api.sessionStatus(session.sessionId);\r\n if (result.state === \"completed\") return { session, project: result.project };\r\n if (result.state === \"expired\") throw new Error(\"Connection session expired.\");\r\n if (result.state === \"cancelled\") throw new Error(\"Connection session was cancelled.\");\r\n if (Number.isFinite(expires) && Date.now() >= expires) throw new Error(\"Connection session expired.\");\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n }\r\n}\r\n\r\nexport async function confirm(question: string): Promise<boolean> {\r\n if (!process.stdin.isTTY) return true;\r\n const readline = createInterface({ input, output });\r\n const answer = await readline.question(`${question} [y/N] `);\r\n readline.close();\r\n return /^y(es)?$/i.test(answer.trim());\r\n}\r\n","import { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nconst execFileAsync = promisify(execFile);\r\n\r\nexport async function openBrowser(url: string): Promise<boolean> {\r\n const command = process.platform === \"win32\" ? \"rundll32.exe\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\r\n const args = process.platform === \"win32\" ? [\"url.dll,FileProtocolHandler\", url] : [url];\r\n try {\r\n await execFileAsync(command, args);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { join, resolve } from \"node:path\";\r\n\r\nconst trustFile = join(homedir(), \".config\", \"asiyst\", \"trusted-folders.json\");\r\n\r\nfunction readTrusted(): string[] {\r\n if (!existsSync(trustFile)) return [];\r\n try {\r\n const parsed: unknown = JSON.parse(readFileSync(trustFile, \"utf8\"));\r\n return Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\") ? parsed : [];\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport function isTrusted(cwd: string): boolean {\r\n return readTrusted().includes(resolve(cwd));\r\n}\r\n\r\nexport function trustFolder(cwd: string): void {\r\n const folder = resolve(cwd);\r\n const trusted = readTrusted();\r\n if (!trusted.includes(folder)) trusted.push(folder);\r\n mkdirSync(join(homedir(), \".config\", \"asiyst\"), { recursive: true, mode: 0o700 });\r\n writeFileSync(trustFile, JSON.stringify(trusted, null, 2), { encoding: \"utf8\", mode: 0o600 });\r\n}\r\n\r\nexport function revokeTrust(cwd: string): void {\r\n const folder = resolve(cwd);\r\n const trusted = readTrusted().filter((item) => item !== folder);\r\n if (existsSync(trustFile)) writeFileSync(trustFile, JSON.stringify(trusted, null, 2), { encoding: \"utf8\", mode: 0o600 });\r\n}\r\n","import { isTrusted, revokeTrust, trustFolder } from \"../config/trust.js\";\r\nimport { confirm } from \"./shared.js\";\r\nexport async function ensureTrusted(cwd = process.cwd()): Promise<boolean> {\r\n if (isTrusted(cwd)) return true;\r\n if (!(await confirm(`Trust this project folder?\\n${cwd}\\n\\nAsiyst may read project files and modify Asiyst configuration during setup.`))) {\r\n console.log(\"Folder not trusted.\\nAsiyst setup cancelled.\");\r\n return false;\r\n }\r\n trustFolder(cwd);\r\n console.log(\"✓ Folder trusted.\");\r\n return true;\r\n}\r\nexport async function trustCommand(cwd = process.cwd()): Promise<void> { await ensureTrusted(cwd); }\r\nexport function revokeTrustCommand(cwd = process.cwd()): void { revokeTrust(cwd); console.log(\"✓ Folder trust revoked.\"); }\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { configWarning, hasConfiguration } from \"../config/local.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { ok } from \"../ui/output.js\";\r\nimport { connect, confirm } from \"./shared.js\";\r\nimport { ensureTrusted } from \"./trust.js\";\r\n\r\nexport async function initCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n if (!(await ensureTrusted(cwd))) return;\r\n const project = detectProject(cwd);\r\n if (!project.packageJson) throw new Error(\"No package.json found. Run this command from your website project.\");\r\n console.log(`Detected ${project.framework} project.`);\r\n if (!project.sdkVersion) {\r\n console.log(\"\\n@asiyst/sdk is not installed.\\nRun: npm install @asiyst/sdk\");\r\n return;\r\n }\r\n if (!(await confirm(\"Connect this project to Asiyst?\"))) return;\r\n const result = await connect(api);\r\n ok(\"Asiyst account connected\");\r\n ok(\"Project connected\", result.project?.projectName);\r\n if (result.project?.projectId) {\r\n console.log(`\\nProject ID: ${result.project.projectId}\\nPublic Key: ${result.project.publicKey || project.config.publicKey || \"Use the public key from the Asiyst project settings.\"}`);\r\n }\r\n const warning = configWarning(cwd);\r\n if (warning) console.log(`\\nWarning: ${warning}`);\r\n console.log(\"\\nUse the public SDK API:\\n\\nimport { Asiyst } from \\\"@asiyst/sdk\\\";\\n\\nawait Asiyst.init({ projectId: \\\"PROJECT_ID\\\", publicKey: \\\"PUBLIC_KEY\\\" });\");\r\n console.log(\"\\nRun `npx asiyst verify` after starting your website.\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { connect } from \"./shared.js\";\r\nexport async function loginCommand(api = new ApiClient()): Promise<void> {\r\n await connect(api);\r\n console.log(\"✓ Already connected to Asiyst.\");\r\n}\r\n","export function logoutCommand(): void {\r\n console.log(\"✓ Local CLI session information removed (the CLI does not store passwords or private credentials).\");\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nexport async function statusCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n console.log(`Project name: ${typeof project.packageJson?.name === \"string\" ? project.packageJson.name : \"Unknown\"}\\nSDK version: ${project.sdkVersion || \"Not installed\"}`);\r\n if (!project.config.projectId) { console.log(\"Connection status: Not configured\"); return; }\r\n const info = await api.projectInfo(project.config.projectId);\r\n for (const [key, value] of Object.entries(info)) if (value !== undefined) console.log(`${key}: ${value}`);\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { printVerification, ok, fail } from \"../ui/output.js\";\r\nexport async function verifyCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n if (!project.packageJson) { fail(\"Project detected\", \"package.json is missing\"); process.exitCode = 1; return; }\r\n ok(\"Project detected\");\r\n if (!project.sdkVersion) { fail(\"SDK installed\", \"npm install @asiyst/sdk\"); process.exitCode = 1; return; }\r\n ok(\"SDK installed\", project.sdkVersion);\r\n if (!project.config.projectId || !project.config.publicKey) { fail(\"Configuration found\", \"set ASIIYST_PROJECT_ID and ASIIYST_PUBLIC_KEY\"); process.exitCode = 1; return; }\r\n ok(\"Configuration found\");\r\n try {\r\n const results = await api.verify(project.config.projectId, project.config.publicKey, process.env.ASIIYST_DOMAIN);\r\n if (!printVerification(results)) process.exitCode = 1;\r\n } catch (error) {\r\n fail(\"API reachable\", error instanceof Error ? error.message : \"verification failed\");\r\n process.exitCode = 1;\r\n }\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { ok, fail } from \"../ui/output.js\";\r\nexport async function doctorCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n ok(\"System\", process.platform);\r\n ok(\"Node.js\", process.version);\r\n ok(\"npm\", \"available through npm\");\r\n project.packageJson ? ok(\"Project\", cwd) : fail(\"Project\", \"package.json is missing\");\r\n project.sdkVersion ? ok(\"SDK\", project.sdkVersion) : fail(\"SDK\", \"not installed\");\r\n project.config.projectId && project.config.publicKey ? ok(\"Configuration\") : fail(\"Configuration\", \"public project values are missing\");\r\n try { await api.projectInfo(project.config.projectId || \"\"); ok(\"Asiyst API\"); } catch (error) { fail(\"Asiyst API\", error instanceof Error ? error.message : \"unreachable\"); }\r\n}\r\n","import { openBrowser } from \"../browser/open.js\";\r\nexport async function dashboardCommand(): Promise<void> {\r\n const configured = process.env.ASIIYST_DASHBOARD_URL || \"https://asiyst.com/dashboard\";\r\n const parsed = new URL(configured);\r\n if (parsed.protocol !== \"https:\" && !(parsed.hostname === \"localhost\" && parsed.protocol === \"http:\")) throw new Error(\"Configured dashboard URL must use HTTPS.\");\r\n const url = parsed.toString();\r\n if (!(await openBrowser(url))) console.log(`Open ${url}`);\r\n else console.log(`Opening ${url}`);\r\n}\r\n","import { ApiClient } from \"../api/client.js\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { openBrowser } from \"../browser/open.js\";\r\nexport async function avatarCommand(cwd = process.cwd(), api = new ApiClient()): Promise<void> {\r\n const project = detectProject(cwd);\r\n if (!project.config.projectId) {\r\n console.log(\"Avatar\\n─────────────────────────────\\nNo avatar configured.\\n\\nCreate your avatar in the Asiyst dashboard.\");\r\n const url = \"https://asiyst.com/dashboard/avatar\";\r\n if (await openBrowser(url)) console.log(`Opening ${url}`); else console.log(`Open ${url}`);\r\n return;\r\n }\r\n const info = await api.projectInfo(project.config.projectId);\r\n console.log(`Avatar\\n─────────────────────────────\\nStatus ${info.avatarStatus || \"Not configured\"}\\n\\nConfigure your avatar in the Asiyst dashboard.`);\r\n}\r\n","import { createInterface } from \"node:readline/promises\";\r\nimport { stdin as input, stdout as output } from \"node:process\";\r\nimport { detectProject } from \"../detection/project.js\";\r\nimport { homeStatus } from \"../ui/output.js\";\r\nimport { avatarCommand } from \"./avatar.js\";\r\nimport { dashboardCommand } from \"./dashboard.js\";\r\nimport { doctorCommand } from \"./doctor.js\";\r\nimport { initCommand } from \"./init.js\";\r\nimport { statusCommand } from \"./status.js\";\r\nimport { logoutCommand } from \"./logout.js\";\r\nimport { revokeTrustCommand, trustCommand } from \"./trust.js\";\r\n\r\nconst commands = [\"connect\", \"status\", \"diagnostics\", \"dashboard\", \"avatar\", \"help\", \"version\", \"trust\", \"revoke-trust\", \"logout\", \"exit\"];\r\nexport function resolveInput(value: string): string {\r\n const input = value.trim().toLowerCase();\r\n if (/^(connect|connect my website|connect this website|connect website|init)/.test(input)) return \"connect\";\r\n if (/^(status|check status|check .*installation)/.test(input)) return \"status\";\r\n if (/diagnos|doctor/.test(input)) return \"diagnostics\";\r\n if (/dashboard/.test(input)) return \"dashboard\";\r\n if (/avatar|configure my avatar|create avatar/.test(input)) return \"avatar\";\r\n if (/^(help|\\?)$/.test(input)) return \"help\";\r\n if (/^(version|--version)$/.test(input)) return \"version\";\r\n return input;\r\n}\r\nexport function interactiveHelp(): void {\r\n console.log(\"\\nASIYST CLI\\n\\nUsage: asiyst [command]\\n\\nCore Commands\\n connect Connect this project to Asiyst\\n status Show project and connection status\\n diagnostics Diagnose installation problems\\n dashboard Open Asiyst dashboard\\n avatar Manage avatar configuration\\n help Show available commands\\n version Show CLI version\\n trust Trust this project folder\\n revoke-trust Revoke folder trust\\n\\nExamples\\n asiyst connect\\n asiyst status\\n asiyst diagnostics\\n asiyst dashboard\");\r\n}\r\nexport async function interactiveHome(): Promise<void> {\r\n const project = detectProject();\r\n homeStatus(project);\r\n console.log(\"\\n> Type a command or ask anything...\\n\\nSuggestions: [connect] [status] [diagnostics] [dashboard] [avatar] [help]\");\r\n const readline = createInterface({ input, output, historySize: 50, completer: (line) => [commands.filter((item) => item.startsWith(line)), line] });\r\n readline.on(\"SIGINT\", () => readline.close());\r\n for (;;) {\r\n let value: string;\r\n try { value = await readline.question(\"\\n> \"); } catch { break; }\r\n const command = resolveInput(value);\r\n if (command === \"exit\" || command === \"quit\" || !command) break;\r\n if (command === \"connect\") await initCommand();\r\n else if (command === \"status\") await statusCommand();\r\n else if (command === \"diagnostics\") await doctorCommand();\r\n else if (command === \"dashboard\") await dashboardCommand();\r\n else if (command === \"avatar\") await avatarCommand();\r\n else if (command === \"logout\") logoutCommand();\r\n else if (command === \"trust\") await trustCommand();\r\n else if (command === \"revoke-trust\") revokeTrustCommand();\r\n else if (command === \"help\") interactiveHelp();\r\n else if (command === \"version\") console.log(\"0.2.0\");\r\n else console.log(`Unknown command: ${value}\\nRun \\`asiyst help\\` for available commands.`);\r\n }\r\n readline.close();\r\n}\r\n","import { banner, projectChecks } from \"./ui/output.js\";\r\nimport { detectProject } from \"./detection/project.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport { loginCommand } from \"./commands/login.js\";\r\nimport { logoutCommand } from \"./commands/logout.js\";\r\nimport { statusCommand } from \"./commands/status.js\";\r\nimport { verifyCommand } from \"./commands/verify.js\";\r\nimport { doctorCommand } from \"./commands/doctor.js\";\r\nimport { dashboardCommand } from \"./commands/dashboard.js\";\r\nimport { avatarCommand } from \"./commands/avatar.js\";\r\nimport { revokeTrustCommand, trustCommand } from \"./commands/trust.js\";\r\nimport { interactiveHelp, interactiveHome } from \"./commands/interactive.js\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nexport const CLI_VERSION = \"0.2.0\";\r\nfunction help(): void { interactiveHelp(); }\r\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\r\n const command = argv[0] || \"\";\r\n if (command === \"--help\" || command === \"-h\") return help();\r\n if (command === \"--version\" || command === \"-v\") return console.log(CLI_VERSION);\r\n if (command === \"init\" || command === \"connect\") return initCommand();\r\n if (command === \"login\") return loginCommand();\r\n if (command === \"logout\") return logoutCommand();\r\n if (command === \"status\") return statusCommand();\r\n if (command === \"verify\") return verifyCommand();\r\n if (command === \"doctor\") return doctorCommand();\r\n if (command === \"diagnostics\") return doctorCommand();\r\n if (command === \"dashboard\") return dashboardCommand();\r\n if (command === \"avatar\") return avatarCommand();\r\n if (command === \"trust\") return trustCommand();\r\n if (command === \"revoke-trust\") return revokeTrustCommand();\r\n if (command === \"help\") return help();\r\n if (command === \"version\") return console.log(CLI_VERSION);\r\n banner();\r\n if (!process.stdin.isTTY) {\r\n const project = detectProject();\r\n projectChecks(project);\r\n console.log(\"\\nRun `npx asiyst init` to connect this project, or `npx asiyst --help` for commands.\");\r\n return;\r\n }\r\n return interactiveHome();\r\n}\r\nif (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {\r\n main().catch((error: unknown) => { console.error(`\\nError: ${error instanceof Error ? error.message : \"command failed\"}`); process.exitCode = 1; });\r\n}\r\n"],"mappings":"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","names":["existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","existsSync","readFileSync","resolve","createInterface","input","output","input","createInterface","output"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asiyst/cli",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Connect and verify Asiyst SDK projects",
5
5
  "license": "MIT",
6
6
  "type": "module",