@asiyst/cli 0.2.0

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 ADDED
@@ -0,0 +1,31 @@
1
+ # Asiyst CLI
2
+
3
+ The `asiyst` CLI connects a website that uses `@asiyst/sdk` to an Asiyst project. It does not render the avatar, chatbot, dashboard, or analytics UI.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ npx asiyst
9
+ # or
10
+ npm install -g asiyst
11
+ ```
12
+
13
+ ## Commands
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`.
16
+
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
+
19
+ Set `ASIIYST_API_URL` for development (production defaults to `https://asiyst.com`). The current SDK accepts `projectId` and `publicKey` through its public `Asiyst.init({ ... })` API. For verification, configure `ASIIYST_PROJECT_ID` and `ASIIYST_PUBLIC_KEY` in the project environment.
20
+
21
+ ## Required web API
22
+
23
+ The web application must implement the session endpoints above, `GET /api/cli/projects/:projectId`, and `POST /api/cli/verification`. Verification must return authoritative checks for project validity, key validity, API reachability, domain authorization, SDK heartbeat, published configuration, and avatar availability. The CLI does not fabricate these results or connect directly to Supabase.
24
+
25
+ ## Development
26
+
27
+ ```sh
28
+ npm run build
29
+ npm test
30
+ npm pack --dry-run
31
+ ```
package/dist/index.js ADDED
@@ -0,0 +1,367 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/ui/output.ts
4
+ var ok = (label, detail = "") => console.log(`\u2713 ${label}${detail ? ` (${detail})` : ""}`);
5
+ var fail = (label, detail = "") => console.log(`\u2717 ${label}${detail ? `: ${detail}` : ""}`);
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");
8
+ }
9
+ 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");
13
+ ok("Framework detected", project.framework);
14
+ project.sdkVersion ? ok("@asiyst/sdk detected", project.sdkVersion) : fail("@asiyst/sdk is not installed", "npm install @asiyst/sdk");
15
+ }
16
+ function printVerification(results) {
17
+ console.log("\nAsiyst Installation Verification\n");
18
+ for (const result of results) result.ok ? ok(result.name, result.detail) : fail(result.name, result.detail);
19
+ const success = results.length > 0 && results.every((result) => result.ok);
20
+ if (success) console.log("\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\n\nASIYST IS READY \u2713");
21
+ return success;
22
+ }
23
+
24
+ // src/detection/project.ts
25
+ import { existsSync, readFileSync } from "fs";
26
+ import { resolve } from "path";
27
+ function dependencyVersion(pkg) {
28
+ const sections = ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
29
+ for (const section of sections) {
30
+ const values = pkg[section];
31
+ if (values && typeof values === "object" && "@asiyst/sdk" in values) {
32
+ const version = values["@asiyst/sdk"];
33
+ return typeof version === "string" ? version : void 0;
34
+ }
35
+ }
36
+ return void 0;
37
+ }
38
+ function detectFramework(cwd, pkg) {
39
+ const deps = Object.assign({}, pkg?.dependencies, pkg?.devDependencies);
40
+ if (typeof deps.next === "string") return "Next.js";
41
+ if (typeof deps.react === "string") return "React";
42
+ if (typeof deps.vite === "string") return "Vite";
43
+ if (typeof deps.vue === "string") return "Vue";
44
+ if (existsSync(resolve(cwd, "vite.config.ts")) || existsSync(resolve(cwd, "vite.config.js"))) return "Vite";
45
+ if (existsSync(resolve(cwd, "next.config.js")) || existsSync(resolve(cwd, "next.config.mjs"))) return "Next.js";
46
+ return "Vanilla JavaScript/TypeScript";
47
+ }
48
+ function readEnv(cwd) {
49
+ const result = {};
50
+ const path = resolve(cwd, ".env");
51
+ if (!existsSync(path)) return result;
52
+ for (const line of readFileSync(path, "utf8").split(/\r?\n/)) {
53
+ const match = /^\s*(?:export\s+)?([A-Z0-9_]+)\s*=\s*(.*?)\s*$/.exec(line);
54
+ if (match && !match[1].toLowerCase().includes("secret") && !match[1].toLowerCase().includes("token")) {
55
+ result[match[1]] = match[2].replace(/^(['"])(.*)\1$/, "$2");
56
+ }
57
+ }
58
+ return result;
59
+ }
60
+ function detectProject(cwd = process.cwd()) {
61
+ const path = resolve(cwd, "package.json");
62
+ let packageJson = null;
63
+ if (existsSync(path)) {
64
+ try {
65
+ const value = JSON.parse(readFileSync(path, "utf8"));
66
+ if (value && typeof value === "object" && !Array.isArray(value)) packageJson = value;
67
+ } catch {
68
+ packageJson = null;
69
+ }
70
+ }
71
+ const env = { ...readEnv(cwd), ...process.env };
72
+ return {
73
+ cwd,
74
+ packageJson,
75
+ sdkVersion: packageJson ? dependencyVersion(packageJson) : void 0,
76
+ framework: detectFramework(cwd, packageJson),
77
+ config: {
78
+ projectId: env.ASIIYST_PROJECT_ID,
79
+ publicKey: env.ASIIYST_PUBLIC_KEY
80
+ }
81
+ };
82
+ }
83
+
84
+ // src/api/client.ts
85
+ var ApiError = class extends Error {
86
+ constructor(message, status) {
87
+ super(message);
88
+ this.status = status;
89
+ this.name = "ApiError";
90
+ }
91
+ status;
92
+ };
93
+ var ApiClient = class {
94
+ constructor(baseUrl = process.env.ASIIYST_API_URL || "https://asiyst.com", fetcher = fetch) {
95
+ this.fetcher = fetcher;
96
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
97
+ }
98
+ fetcher;
99
+ baseUrl;
100
+ async request(path, init) {
101
+ let response;
102
+ try {
103
+ response = await this.fetcher(`${this.baseUrl}${path}`, {
104
+ ...init,
105
+ headers: { Accept: "application/json", "Content-Type": "application/json", ...init?.headers }
106
+ });
107
+ } catch (error) {
108
+ throw new ApiError(`Unable to reach Asiyst API: ${error instanceof Error ? error.message : "network error"}`);
109
+ }
110
+ const body = await response.json().catch(() => void 0);
111
+ if (!response.ok) throw new ApiError(`Asiyst API returned HTTP ${response.status}`, response.status);
112
+ return body;
113
+ }
114
+ createSession() {
115
+ return this.request("/api/cli/sessions", { method: "POST", body: JSON.stringify({}) }).then((value) => {
116
+ if (!value || typeof value !== "object") throw new ApiError("Asiyst returned an invalid session response");
117
+ const session = value;
118
+ if (typeof session.sessionId !== "string" || typeof session.connectUrl !== "string" || typeof session.expiresAt !== "string") {
119
+ throw new ApiError("Asiyst returned an invalid session response");
120
+ }
121
+ const url = new URL(session.connectUrl);
122
+ const localApi = this.baseUrl.startsWith("http://localhost") || this.baseUrl.startsWith("http://127.0.0.1");
123
+ if (url.protocol !== "https:" && !(localApi && url.protocol === "http:")) {
124
+ throw new ApiError("Asiyst returned an insecure connection URL");
125
+ }
126
+ return { sessionId: session.sessionId, connectUrl: url.toString(), expiresAt: session.expiresAt };
127
+ });
128
+ }
129
+ sessionStatus(sessionId) {
130
+ return this.request(`/api/cli/sessions/${encodeURIComponent(sessionId)}/status`);
131
+ }
132
+ projectInfo(projectId) {
133
+ return this.request(`/api/cli/projects/${encodeURIComponent(projectId)}`);
134
+ }
135
+ verify(projectId, publicKey, domain) {
136
+ return this.request("/api/cli/verification", {
137
+ method: "POST",
138
+ body: JSON.stringify({ projectId, publicKey, domain })
139
+ }).then((value) => {
140
+ if (!Array.isArray(value) || !value.every((item) => item && typeof item === "object" && typeof item.name === "string" && typeof item.ok === "boolean")) {
141
+ throw new ApiError("Asiyst returned an invalid verification response");
142
+ }
143
+ return value;
144
+ });
145
+ }
146
+ };
147
+
148
+ // src/config/local.ts
149
+ import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
150
+ import { resolve as resolve2 } from "path";
151
+ function configWarning(cwd) {
152
+ const envPath = resolve2(cwd, ".env");
153
+ if (existsSync2(envPath)) {
154
+ const ignored = existsSync2(resolve2(cwd, ".gitignore")) && readFileSync2(resolve2(cwd, ".gitignore"), "utf8").split(/\r?\n/).some((line) => line.trim() === ".env" || line.trim() === ".env.*");
155
+ if (!ignored) return "Your .env file is not clearly ignored by .gitignore; do not commit public or private configuration accidentally.";
156
+ }
157
+ return void 0;
158
+ }
159
+
160
+ // src/commands/shared.ts
161
+ import { createInterface } from "readline/promises";
162
+ import { stdin as input, stdout as output } from "process";
163
+
164
+ // src/browser/open.ts
165
+ import { execFile } from "child_process";
166
+ import { promisify } from "util";
167
+ var execFileAsync = promisify(execFile);
168
+ async function openBrowser(url) {
169
+ const command = process.platform === "win32" ? "rundll32.exe" : process.platform === "darwin" ? "open" : "xdg-open";
170
+ const args = process.platform === "win32" ? ["url.dll,FileProtocolHandler", url] : [url];
171
+ try {
172
+ await execFileAsync(command, args);
173
+ return true;
174
+ } catch {
175
+ return false;
176
+ }
177
+ }
178
+
179
+ // src/commands/shared.ts
180
+ async function connect(api = new ApiClient()) {
181
+ const session = await api.createSession();
182
+ console.log(`Opening Asiyst...
183
+ ${session.connectUrl}`);
184
+ if (!await openBrowser(session.connectUrl)) console.log("Automatic browser opening failed; open the URL above.");
185
+ console.log("\u25CF Waiting for authentication\n\u25CF Waiting for project selection\n\u25CF Waiting for connection");
186
+ const expires = Date.parse(session.expiresAt);
187
+ for (; ; ) {
188
+ const result = await api.sessionStatus(session.sessionId);
189
+ if (result.state === "completed") return { session, project: result.project };
190
+ if (result.state === "expired") throw new Error("Connection session expired.");
191
+ if (result.state === "cancelled") throw new Error("Connection session was cancelled.");
192
+ if (Number.isFinite(expires) && Date.now() >= expires) throw new Error("Connection session expired.");
193
+ await new Promise((resolve3) => setTimeout(resolve3, 2e3));
194
+ }
195
+ }
196
+ async function confirm(question) {
197
+ if (!process.stdin.isTTY) return true;
198
+ const readline = createInterface({ input, output });
199
+ const answer = await readline.question(`${question} [y/N] `);
200
+ readline.close();
201
+ return /^y(es)?$/i.test(answer.trim());
202
+ }
203
+
204
+ // src/commands/init.ts
205
+ async function initCommand(cwd = process.cwd(), api = new ApiClient()) {
206
+ const project = detectProject(cwd);
207
+ if (!project.packageJson) throw new Error("No package.json found. Run this command from your website project.");
208
+ console.log(`Detected ${project.framework} project.`);
209
+ if (!project.sdkVersion) {
210
+ console.log("\n@asiyst/sdk is not installed.\nRun: npm install @asiyst/sdk");
211
+ return;
212
+ }
213
+ if (!await confirm("Connect this project to Asiyst?")) return;
214
+ const result = await connect(api);
215
+ ok("Asiyst account connected");
216
+ ok("Project connected", result.project?.projectName);
217
+ if (result.project?.projectId) {
218
+ console.log(`
219
+ Project ID: ${result.project.projectId}
220
+ Public Key: ${result.project.publicKey || project.config.publicKey || "Use the public key from the Asiyst project settings."}`);
221
+ }
222
+ const warning = configWarning(cwd);
223
+ if (warning) console.log(`
224
+ Warning: ${warning}`);
225
+ console.log('\nUse the public SDK API:\n\nimport { Asiyst } from "@asiyst/sdk";\n\nawait Asiyst.init({ projectId: "PROJECT_ID", publicKey: "PUBLIC_KEY" });');
226
+ console.log("\nRun `npx asiyst verify` after starting your website.");
227
+ }
228
+
229
+ // src/commands/login.ts
230
+ async function loginCommand(api = new ApiClient()) {
231
+ await connect(api);
232
+ console.log("\u2713 Already connected to Asiyst.");
233
+ }
234
+
235
+ // src/commands/logout.ts
236
+ function logoutCommand() {
237
+ console.log("\u2713 Local CLI session information removed (the CLI does not store passwords or private credentials).");
238
+ }
239
+
240
+ // src/commands/status.ts
241
+ async function statusCommand(cwd = process.cwd(), api = new ApiClient()) {
242
+ const project = detectProject(cwd);
243
+ console.log(`Project name: ${typeof project.packageJson?.name === "string" ? project.packageJson.name : "Unknown"}
244
+ SDK version: ${project.sdkVersion || "Not installed"}`);
245
+ if (!project.config.projectId) {
246
+ console.log("Connection status: Not configured");
247
+ return;
248
+ }
249
+ const info = await api.projectInfo(project.config.projectId);
250
+ for (const [key, value] of Object.entries(info)) if (value !== void 0) console.log(`${key}: ${value}`);
251
+ }
252
+
253
+ // src/commands/verify.ts
254
+ async function verifyCommand(cwd = process.cwd(), api = new ApiClient()) {
255
+ const project = detectProject(cwd);
256
+ if (!project.packageJson) {
257
+ fail("Project detected", "package.json is missing");
258
+ process.exitCode = 1;
259
+ return;
260
+ }
261
+ ok("Project detected");
262
+ if (!project.sdkVersion) {
263
+ fail("SDK installed", "npm install @asiyst/sdk");
264
+ process.exitCode = 1;
265
+ return;
266
+ }
267
+ ok("SDK installed", project.sdkVersion);
268
+ if (!project.config.projectId || !project.config.publicKey) {
269
+ fail("Configuration found", "set ASIIYST_PROJECT_ID and ASIIYST_PUBLIC_KEY");
270
+ process.exitCode = 1;
271
+ return;
272
+ }
273
+ ok("Configuration found");
274
+ try {
275
+ const results = await api.verify(project.config.projectId, project.config.publicKey, process.env.ASIIYST_DOMAIN);
276
+ if (!printVerification(results)) process.exitCode = 1;
277
+ } catch (error) {
278
+ fail("API reachable", error instanceof Error ? error.message : "verification failed");
279
+ process.exitCode = 1;
280
+ }
281
+ }
282
+
283
+ // src/commands/doctor.ts
284
+ async function doctorCommand(cwd = process.cwd(), api = new ApiClient()) {
285
+ const project = detectProject(cwd);
286
+ ok("System", process.platform);
287
+ ok("Node.js", process.version);
288
+ ok("npm", "available through npm");
289
+ project.packageJson ? ok("Project", cwd) : fail("Project", "package.json is missing");
290
+ project.sdkVersion ? ok("SDK", project.sdkVersion) : fail("SDK", "not installed");
291
+ project.config.projectId && project.config.publicKey ? ok("Configuration") : fail("Configuration", "public project values are missing");
292
+ try {
293
+ await api.projectInfo(project.config.projectId || "");
294
+ ok("Asiyst API");
295
+ } catch (error) {
296
+ fail("Asiyst API", error instanceof Error ? error.message : "unreachable");
297
+ }
298
+ }
299
+
300
+ // src/commands/dashboard.ts
301
+ async function dashboardCommand() {
302
+ const url = "https://asiyst.com/dashboard";
303
+ if (!await openBrowser(url)) console.log(`Open ${url}`);
304
+ else console.log(`Opening ${url}`);
305
+ }
306
+
307
+ // src/index.ts
308
+ import { createInterface as createInterface2 } from "readline/promises";
309
+ import { stdin as input2, stdout as output2 } from "process";
310
+ import { fileURLToPath } from "url";
311
+ var CLI_VERSION = "0.2.0";
312
+ 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`);
327
+ }
328
+ async function main(argv = process.argv.slice(2)) {
329
+ const command = argv[0] || "";
330
+ if (command === "--help" || command === "-h") return help();
331
+ if (command === "--version" || command === "-v") return console.log(CLI_VERSION);
332
+ if (command === "init") return initCommand();
333
+ if (command === "login") return loginCommand();
334
+ if (command === "logout") return logoutCommand();
335
+ if (command === "status") return statusCommand();
336
+ if (command === "verify") return verifyCommand();
337
+ if (command === "doctor") return doctorCommand();
338
+ if (command === "dashboard") return dashboardCommand();
339
+ banner();
340
+ const project = detectProject();
341
+ projectChecks(project);
342
+ if (!process.stdin.isTTY) {
343
+ console.log("\nRun `npx asiyst init` to connect this project, or `npx asiyst --help` for commands.");
344
+ return;
345
+ }
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();
355
+ }
356
+ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
357
+ main().catch((error) => {
358
+ console.error(`
359
+ Error: ${error instanceof Error ? error.message : "command failed"}`);
360
+ process.exitCode = 1;
361
+ });
362
+ }
363
+ export {
364
+ CLI_VERSION,
365
+ main
366
+ };
367
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@asiyst/cli",
3
+ "version": "0.2.0",
4
+ "description": "Connect and verify Asiyst SDK projects",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "asiyst": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsup",
17
+ "typecheck": "tsc --noEmit",
18
+ "test": "vitest run"
19
+ },
20
+ "engines": {
21
+ "node": ">=18.18.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^22.10.2",
25
+ "tsup": "^8.3.5",
26
+ "typescript": "^5.7.2",
27
+ "vitest": "^2.1.8"
28
+ }
29
+ }