@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.
Files changed (58) hide show
  1. package/LICENSE +663 -0
  2. package/dist/auth.d.ts +71 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +240 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/cli.d.ts +16 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +212 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/cloud-client.d.ts +179 -0
  11. package/dist/cloud-client.d.ts.map +1 -0
  12. package/dist/cloud-client.js +369 -0
  13. package/dist/cloud-client.js.map +1 -0
  14. package/dist/config.d.ts +59 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +214 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/design-renderer.d.ts +16 -0
  19. package/dist/design-renderer.d.ts.map +1 -0
  20. package/dist/design-renderer.js +78 -0
  21. package/dist/design-renderer.js.map +1 -0
  22. package/dist/design.d.ts +18 -0
  23. package/dist/design.d.ts.map +1 -0
  24. package/dist/design.js +190 -0
  25. package/dist/design.js.map +1 -0
  26. package/dist/diff-renderer.d.ts +56 -0
  27. package/dist/diff-renderer.d.ts.map +1 -0
  28. package/dist/diff-renderer.js +133 -0
  29. package/dist/diff-renderer.js.map +1 -0
  30. package/dist/index.d.ts +16 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +16 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/interactive.d.ts +73 -0
  35. package/dist/interactive.d.ts.map +1 -0
  36. package/dist/interactive.js +638 -0
  37. package/dist/interactive.js.map +1 -0
  38. package/dist/oneshot.d.ts +17 -0
  39. package/dist/oneshot.d.ts.map +1 -0
  40. package/dist/oneshot.js +281 -0
  41. package/dist/oneshot.js.map +1 -0
  42. package/dist/progress-renderer.d.ts +116 -0
  43. package/dist/progress-renderer.d.ts.map +1 -0
  44. package/dist/progress-renderer.js +249 -0
  45. package/dist/progress-renderer.js.map +1 -0
  46. package/dist/renderer.d.ts +67 -0
  47. package/dist/renderer.d.ts.map +1 -0
  48. package/dist/renderer.js +182 -0
  49. package/dist/renderer.js.map +1 -0
  50. package/dist/session.d.ts +71 -0
  51. package/dist/session.d.ts.map +1 -0
  52. package/dist/session.js +246 -0
  53. package/dist/session.js.map +1 -0
  54. package/dist/y-spinner.d.ts +34 -0
  55. package/dist/y-spinner.d.ts.map +1 -0
  56. package/dist/y-spinner.js +93 -0
  57. package/dist/y-spinner.js.map +1 -0
  58. package/package.json +45 -0
package/dist/config.js ADDED
@@ -0,0 +1,214 @@
1
+ /**
2
+ * YUAN CLI — Configuration Manager
3
+ *
4
+ * Manages BYOK API key storage and CLI settings.
5
+ * Config file: ~/.yuan/config.json
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import * as os from "node:os";
10
+ import * as readline from "node:readline";
11
+ const YUAN_DIR = path.join(os.homedir(), ".yuan");
12
+ const CONFIG_PATH = path.join(YUAN_DIR, "config.json");
13
+ const DEFAULT_MODELS = {
14
+ openai: "gpt-4o",
15
+ anthropic: "claude-sonnet-4-20250514",
16
+ google: "gemini-2.5-flash",
17
+ yua: "yua-pro",
18
+ deepseek: "deepseek-chat",
19
+ };
20
+ /** Default configuration */
21
+ function defaultConfig() {
22
+ return {
23
+ provider: "anthropic",
24
+ apiKey: "",
25
+ model: undefined,
26
+ baseUrl: undefined,
27
+ theme: "dark",
28
+ mode: "local",
29
+ serverUrl: "https://api.yuaone.com",
30
+ };
31
+ }
32
+ /**
33
+ * ConfigManager — handles reading/writing ~/.yuan/config.json
34
+ */
35
+ export class ConfigManager {
36
+ config;
37
+ constructor() {
38
+ this.config = this.load();
39
+ }
40
+ /** Load config from disk, falling back to defaults */
41
+ load() {
42
+ try {
43
+ if (fs.existsSync(CONFIG_PATH)) {
44
+ const raw = fs.readFileSync(CONFIG_PATH, "utf-8");
45
+ const parsed = JSON.parse(raw);
46
+ return { ...defaultConfig(), ...parsed };
47
+ }
48
+ }
49
+ catch {
50
+ // Corrupted config — use defaults
51
+ }
52
+ return defaultConfig();
53
+ }
54
+ /** Save current config to disk */
55
+ save() {
56
+ if (!fs.existsSync(YUAN_DIR)) {
57
+ fs.mkdirSync(YUAN_DIR, { recursive: true, mode: 0o700 });
58
+ }
59
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(this.config, null, 2), { encoding: "utf-8", mode: 0o600 });
60
+ }
61
+ /** Get current config */
62
+ get() {
63
+ return { ...this.config };
64
+ }
65
+ /** Check if API key is configured */
66
+ isConfigured() {
67
+ if (this.config.mode === "cloud") {
68
+ return this.config.apiKey.startsWith("yua_sk_") && this.config.apiKey.length > 7;
69
+ }
70
+ return this.config.apiKey.length > 0;
71
+ }
72
+ /** Get the effective model name (user override or provider default) */
73
+ getModel() {
74
+ return this.config.model ?? DEFAULT_MODELS[this.config.provider];
75
+ }
76
+ /** Set API key for a provider */
77
+ setKey(provider, apiKey) {
78
+ this.config.provider = provider;
79
+ this.config.apiKey = apiKey;
80
+ this.save();
81
+ }
82
+ /** Set model override */
83
+ setModel(model) {
84
+ this.config.model = model;
85
+ this.save();
86
+ }
87
+ /** Set base URL override (e.g. for Azure OpenAI) */
88
+ setBaseUrl(baseUrl) {
89
+ this.config.baseUrl = baseUrl;
90
+ this.save();
91
+ }
92
+ /** Set theme */
93
+ setTheme(theme) {
94
+ this.config.theme = theme;
95
+ this.save();
96
+ }
97
+ /** Set execution mode (local or cloud) */
98
+ setMode(mode) {
99
+ this.config.mode = mode;
100
+ this.save();
101
+ }
102
+ /** Set cloud server URL */
103
+ setServerUrl(url) {
104
+ this.config.serverUrl = url;
105
+ this.save();
106
+ }
107
+ /** Check if running in cloud mode */
108
+ isCloudMode() {
109
+ return this.config.mode === "cloud";
110
+ }
111
+ /** Get the effective server URL */
112
+ getServerUrl() {
113
+ return this.config.serverUrl;
114
+ }
115
+ /** Display current config (masking API key) */
116
+ show() {
117
+ const c = this.config;
118
+ const maskedKey = c.apiKey
119
+ ? c.apiKey.slice(0, 6) + "..." + c.apiKey.slice(-4)
120
+ : "(not set)";
121
+ const lines = [
122
+ `Mode : ${c.mode}`,
123
+ `Provider : ${c.provider}`,
124
+ `API Key : ${maskedKey}`,
125
+ `Model : ${this.getModel()}`,
126
+ `Base URL : ${c.baseUrl ?? "(default)"}`,
127
+ `Server : ${c.mode === "cloud" ? c.serverUrl : "(n/a — local mode)"}`,
128
+ `Theme : ${c.theme}`,
129
+ `Config : ${CONFIG_PATH}`,
130
+ ];
131
+ return lines.join("\n");
132
+ }
133
+ /**
134
+ * Interactive setup prompt using readline.
135
+ * Walks the user through provider selection and API key entry.
136
+ */
137
+ async interactiveSetup() {
138
+ const rl = readline.createInterface({
139
+ input: process.stdin,
140
+ output: process.stdout,
141
+ });
142
+ const ask = (question) => new Promise((resolve) => {
143
+ rl.question(question, (answer) => resolve(answer.trim()));
144
+ });
145
+ console.log("\n YUAN Configuration\n");
146
+ // Provider selection
147
+ console.log(" Select LLM provider:");
148
+ console.log(" 1) OpenAI");
149
+ console.log(" 2) Anthropic");
150
+ console.log(" 3) Google (Gemini)");
151
+ console.log(" 4) YUA");
152
+ console.log(" 5) DeepSeek");
153
+ const providerChoice = await ask("\n Provider [1-5] (default: 2): ");
154
+ const providerMap = {
155
+ "1": "openai",
156
+ "2": "anthropic",
157
+ "3": "google",
158
+ "4": "yua",
159
+ "5": "deepseek",
160
+ };
161
+ const provider = providerMap[providerChoice] ?? "anthropic";
162
+ this.config.provider = provider;
163
+ // Execution mode selection
164
+ console.log("\n Execution mode:");
165
+ console.log(" 1) Local (BYOK — runs on your machine)");
166
+ console.log(" 2) Cloud (YUA Platform — runs on server)");
167
+ const modeChoice = await ask("\n Mode [1-2] (default: 1): ");
168
+ const isCloud = modeChoice === "2";
169
+ this.config.mode = isCloud ? "cloud" : "local";
170
+ if (isCloud) {
171
+ // Cloud mode — override provider to yua
172
+ this.config.provider = "yua";
173
+ // Server URL
174
+ const serverUrl = await ask(` Server URL (default: ${defaultConfig().serverUrl}): `);
175
+ if (serverUrl) {
176
+ this.config.serverUrl = serverUrl;
177
+ }
178
+ else {
179
+ this.config.serverUrl = defaultConfig().serverUrl;
180
+ }
181
+ // YUA platform API key
182
+ const yuaKey = await ask(" YUA API key (yua_sk_xxx): ");
183
+ if (yuaKey) {
184
+ this.config.apiKey = yuaKey;
185
+ }
186
+ }
187
+ else {
188
+ // Local mode — ask for provider API key
189
+ const keyPrompt = ` ${provider} API key: `;
190
+ const apiKey = await ask(keyPrompt);
191
+ if (apiKey) {
192
+ this.config.apiKey = apiKey;
193
+ }
194
+ }
195
+ // Model (optional)
196
+ const effectiveProvider = this.config.provider;
197
+ const modelPrompt = ` Model (default: ${DEFAULT_MODELS[effectiveProvider]}): `;
198
+ const model = await ask(modelPrompt);
199
+ if (model) {
200
+ this.config.model = model;
201
+ }
202
+ // Base URL (optional, only relevant for local mode)
203
+ if (!isCloud) {
204
+ const baseUrl = await ask(" Custom base URL (optional): ");
205
+ if (baseUrl) {
206
+ this.config.baseUrl = baseUrl;
207
+ }
208
+ }
209
+ this.save();
210
+ rl.close();
211
+ console.log("\n Configuration saved to " + CONFIG_PATH);
212
+ }
213
+ }
214
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.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,KAAK,QAAQ,MAAM,eAAe,CAAC;AAgB1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAClD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEvD,MAAM,cAAc,GAA6B;IAC/C,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,0BAA0B;IACrC,MAAM,EAAE,kBAAkB;IAC1B,GAAG,EAAE,SAAS;IACd,QAAQ,EAAE,eAAe;CAC1B,CAAC;AAEF,4BAA4B;AAC5B,SAAS,aAAa;IACpB,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,wBAAwB;KACpC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAa;IAE3B;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,sDAAsD;IAC9C,IAAI;QACV,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;gBACtD,OAAO,EAAE,GAAG,aAAa,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QACD,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;IAED,kCAAkC;IAC1B,IAAI;QACV,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,yBAAyB;IACzB,GAAG;QACD,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,qCAAqC;IACrC,YAAY;QACV,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,uEAAuE;IACvE,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED,iCAAiC;IACjC,MAAM,CAAC,QAAkB,EAAE,MAAc;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,yBAAyB;IACzB,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,UAAU,CAAC,OAA2B;QACpC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,gBAAgB;IAChB,QAAQ,CAAC,KAAuB;QAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,OAAO,CAAC,IAAuB;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,YAAY,CAAC,GAAW;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,WAAW;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;IACtC,CAAC;IAED,mCAAmC;IACnC,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED,+CAA+C;IAC/C,IAAI;QACF,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM;YACxB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC,CAAC,WAAW,CAAC;QAEhB,MAAM,KAAK,GAAG;YACZ,cAAc,CAAC,CAAC,IAAI,EAAE;YACtB,cAAc,CAAC,CAAC,QAAQ,EAAE;YAC1B,cAAc,SAAS,EAAE;YACzB,cAAc,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC/B,cAAc,CAAC,CAAC,OAAO,IAAI,WAAW,EAAE;YACxC,cAAc,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,EAAE;YACvE,cAAc,CAAC,CAAC,KAAK,EAAE;YACvB,cAAc,WAAW,EAAE;SAC5B,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,CAAC,QAAgB,EAAmB,EAAE,CAChD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACtB,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEL,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAExC,qBAAqB;QACrB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACtE,MAAM,WAAW,GAA6B;YAC5C,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,WAAW;YAChB,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,UAAU;SAChB,CAAC;QACF,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEhC,2BAA2B;QAC3B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,UAAU,KAAK,GAAG,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAE/C,IAAI,OAAO,EAAE,CAAC;YACZ,wCAAwC;YACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;YAE7B,aAAa;YACb,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,0BAA0B,aAAa,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC;YACtF,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,aAAa,EAAE,CAAC,SAAS,CAAC;YACpD,CAAC;YAED,uBAAuB;YACvB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,8BAA8B,CAAC,CAAC;YACzD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,wCAAwC;YACxC,MAAM,SAAS,GAAG,KAAK,QAAQ,YAAY,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,MAAM,WAAW,GAAG,qBAAqB,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAChF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC5B,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC5D,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,WAAW,CAAC,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @yuan/cli — DesignRenderer
3
+ * Terminal UI for Design Mode.
4
+ */
5
+ import type { DevServerState, DesignEvent, DOMSnapshot } from "@yuaone/core";
6
+ export declare class DesignRenderer {
7
+ showBanner(server: DevServerState): Promise<void>;
8
+ showDOMStatus(snapshot: DOMSnapshot): Promise<void>;
9
+ showEvent(event: DesignEvent): Promise<void>;
10
+ showDiff(filePath: string, oldLine: string, newLine: string): Promise<void>;
11
+ showPrompt(): Promise<void>;
12
+ showAgentPrefix(): Promise<void>;
13
+ showError(message: string): Promise<void>;
14
+ showInfo(message: string): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=design-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-renderer.d.ts","sourceRoot":"","sources":["../src/design-renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQ7E,qBAAa,cAAc;IACnB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjD,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI/C"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @yuan/cli — DesignRenderer
3
+ * Terminal UI for Design Mode.
4
+ */
5
+ let chalk;
6
+ async function getChalk() {
7
+ if (!chalk)
8
+ chalk = (await import("chalk")).default;
9
+ return chalk;
10
+ }
11
+ export class DesignRenderer {
12
+ async showBanner(server) {
13
+ const c = await getChalk();
14
+ const banner = [
15
+ "",
16
+ c.cyan("╭─ 🎨 YUAN Design Mode ─────────────────────────────╮"),
17
+ c.cyan("│") + ` 서버: ${c.green(server.url)}` + " ".repeat(Math.max(0, 37 - server.url.length)) + c.cyan("│"),
18
+ c.cyan("│") + ` 프레임워크: ${c.yellow(server.framework)}` + " ".repeat(Math.max(0, 33 - server.framework.length)) + c.cyan("│"),
19
+ c.cyan("│") + ` 상태: ${c.green("연결됨 ●")}` + " ".repeat(27) + c.cyan("│"),
20
+ c.cyan("╰────────────────────────────────────────────────────╯"),
21
+ "",
22
+ c.dim(" 브라우저에서 위 링크를 열고 작업하세요."),
23
+ c.dim(" 채팅으로 디자인 지시를 내리면 실시간 반영됩니다."),
24
+ c.dim(" Ctrl+C로 종료합니다."),
25
+ "",
26
+ ];
27
+ console.log(banner.join("\n"));
28
+ }
29
+ async showDOMStatus(snapshot) {
30
+ const c = await getChalk();
31
+ console.log(c.dim(`[DOM] ${snapshot.url} — ${snapshot.accessibilityTree.split("\n").length} lines`));
32
+ }
33
+ async showEvent(event) {
34
+ const c = await getChalk();
35
+ switch (event.type) {
36
+ case "design:file_changed":
37
+ console.log(c.green(` 📝 수정: ${event.data.file}`));
38
+ break;
39
+ case "design:hmr_detected":
40
+ console.log(c.green(" ✅ HMR 반영 완료. 확인해보세요."));
41
+ break;
42
+ case "design:security_warning":
43
+ for (const w of event.data.warnings) {
44
+ console.log(c.red(` ${w}`));
45
+ }
46
+ break;
47
+ case "design:browser_connected":
48
+ console.log(c.green(" 🌐 브라우저 연결됨"));
49
+ break;
50
+ default:
51
+ console.log(c.dim(` [${event.type}]`));
52
+ }
53
+ }
54
+ async showDiff(filePath, oldLine, newLine) {
55
+ const c = await getChalk();
56
+ console.log(c.dim(`\n diff: ${filePath}`));
57
+ console.log(c.red(` - ${oldLine}`));
58
+ console.log(c.green(` + ${newLine}`));
59
+ console.log();
60
+ }
61
+ async showPrompt() {
62
+ const c = await getChalk();
63
+ process.stdout.write(c.cyan("\nYou: "));
64
+ }
65
+ async showAgentPrefix() {
66
+ const c = await getChalk();
67
+ process.stdout.write(c.magenta("\nYUAN: "));
68
+ }
69
+ async showError(message) {
70
+ const c = await getChalk();
71
+ console.log(c.red(` ❌ ${message}`));
72
+ }
73
+ async showInfo(message) {
74
+ const c = await getChalk();
75
+ console.log(c.dim(` ${message}`));
76
+ }
77
+ }
78
+ //# sourceMappingURL=design-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-renderer.js","sourceRoot":"","sources":["../src/design-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @yuan/cli — Design Mode Entry Point
3
+ *
4
+ * `yuan design` command:
5
+ * 1. Detect framework from package.json
6
+ * 2. Start dev server (or detect existing)
7
+ * 3. Launch Playwright headless browser
8
+ * 4. Connect to dev server URL
9
+ * 5. Enter design chat loop
10
+ */
11
+ export interface DesignOptions {
12
+ port?: number;
13
+ autoVision?: boolean;
14
+ viewport?: string;
15
+ devCommand?: string;
16
+ }
17
+ export declare function runDesignMode(options?: DesignOptions): Promise<void>;
18
+ //# sourceMappingURL=design.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../src/design.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAeD,wBAAsB,aAAa,CACjC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA+Mf"}
package/dist/design.js ADDED
@@ -0,0 +1,190 @@
1
+ /**
2
+ * @yuan/cli — Design Mode Entry Point
3
+ *
4
+ * `yuan design` command:
5
+ * 1. Detect framework from package.json
6
+ * 2. Start dev server (or detect existing)
7
+ * 3. Launch Playwright headless browser
8
+ * 4. Connect to dev server URL
9
+ * 5. Enter design chat loop
10
+ */
11
+ import { resolve } from "node:path";
12
+ import { createInterface } from "node:readline";
13
+ import { DesignRenderer } from "./design-renderer.js";
14
+ import { ConfigManager } from "./config.js";
15
+ /** Parse viewport preset string to { width, height } */
16
+ function parseViewport(preset) {
17
+ if (!preset)
18
+ return undefined;
19
+ const presets = {
20
+ mobile: { width: 375, height: 812 },
21
+ tablet: { width: 768, height: 1024 },
22
+ desktop: { width: 1440, height: 900 },
23
+ };
24
+ return presets[preset.toLowerCase()];
25
+ }
26
+ export async function runDesignMode(options = {}) {
27
+ const renderer = new DesignRenderer();
28
+ const configManager = new ConfigManager();
29
+ if (!configManager.isConfigured()) {
30
+ await renderer.showError("No API key configured. Run: yuan config set-key");
31
+ process.exit(1);
32
+ }
33
+ const workDir = resolve(process.cwd());
34
+ // Dynamic imports to avoid loading Playwright at CLI boot
35
+ const { DevServerManager, BrowserTool, createDesignTools, createDefaultRegistry, setDesignBrowserSession, clearDesignBrowserSession, } = await import("@yuaone/tools");
36
+ const { DesignLoop, DEFAULT_LOOP_CONFIG } = await import("@yuaone/core");
37
+ const serverManager = new DevServerManager();
38
+ const browserTool = new BrowserTool();
39
+ // Detect and start dev server
40
+ const detected = await serverManager.detectFramework(workDir);
41
+ await renderer.showInfo(`프레임워크 감지: ${detected.framework} (${detected.devCommand})`);
42
+ let serverState;
43
+ try {
44
+ serverState = await serverManager.start(workDir, {
45
+ command: options.devCommand,
46
+ port: options.port,
47
+ timeout: 30_000,
48
+ });
49
+ }
50
+ catch (err) {
51
+ const msg = err instanceof Error ? err.message : String(err);
52
+ await renderer.showError(`Dev 서버 시작 실패: ${msg}`);
53
+ process.exit(1);
54
+ }
55
+ // Launch browser
56
+ let sessionId;
57
+ try {
58
+ const openResult = await browserTool.execute({ action: "open", url: serverState.url, _toolCallId: "init" }, workDir);
59
+ if (!openResult.success)
60
+ throw new Error(openResult.output);
61
+ const match = openResult.output.match(/Session:\s*(bs_\w+)/);
62
+ sessionId = match?.[1] ?? "default";
63
+ setDesignBrowserSession(sessionId, browserTool);
64
+ }
65
+ catch (err) {
66
+ const msg = err instanceof Error ? err.message : String(err);
67
+ await renderer.showError(`브라우저 연결 실패: ${msg}`);
68
+ await serverManager.stop();
69
+ process.exit(1);
70
+ }
71
+ await renderer.showBanner(serverState);
72
+ // Build AgentConfig matching the actual interface
73
+ const userConfig = configManager.get();
74
+ const registry = createDefaultRegistry();
75
+ for (const tool of createDesignTools()) {
76
+ registry.register(tool);
77
+ }
78
+ const toolExecutor = registry.toExecutor(workDir);
79
+ const viewport = parseViewport(options.viewport);
80
+ const designLoop = new DesignLoop({
81
+ config: {
82
+ byok: {
83
+ provider: (userConfig.provider ?? "anthropic"),
84
+ apiKey: userConfig.apiKey,
85
+ model: userConfig.model,
86
+ baseUrl: userConfig.baseUrl,
87
+ },
88
+ loop: {
89
+ model: "coding",
90
+ maxIterations: 50,
91
+ maxTokensPerIteration: DEFAULT_LOOP_CONFIG.maxTokensPerIteration,
92
+ totalTokenBudget: DEFAULT_LOOP_CONFIG.totalTokenBudget,
93
+ tools: toolExecutor.definitions,
94
+ systemPrompt: "",
95
+ projectPath: workDir,
96
+ },
97
+ },
98
+ toolExecutor,
99
+ governorConfig: { planTier: "PRO" },
100
+ designConfig: {
101
+ workDir,
102
+ autoVision: options.autoVision,
103
+ viewport,
104
+ devCommand: options.devCommand,
105
+ port: options.port,
106
+ },
107
+ getSnapshot: async () => {
108
+ const result = await browserTool.execute({ action: "dom", session_id: sessionId, _toolCallId: "snap" }, workDir);
109
+ return {
110
+ accessibilityTree: result.output,
111
+ url: serverState.url,
112
+ title: "",
113
+ timestamp: Date.now(),
114
+ };
115
+ },
116
+ getScreenshot: async () => {
117
+ const result = await browserTool.execute({
118
+ action: "screenshot",
119
+ session_id: sessionId,
120
+ _toolCallId: "shot",
121
+ }, workDir);
122
+ return result.output;
123
+ },
124
+ });
125
+ designLoop.on("design_event", async (event) => {
126
+ await renderer.showEvent(event);
127
+ });
128
+ // REPL
129
+ const rl = createInterface({
130
+ input: process.stdin,
131
+ output: process.stdout,
132
+ terminal: true,
133
+ });
134
+ const cleanup = async () => {
135
+ await renderer.showInfo("Design Mode 종료 중...");
136
+ clearDesignBrowserSession();
137
+ await browserTool.execute({ action: "close", session_id: sessionId, _toolCallId: "close" }, workDir);
138
+ await serverManager.stop();
139
+ rl.close();
140
+ process.exit(0);
141
+ };
142
+ process.on("SIGINT", cleanup);
143
+ process.on("SIGTERM", cleanup);
144
+ const askQuestion = () => {
145
+ renderer.showPrompt().then(() => {
146
+ rl.question("", async (input) => {
147
+ const trimmed = input.trim();
148
+ if (!trimmed) {
149
+ askQuestion();
150
+ return;
151
+ }
152
+ if (trimmed === "/quit" || trimmed === "/exit") {
153
+ await cleanup();
154
+ return;
155
+ }
156
+ try {
157
+ await renderer.showAgentPrefix();
158
+ const result = await designLoop.run(trimmed);
159
+ switch (result.reason) {
160
+ case "GOAL_ACHIEVED":
161
+ console.log(result.summary);
162
+ break;
163
+ case "MAX_ITERATIONS":
164
+ console.log(result.lastState);
165
+ break;
166
+ case "ERROR":
167
+ await renderer.showError(result.error);
168
+ break;
169
+ case "USER_CANCELLED":
170
+ await renderer.showInfo("작업이 취소되었습니다.");
171
+ break;
172
+ case "BUDGET_EXHAUSTED":
173
+ await renderer.showInfo(`토큰 예산 소진: ${result.tokensUsed} tokens`);
174
+ break;
175
+ case "NEEDS_APPROVAL":
176
+ await renderer.showInfo("승인이 필요합니다. (Design Mode에서는 자동 승인)");
177
+ break;
178
+ }
179
+ }
180
+ catch (err) {
181
+ const msg = err instanceof Error ? err.message : String(err);
182
+ await renderer.showError(msg);
183
+ }
184
+ askQuestion();
185
+ });
186
+ });
187
+ };
188
+ askQuestion();
189
+ }
190
+ //# sourceMappingURL=design.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design.js","sourceRoot":"","sources":["../src/design.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * YUAN CLI — Terminal Diff Viewer
3
+ *
4
+ * Renders unified diffs with color in the terminal.
5
+ * Design ref: Section 10.3 of YUAN_CODING_AGENT_DESIGN.md
6
+ */
7
+ /** A single line in a diff hunk */
8
+ export interface DiffLine {
9
+ type: "add" | "delete" | "context";
10
+ content: string;
11
+ lineNumberOld?: number;
12
+ lineNumberNew?: number;
13
+ }
14
+ /** A hunk in a unified diff */
15
+ export interface DiffHunk {
16
+ index: number;
17
+ startLineOld: number;
18
+ startLineNew: number;
19
+ lines: DiffLine[];
20
+ }
21
+ /** A complete unified diff for a file */
22
+ export interface UnifiedDiff {
23
+ filePath: string;
24
+ hunks: DiffHunk[];
25
+ stats: {
26
+ additions: number;
27
+ deletions: number;
28
+ };
29
+ }
30
+ /** User's decision on a diff */
31
+ export type DiffDecision = "accept" | "reject" | "rollback";
32
+ /**
33
+ * DiffRenderer — renders diffs in the terminal with colors
34
+ */
35
+ export declare class DiffRenderer {
36
+ /**
37
+ * Render a unified diff to the terminal.
38
+ * Additions are green (+), deletions are red (-), context is dim.
39
+ */
40
+ render(diff: UnifiedDiff): void;
41
+ /**
42
+ * Render a raw unified diff string (e.g. from `git diff`).
43
+ * Parses lines and colorizes +/- lines.
44
+ */
45
+ renderRawDiff(diffText: string): void;
46
+ /**
47
+ * Prompt the user to accept, reject, or rollback a diff.
48
+ * Returns the user's decision.
49
+ */
50
+ promptDecision(filePath: string): Promise<DiffDecision>;
51
+ /**
52
+ * Render a summary of all changed files.
53
+ */
54
+ renderSummary(diffs: UnifiedDiff[]): void;
55
+ }
56
+ //# sourceMappingURL=diff-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-renderer.d.ts","sourceRoot":"","sources":["../src/diff-renderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,mCAAmC;AACnC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,+BAA+B;AAC/B,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,gCAAgC;AAChC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE5D;;GAEG;AACH,qBAAa,YAAY;IACvB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAiD/B;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAkBrC;;;OAGG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAyB7D;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI;CA6B1C"}