@yuaone/cli 0.1.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/LICENSE +663 -0
- package/dist/auth.d.ts +71 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +240 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +212 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-client.d.ts +179 -0
- package/dist/cloud-client.d.ts.map +1 -0
- package/dist/cloud-client.js +369 -0
- package/dist/cloud-client.js.map +1 -0
- package/dist/config.d.ts +59 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +214 -0
- package/dist/config.js.map +1 -0
- package/dist/design-renderer.d.ts +16 -0
- package/dist/design-renderer.d.ts.map +1 -0
- package/dist/design-renderer.js +78 -0
- package/dist/design-renderer.js.map +1 -0
- package/dist/design.d.ts +18 -0
- package/dist/design.d.ts.map +1 -0
- package/dist/design.js +190 -0
- package/dist/design.js.map +1 -0
- package/dist/diff-renderer.d.ts +56 -0
- package/dist/diff-renderer.d.ts.map +1 -0
- package/dist/diff-renderer.js +133 -0
- package/dist/diff-renderer.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +73 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +638 -0
- package/dist/interactive.js.map +1 -0
- package/dist/oneshot.d.ts +17 -0
- package/dist/oneshot.d.ts.map +1 -0
- package/dist/oneshot.js +281 -0
- package/dist/oneshot.js.map +1 -0
- package/dist/progress-renderer.d.ts +116 -0
- package/dist/progress-renderer.d.ts.map +1 -0
- package/dist/progress-renderer.js +249 -0
- package/dist/progress-renderer.js.map +1 -0
- package/dist/renderer.d.ts +67 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +182 -0
- package/dist/renderer.js.map +1 -0
- package/dist/session.d.ts +71 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +246 -0
- package/dist/session.js.map +1 -0
- package/dist/y-spinner.d.ts +34 -0
- package/dist/y-spinner.d.ts.map +1 -0
- package/dist/y-spinner.js +93 -0
- package/dist/y-spinner.js.map +1 -0
- package/package.json +45 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module auth
|
|
3
|
+
* @description YUAN CLI authentication — OAuth Device Flow.
|
|
4
|
+
*
|
|
5
|
+
* Flow: yuan login → POST /device-code → open browser → poll /device-token → save token
|
|
6
|
+
*/
|
|
7
|
+
/** User info stored in the auth file */
|
|
8
|
+
export interface AuthUser {
|
|
9
|
+
id: number;
|
|
10
|
+
email: string;
|
|
11
|
+
name: string;
|
|
12
|
+
}
|
|
13
|
+
/** Plan info stored in the auth file */
|
|
14
|
+
export interface AuthPlan {
|
|
15
|
+
name: string;
|
|
16
|
+
maxIterations: number;
|
|
17
|
+
maxParallel: number;
|
|
18
|
+
dailyRuns: number;
|
|
19
|
+
}
|
|
20
|
+
/** Persisted auth data (~/.yuan/auth.json) */
|
|
21
|
+
export interface AuthData {
|
|
22
|
+
accessToken: string;
|
|
23
|
+
refreshToken: string;
|
|
24
|
+
expiresAt: number;
|
|
25
|
+
user: AuthUser;
|
|
26
|
+
plan: AuthPlan;
|
|
27
|
+
apiKey: string;
|
|
28
|
+
platformUrl: string;
|
|
29
|
+
}
|
|
30
|
+
/** Verify token response */
|
|
31
|
+
interface VerifyResponse {
|
|
32
|
+
valid: boolean;
|
|
33
|
+
user?: AuthUser;
|
|
34
|
+
plan?: AuthPlan;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Login to YUA Platform using the OAuth Device Flow.
|
|
38
|
+
*
|
|
39
|
+
* 1. Request a device code from the platform.
|
|
40
|
+
* 2. Display the verification URL and user code.
|
|
41
|
+
* 3. Attempt to open the browser automatically.
|
|
42
|
+
* 4. Poll for authorization until the user completes the flow or timeout.
|
|
43
|
+
* 5. Save tokens to ~/.yuan/auth.json.
|
|
44
|
+
*
|
|
45
|
+
* @param platformUrl - Base URL of the YUA Platform (e.g. "https://platform.yuaone.com")
|
|
46
|
+
*/
|
|
47
|
+
export declare function login(platformUrl: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Logout from YUA Platform by removing the saved auth file.
|
|
50
|
+
*/
|
|
51
|
+
export declare function logout(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Get the current authentication data with automatic token refresh.
|
|
54
|
+
*
|
|
55
|
+
* - Reads ~/.yuan/auth.json
|
|
56
|
+
* - If the access token is expired but the refresh token is still valid,
|
|
57
|
+
* attempts to refresh the access token automatically.
|
|
58
|
+
*
|
|
59
|
+
* @returns The auth data or null if not logged in / cannot refresh.
|
|
60
|
+
*/
|
|
61
|
+
export declare function getAuth(): Promise<AuthData | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Verify the current access token against the platform.
|
|
64
|
+
*
|
|
65
|
+
* @param platformUrl - Base URL of the YUA Platform. If not provided, uses the
|
|
66
|
+
* URL from the saved auth data.
|
|
67
|
+
* @returns The verify response or null if not authenticated.
|
|
68
|
+
*/
|
|
69
|
+
export declare function verifyAuth(platformUrl?: string): Promise<VerifyResponse | null>;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8CAA8C;AAC9C,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AA4BD,4BAA4B;AAC5B,UAAU,cAAc;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAuCD;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4G9D;AAED;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAc5C;AAED;;;;;;;;GAQG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoCxD;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmBrF"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module auth
|
|
3
|
+
* @description YUAN CLI authentication — OAuth Device Flow.
|
|
4
|
+
*
|
|
5
|
+
* Flow: yuan login → POST /device-code → open browser → poll /device-token → save token
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "node:fs";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import * as os from "node:os";
|
|
10
|
+
import { YSpinner } from "./y-spinner.js";
|
|
11
|
+
// ─── Constants ───
|
|
12
|
+
const YUAN_DIR = path.join(os.homedir(), ".yuan");
|
|
13
|
+
const AUTH_PATH = path.join(YUAN_DIR, "auth.json");
|
|
14
|
+
const CLIENT_ID = "yuan-cli";
|
|
15
|
+
const POLL_INTERVAL_MS = 5_000;
|
|
16
|
+
const TIMEOUT_MS = 15 * 60 * 1_000; // 15 minutes
|
|
17
|
+
// ─── File helpers ───
|
|
18
|
+
/** Ensure ~/.yuan directory exists with secure permissions. */
|
|
19
|
+
function ensureYuanDir() {
|
|
20
|
+
if (!fs.existsSync(YUAN_DIR)) {
|
|
21
|
+
fs.mkdirSync(YUAN_DIR, { recursive: true, mode: 0o700 });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Write auth data to disk with restricted permissions. */
|
|
25
|
+
function saveAuth(data) {
|
|
26
|
+
ensureYuanDir();
|
|
27
|
+
fs.writeFileSync(AUTH_PATH, JSON.stringify(data, null, 2), {
|
|
28
|
+
encoding: "utf-8",
|
|
29
|
+
mode: 0o600,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Read auth data from disk. Returns null if missing or corrupt. */
|
|
33
|
+
function readAuth() {
|
|
34
|
+
try {
|
|
35
|
+
if (!fs.existsSync(AUTH_PATH))
|
|
36
|
+
return null;
|
|
37
|
+
const raw = fs.readFileSync(AUTH_PATH, "utf-8");
|
|
38
|
+
return JSON.parse(raw);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// ─── Sleep utility ───
|
|
45
|
+
function sleep(ms) {
|
|
46
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
47
|
+
}
|
|
48
|
+
// ─── Public API ───
|
|
49
|
+
/**
|
|
50
|
+
* Login to YUA Platform using the OAuth Device Flow.
|
|
51
|
+
*
|
|
52
|
+
* 1. Request a device code from the platform.
|
|
53
|
+
* 2. Display the verification URL and user code.
|
|
54
|
+
* 3. Attempt to open the browser automatically.
|
|
55
|
+
* 4. Poll for authorization until the user completes the flow or timeout.
|
|
56
|
+
* 5. Save tokens to ~/.yuan/auth.json.
|
|
57
|
+
*
|
|
58
|
+
* @param platformUrl - Base URL of the YUA Platform (e.g. "https://platform.yuaone.com")
|
|
59
|
+
*/
|
|
60
|
+
export async function login(platformUrl) {
|
|
61
|
+
const spinner = new YSpinner();
|
|
62
|
+
// Step 1: Request device code
|
|
63
|
+
spinner.start("Requesting device code...");
|
|
64
|
+
let deviceCode;
|
|
65
|
+
try {
|
|
66
|
+
const res = await fetch(`${platformUrl}/api/yuan-auth/device-code`, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: { "Content-Type": "application/json" },
|
|
69
|
+
body: JSON.stringify({ clientId: CLIENT_ID }),
|
|
70
|
+
});
|
|
71
|
+
if (!res.ok) {
|
|
72
|
+
const text = await res.text();
|
|
73
|
+
spinner.fail(`Failed to request device code: ${res.status} ${text}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
deviceCode = (await res.json());
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
spinner.fail(`Cannot reach platform at ${platformUrl}: ${err instanceof Error ? err.message : String(err)}`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
return; // unreachable, helps TS narrowing
|
|
82
|
+
}
|
|
83
|
+
spinner.stop();
|
|
84
|
+
// Step 2: Display verification info
|
|
85
|
+
console.log();
|
|
86
|
+
console.log(` Visit ${deviceCode.verificationUri}`);
|
|
87
|
+
console.log(` and enter code: \x1b[1m${deviceCode.userCode}\x1b[0m`);
|
|
88
|
+
console.log();
|
|
89
|
+
// Step 3: Auto-open browser (best effort)
|
|
90
|
+
try {
|
|
91
|
+
const openModule = await import("open");
|
|
92
|
+
const openFn = openModule.default ?? openModule;
|
|
93
|
+
await openFn(deviceCode.verificationUri);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Browser auto-open is optional — user can copy the URL manually
|
|
97
|
+
}
|
|
98
|
+
// Step 4: Poll for token
|
|
99
|
+
spinner.start("Waiting for authorization...");
|
|
100
|
+
const interval = Math.max(deviceCode.interval ?? 5, 5) * 1_000;
|
|
101
|
+
const deadline = Date.now() + TIMEOUT_MS;
|
|
102
|
+
while (Date.now() < deadline) {
|
|
103
|
+
await sleep(interval > 0 ? interval : POLL_INTERVAL_MS);
|
|
104
|
+
try {
|
|
105
|
+
const res = await fetch(`${platformUrl}/api/yuan-auth/device-token`, {
|
|
106
|
+
method: "POST",
|
|
107
|
+
headers: { "Content-Type": "application/json" },
|
|
108
|
+
body: JSON.stringify({
|
|
109
|
+
clientId: CLIENT_ID,
|
|
110
|
+
deviceCode: deviceCode.deviceCode,
|
|
111
|
+
}),
|
|
112
|
+
});
|
|
113
|
+
if (!res.ok) {
|
|
114
|
+
// Non-200 might be temporary — keep polling unless explicitly denied
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const body = (await res.json());
|
|
118
|
+
if (body.status === "authorized") {
|
|
119
|
+
// Save auth data
|
|
120
|
+
const authData = {
|
|
121
|
+
accessToken: body.accessToken,
|
|
122
|
+
refreshToken: body.refreshToken,
|
|
123
|
+
expiresAt: Date.now() + (body.expiresIn ?? 3600) * 1_000,
|
|
124
|
+
user: body.user,
|
|
125
|
+
plan: body.plan,
|
|
126
|
+
apiKey: body.apiKey ?? "",
|
|
127
|
+
platformUrl,
|
|
128
|
+
};
|
|
129
|
+
saveAuth(authData);
|
|
130
|
+
spinner.success(`Logged in as ${authData.user.email} (${authData.plan.name})`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (body.status === "denied") {
|
|
134
|
+
spinner.fail("Authorization denied.");
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
if (body.status === "expired") {
|
|
138
|
+
spinner.fail("Device code expired. Please try again.");
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
// status === "pending" — continue polling
|
|
142
|
+
spinner.update("Waiting for authorization...");
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Network error — keep polling
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
spinner.fail("Authorization timed out (15 minutes). Please try again.");
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Logout from YUA Platform by removing the saved auth file.
|
|
153
|
+
*/
|
|
154
|
+
export async function logout() {
|
|
155
|
+
try {
|
|
156
|
+
if (fs.existsSync(AUTH_PATH)) {
|
|
157
|
+
fs.unlinkSync(AUTH_PATH);
|
|
158
|
+
console.log("Logged out.");
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
console.log("Not logged in.");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.error(`Failed to remove auth file: ${err instanceof Error ? err.message : String(err)}`);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get the current authentication data with automatic token refresh.
|
|
171
|
+
*
|
|
172
|
+
* - Reads ~/.yuan/auth.json
|
|
173
|
+
* - If the access token is expired but the refresh token is still valid,
|
|
174
|
+
* attempts to refresh the access token automatically.
|
|
175
|
+
*
|
|
176
|
+
* @returns The auth data or null if not logged in / cannot refresh.
|
|
177
|
+
*/
|
|
178
|
+
export async function getAuth() {
|
|
179
|
+
const auth = readAuth();
|
|
180
|
+
if (!auth)
|
|
181
|
+
return null;
|
|
182
|
+
// Token still valid — return as-is
|
|
183
|
+
if (Date.now() < auth.expiresAt) {
|
|
184
|
+
return auth;
|
|
185
|
+
}
|
|
186
|
+
// Token expired — attempt refresh
|
|
187
|
+
if (!auth.refreshToken)
|
|
188
|
+
return null;
|
|
189
|
+
try {
|
|
190
|
+
const res = await fetch(`${auth.platformUrl}/api/yuan-auth/refresh`, {
|
|
191
|
+
method: "POST",
|
|
192
|
+
headers: {
|
|
193
|
+
"Content-Type": "application/json",
|
|
194
|
+
Authorization: `Bearer ${auth.refreshToken}`,
|
|
195
|
+
},
|
|
196
|
+
body: JSON.stringify({ refreshToken: auth.refreshToken }),
|
|
197
|
+
});
|
|
198
|
+
if (!res.ok) {
|
|
199
|
+
// Refresh failed — user needs to re-login
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
const body = (await res.json());
|
|
203
|
+
auth.accessToken = body.accessToken;
|
|
204
|
+
auth.expiresAt = Date.now() + (body.expiresIn ?? 3600) * 1_000;
|
|
205
|
+
saveAuth(auth);
|
|
206
|
+
return auth;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Network error during refresh — return null
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Verify the current access token against the platform.
|
|
215
|
+
*
|
|
216
|
+
* @param platformUrl - Base URL of the YUA Platform. If not provided, uses the
|
|
217
|
+
* URL from the saved auth data.
|
|
218
|
+
* @returns The verify response or null if not authenticated.
|
|
219
|
+
*/
|
|
220
|
+
export async function verifyAuth(platformUrl) {
|
|
221
|
+
const auth = await getAuth();
|
|
222
|
+
if (!auth)
|
|
223
|
+
return null;
|
|
224
|
+
const baseUrl = platformUrl ?? auth.platformUrl;
|
|
225
|
+
try {
|
|
226
|
+
const res = await fetch(`${baseUrl}/api/yuan-auth/verify`, {
|
|
227
|
+
method: "GET",
|
|
228
|
+
headers: {
|
|
229
|
+
Authorization: `Bearer ${auth.accessToken}`,
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
if (!res.ok)
|
|
233
|
+
return null;
|
|
234
|
+
return (await res.json());
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,oBAAoB;AAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACnD,MAAM,SAAS,GAAG,UAAU,CAAC;AAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,aAAa;AA+DjD,uBAAuB;AAEvB,+DAA+D;AAC/D,SAAS,aAAa;IACpB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,QAAQ,CAAC,IAAc;IAC9B,aAAa,EAAE,CAAC;IAChB,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACzD,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,oEAAoE;AACpE,SAAS,QAAQ;IACf,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wBAAwB;AAExB,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,qBAAqB;AAErB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,WAAmB;IAC7C,MAAM,OAAO,GAAG,IAAI,QAAQ,EAAE,CAAC;IAE/B,8BAA8B;IAC9B,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE3C,IAAI,UAA8B,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,4BAA4B,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,kCAAkC,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,4BAA4B,WAAW,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,kCAAkC;IAC5C,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,oCAAoC;IACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,CAAC,QAAQ,SAAS,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,0CAA0C;IAC1C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC;QAChD,MAAM,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,yBAAyB;IACzB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;IAEzC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,6BAA6B,EAAE;gBACnE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,QAAQ,EAAE,SAAS;oBACnB,UAAU,EAAE,UAAU,CAAC,UAAU;iBAClC,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,qEAAqE;gBACrE,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;YAEvD,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACjC,iBAAiB;gBACjB,MAAM,QAAQ,GAAa;oBACzB,WAAW,EAAE,IAAI,CAAC,WAAY;oBAC9B,YAAY,EAAE,IAAI,CAAC,YAAa;oBAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK;oBACxD,IAAI,EAAE,IAAI,CAAC,IAAK;oBAChB,IAAI,EAAE,IAAI,CAAC,IAAK;oBAChB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;oBACzB,WAAW;iBACZ,CAAC;gBACF,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAEnB,OAAO,CAAC,OAAO,CAAC,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,0CAA0C;YAC1C,OAAO,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAClF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,mCAAmC;IACnC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,wBAAwB,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,YAAY,EAAE;aAC7C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;SAC1D,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,0CAA0C;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAoB;IACnD,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,uBAAuB,EAAE;YACzD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;aAC5C;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* YUAN CLI — Main Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* yuan → Interactive agent mode (default)
|
|
7
|
+
* yuan code <prompt> → One-shot coding task
|
|
8
|
+
* yuan config → BYOK key setup (interactive)
|
|
9
|
+
* yuan config set-key → Set API key
|
|
10
|
+
* yuan config show → Show current settings
|
|
11
|
+
* yuan resume → Resume last session
|
|
12
|
+
* yuan --version → Version
|
|
13
|
+
* yuan --help → Help
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* YUAN CLI — Main Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* yuan → Interactive agent mode (default)
|
|
7
|
+
* yuan code <prompt> → One-shot coding task
|
|
8
|
+
* yuan config → BYOK key setup (interactive)
|
|
9
|
+
* yuan config set-key → Set API key
|
|
10
|
+
* yuan config show → Show current settings
|
|
11
|
+
* yuan resume → Resume last session
|
|
12
|
+
* yuan --version → Version
|
|
13
|
+
* yuan --help → Help
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from "commander";
|
|
16
|
+
import { ConfigManager } from "./config.js";
|
|
17
|
+
import { TerminalRenderer } from "./renderer.js";
|
|
18
|
+
import { InteractiveSession } from "./interactive.js";
|
|
19
|
+
import { SessionManager } from "./session.js";
|
|
20
|
+
import { runOneshot } from "./oneshot.js";
|
|
21
|
+
import { login, logout, getAuth } from "./auth.js";
|
|
22
|
+
const renderer = new TerminalRenderer();
|
|
23
|
+
const program = new Command();
|
|
24
|
+
program
|
|
25
|
+
.name("yuan")
|
|
26
|
+
.description("YUAN — Autonomous Coding Agent")
|
|
27
|
+
.version("0.1.0");
|
|
28
|
+
// ─── Default: Interactive mode ───
|
|
29
|
+
program
|
|
30
|
+
.action(async () => {
|
|
31
|
+
const configManager = new ConfigManager();
|
|
32
|
+
const sessionManager = new SessionManager();
|
|
33
|
+
if (!configManager.isConfigured()) {
|
|
34
|
+
renderer.banner();
|
|
35
|
+
renderer.warn("No API key configured. Starting setup...");
|
|
36
|
+
await configManager.interactiveSetup();
|
|
37
|
+
console.log();
|
|
38
|
+
}
|
|
39
|
+
const session = new InteractiveSession(renderer, sessionManager, configManager);
|
|
40
|
+
await session.start();
|
|
41
|
+
});
|
|
42
|
+
// ─── yuan code <prompt> / yuan run <prompt> ───
|
|
43
|
+
const oneshotAction = async (prompt, options) => {
|
|
44
|
+
const exitCode = await runOneshot(prompt, options);
|
|
45
|
+
process.exit(exitCode);
|
|
46
|
+
};
|
|
47
|
+
program
|
|
48
|
+
.command("code")
|
|
49
|
+
.description("Run a one-shot coding task")
|
|
50
|
+
.argument("<prompt>", "The coding task to execute")
|
|
51
|
+
.option("-m, --model <model>", "Override the default model")
|
|
52
|
+
.action(oneshotAction);
|
|
53
|
+
program
|
|
54
|
+
.command("run")
|
|
55
|
+
.description("Run a one-shot coding task (alias for 'code')")
|
|
56
|
+
.argument("<prompt>", "The coding task to execute")
|
|
57
|
+
.option("-m, --model <model>", "Override the default model")
|
|
58
|
+
.action(oneshotAction);
|
|
59
|
+
// ─── yuan config ───
|
|
60
|
+
const configCmd = program
|
|
61
|
+
.command("config")
|
|
62
|
+
.description("Manage YUAN configuration");
|
|
63
|
+
configCmd
|
|
64
|
+
.action(async () => {
|
|
65
|
+
const configManager = new ConfigManager();
|
|
66
|
+
await configManager.interactiveSetup();
|
|
67
|
+
});
|
|
68
|
+
configCmd
|
|
69
|
+
.command("set-key")
|
|
70
|
+
.description("Set API key for a provider")
|
|
71
|
+
.argument("<provider>", "Provider: openai, anthropic, or google")
|
|
72
|
+
.argument("<key>", "API key")
|
|
73
|
+
.action((provider, key) => {
|
|
74
|
+
const validProviders = ["openai", "anthropic", "google", "yua", "deepseek"];
|
|
75
|
+
if (!validProviders.includes(provider)) {
|
|
76
|
+
renderer.error(`Invalid provider: ${provider}. Use: openai, anthropic, google, yua, or deepseek`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
const configManager = new ConfigManager();
|
|
80
|
+
configManager.setKey(provider, key);
|
|
81
|
+
renderer.success(`API key saved for ${provider}`);
|
|
82
|
+
});
|
|
83
|
+
configCmd
|
|
84
|
+
.command("show")
|
|
85
|
+
.description("Show current configuration")
|
|
86
|
+
.action(() => {
|
|
87
|
+
const configManager = new ConfigManager();
|
|
88
|
+
console.log();
|
|
89
|
+
console.log(configManager.show());
|
|
90
|
+
console.log();
|
|
91
|
+
});
|
|
92
|
+
configCmd
|
|
93
|
+
.command("set-mode")
|
|
94
|
+
.description("Set execution mode: local or cloud")
|
|
95
|
+
.argument("<mode>", "Mode: local or cloud")
|
|
96
|
+
.action((mode) => {
|
|
97
|
+
if (mode !== "local" && mode !== "cloud") {
|
|
98
|
+
renderer.error(`Invalid mode: ${mode}. Use: local or cloud`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
const configManager = new ConfigManager();
|
|
102
|
+
configManager.setMode(mode);
|
|
103
|
+
renderer.success(`Mode set to ${mode}`);
|
|
104
|
+
});
|
|
105
|
+
configCmd
|
|
106
|
+
.command("set-server")
|
|
107
|
+
.description("Set cloud server URL")
|
|
108
|
+
.argument("<url>", "Server URL (e.g. https://api.yuaone.com)")
|
|
109
|
+
.action((url) => {
|
|
110
|
+
const configManager = new ConfigManager();
|
|
111
|
+
configManager.setServerUrl(url);
|
|
112
|
+
renderer.success(`Server URL set to ${url}`);
|
|
113
|
+
});
|
|
114
|
+
// ─── yuan resume ───
|
|
115
|
+
program
|
|
116
|
+
.command("resume")
|
|
117
|
+
.description("Resume the last agent session")
|
|
118
|
+
.option("--id <sessionId>", "Resume a specific session by ID")
|
|
119
|
+
.option("--list", "List recent sessions")
|
|
120
|
+
.action(async (options) => {
|
|
121
|
+
const configManager = new ConfigManager();
|
|
122
|
+
const sessionManager = new SessionManager();
|
|
123
|
+
// List mode
|
|
124
|
+
if (options.list) {
|
|
125
|
+
const sessions = sessionManager.listRecent(10);
|
|
126
|
+
if (sessions.length === 0) {
|
|
127
|
+
renderer.info("No saved sessions found.");
|
|
128
|
+
process.exit(0);
|
|
129
|
+
}
|
|
130
|
+
console.log();
|
|
131
|
+
renderer.info("Recent Sessions:");
|
|
132
|
+
console.log(" " + "-".repeat(72));
|
|
133
|
+
for (const s of sessions) {
|
|
134
|
+
const statusIcon = {
|
|
135
|
+
running: "\u25B6",
|
|
136
|
+
paused: "\u23F8",
|
|
137
|
+
completed: "\u2713",
|
|
138
|
+
crashed: "\u2717",
|
|
139
|
+
}[s.status] ?? "?";
|
|
140
|
+
const date = new Date(s.updatedAt).toLocaleString();
|
|
141
|
+
const dir = s.workDir.length > 30
|
|
142
|
+
? "..." + s.workDir.slice(-27)
|
|
143
|
+
: s.workDir;
|
|
144
|
+
console.log(` ${statusIcon} ${s.id.slice(0, 8)} ${s.status.padEnd(10)} ${date} ${dir} (${s.messages.length} msgs, iter ${s.iteration})`);
|
|
145
|
+
}
|
|
146
|
+
console.log();
|
|
147
|
+
renderer.info("Use `yuan resume --id <sessionId>` to resume a specific session.");
|
|
148
|
+
process.exit(0);
|
|
149
|
+
}
|
|
150
|
+
// Resume mode
|
|
151
|
+
const session = options.id
|
|
152
|
+
? sessionManager.load(options.id)
|
|
153
|
+
: sessionManager.loadLast();
|
|
154
|
+
if (!session) {
|
|
155
|
+
renderer.error("No session to resume. Start a new session with `yuan`.");
|
|
156
|
+
renderer.info("Use `yuan resume --list` to see available sessions.");
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
const statusLabel = session.status === "crashed"
|
|
160
|
+
? " (recovering from crash)"
|
|
161
|
+
: session.status === "paused"
|
|
162
|
+
? " (paused)"
|
|
163
|
+
: "";
|
|
164
|
+
renderer.info(`Resuming session ${session.id.slice(0, 8)}...${statusLabel}`);
|
|
165
|
+
renderer.info(`Status: ${session.status} | Messages: ${session.messages.length} | Iterations: ${session.iteration}`);
|
|
166
|
+
renderer.info(`Tokens used: ${session.tokenUsage.input + session.tokenUsage.output} (in: ${session.tokenUsage.input}, out: ${session.tokenUsage.output})`);
|
|
167
|
+
// Mark session as running
|
|
168
|
+
await sessionManager.updateStatus(session, "running");
|
|
169
|
+
const interactive = new InteractiveSession(renderer, sessionManager, configManager, session);
|
|
170
|
+
await interactive.start();
|
|
171
|
+
});
|
|
172
|
+
// ─── yuan design ───
|
|
173
|
+
program
|
|
174
|
+
.command("design")
|
|
175
|
+
.description("Enter Design Mode — AI-powered real-time design collaboration")
|
|
176
|
+
.option("-p, --port <port>", "Dev server port", parseInt)
|
|
177
|
+
.option("--auto-vision", "Auto-capture screenshot after every change")
|
|
178
|
+
.option("--viewport <preset>", "Viewport preset: mobile, tablet, desktop")
|
|
179
|
+
.option("--dev-command <cmd>", "Custom dev server command")
|
|
180
|
+
.action(async (options) => {
|
|
181
|
+
const { runDesignMode } = await import("./design.js");
|
|
182
|
+
await runDesignMode(options);
|
|
183
|
+
});
|
|
184
|
+
// ─── yuan login ───
|
|
185
|
+
program
|
|
186
|
+
.command("login")
|
|
187
|
+
.description("Login to YUA Platform")
|
|
188
|
+
.option("--url <url>", "Platform URL", "https://platform.yuaone.com")
|
|
189
|
+
.action(async (opts) => {
|
|
190
|
+
await login(opts.url);
|
|
191
|
+
});
|
|
192
|
+
// ─── yuan logout ───
|
|
193
|
+
program
|
|
194
|
+
.command("logout")
|
|
195
|
+
.description("Logout from YUA Platform")
|
|
196
|
+
.action(async () => {
|
|
197
|
+
await logout();
|
|
198
|
+
});
|
|
199
|
+
// ─── yuan whoami ───
|
|
200
|
+
program
|
|
201
|
+
.command("whoami")
|
|
202
|
+
.description("Show current user info")
|
|
203
|
+
.action(async () => {
|
|
204
|
+
const auth = await getAuth();
|
|
205
|
+
if (!auth) {
|
|
206
|
+
console.log("Not logged in. Run: yuan login");
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
console.log(`${auth.user.email} (${auth.plan.name})`);
|
|
210
|
+
});
|
|
211
|
+
program.parse();
|
|
212
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|