magicpath-ai 1.4.1 → 1.5.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/cli.js +137 -52
  2. package/package.json +6 -7
  3. package/dist/cli.d.ts +0 -2
  4. package/dist/cli.js.map +0 -1
  5. package/dist/commands/add.d.ts +0 -48
  6. package/dist/commands/add.js +0 -451
  7. package/dist/commands/add.js.map +0 -1
  8. package/dist/commands/auth.d.ts +0 -7
  9. package/dist/commands/auth.js +0 -189
  10. package/dist/commands/auth.js.map +0 -1
  11. package/dist/commands/clone.d.ts +0 -2
  12. package/dist/commands/clone.js +0 -241
  13. package/dist/commands/clone.js.map +0 -1
  14. package/dist/commands/get-theme.d.ts +0 -2
  15. package/dist/commands/get-theme.js +0 -132
  16. package/dist/commands/get-theme.js.map +0 -1
  17. package/dist/commands/info.d.ts +0 -2
  18. package/dist/commands/info.js +0 -134
  19. package/dist/commands/info.js.map +0 -1
  20. package/dist/commands/inspect.d.ts +0 -53
  21. package/dist/commands/inspect.js +0 -122
  22. package/dist/commands/inspect.js.map +0 -1
  23. package/dist/commands/list-installed.d.ts +0 -2
  24. package/dist/commands/list-installed.js +0 -112
  25. package/dist/commands/list-installed.js.map +0 -1
  26. package/dist/commands/list-themes.d.ts +0 -2
  27. package/dist/commands/list-themes.js +0 -94
  28. package/dist/commands/list-themes.js.map +0 -1
  29. package/dist/commands/list.d.ts +0 -2
  30. package/dist/commands/list.js +0 -216
  31. package/dist/commands/list.js.map +0 -1
  32. package/dist/commands/schema.d.ts +0 -2
  33. package/dist/commands/schema.js +0 -292
  34. package/dist/commands/schema.js.map +0 -1
  35. package/dist/commands/search.d.ts +0 -2
  36. package/dist/commands/search.js +0 -124
  37. package/dist/commands/search.js.map +0 -1
  38. package/dist/commands/selection.d.ts +0 -2
  39. package/dist/commands/selection.js +0 -157
  40. package/dist/commands/selection.js.map +0 -1
  41. package/dist/commands/setup-skills.d.ts +0 -2
  42. package/dist/commands/setup-skills.js +0 -13
  43. package/dist/commands/setup-skills.js.map +0 -1
  44. package/dist/commands/view.d.ts +0 -2
  45. package/dist/commands/view.js +0 -27
  46. package/dist/commands/view.js.map +0 -1
  47. package/dist/commands/whoami.d.ts +0 -2
  48. package/dist/commands/whoami.js +0 -66
  49. package/dist/commands/whoami.js.map +0 -1
  50. package/dist/util/api.d.ts +0 -17
  51. package/dist/util/api.js +0 -49
  52. package/dist/util/api.js.map +0 -1
  53. package/dist/util/auth.d.ts +0 -26
  54. package/dist/util/auth.js +0 -113
  55. package/dist/util/auth.js.map +0 -1
  56. package/dist/util/authError.d.ts +0 -4
  57. package/dist/util/authError.js +0 -7
  58. package/dist/util/authError.js.map +0 -1
  59. package/dist/util/banner.d.ts +0 -1
  60. package/dist/util/banner.js +0 -79
  61. package/dist/util/banner.js.map +0 -1
  62. package/dist/util/component.d.ts +0 -186
  63. package/dist/util/component.js +0 -349
  64. package/dist/util/component.js.map +0 -1
  65. package/dist/util/dependencies.d.ts +0 -12
  66. package/dist/util/dependencies.js +0 -93
  67. package/dist/util/dependencies.js.map +0 -1
  68. package/dist/util/error.d.ts +0 -9
  69. package/dist/util/error.js +0 -10
  70. package/dist/util/error.js.map +0 -1
  71. package/dist/util/ide.d.ts +0 -3
  72. package/dist/util/ide.js +0 -145
  73. package/dist/util/ide.js.map +0 -1
  74. package/dist/util/liveblocks.d.ts +0 -24
  75. package/dist/util/liveblocks.js +0 -112
  76. package/dist/util/liveblocks.js.map +0 -1
  77. package/dist/util/logger.d.ts +0 -7
  78. package/dist/util/logger.js +0 -21
  79. package/dist/util/logger.js.map +0 -1
  80. package/dist/util/output.d.ts +0 -15
  81. package/dist/util/output.js +0 -36
  82. package/dist/util/output.js.map +0 -1
  83. package/dist/util/project.d.ts +0 -3
  84. package/dist/util/project.js +0 -64
  85. package/dist/util/project.js.map +0 -1
  86. package/dist/util/ui.d.ts +0 -11
  87. package/dist/util/ui.js +0 -30
  88. package/dist/util/ui.js.map +0 -1
@@ -1,189 +0,0 @@
1
- import http from 'http';
2
- import ora from 'ora';
3
- import axios from 'axios';
4
- import { exec } from 'child_process';
5
- import { MagicPathError } from '../util/error.js';
6
- import { makeWebUrl, makeAuthUrl } from '../util/api.js';
7
- import { saveTokens, clearSession, loadTokens, fetchAndCacheUser, } from '../util/auth.js';
8
- import { isJsonMode, jsonResult, jsonError } from '../util/output.js';
9
- const LOGIN_TIMEOUT_MS = 120_000;
10
- const PAGE_STYLE = `
11
- *{margin:0;padding:0;box-sizing:border-box}
12
- body{font-family:Geist,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;background:#fff;color:#1a1a1a;padding:1rem}
13
- .card{position:relative;width:100%;max-width:32rem;background:#fff;border-radius:1.5rem;box-shadow:0 1px 3px rgba(0,0,0,.1),0 8px 10px -1px rgba(0,0,0,.1);overflow:hidden}
14
- .gradient{position:absolute;top:0;left:0;right:0;height:12rem;background:radial-gradient(circle at center top,#DCF1E3 0%,#fff 80%);opacity:.2;pointer-events:none}
15
- .content{position:relative;z-index:1;padding:2rem;display:flex;flex-direction:column;align-items:center}
16
- .icon-box{width:4rem;height:4rem;border-radius:1rem;background:rgba(220,241,227,.1);display:flex;align-items:center;justify-content:center;margin-bottom:1rem}
17
- .icon-box svg{width:2rem;height:2rem}
18
- h1{font-size:1.5rem;font-weight:600;margin-bottom:.5rem;text-align:center}
19
- p{color:#999;font-size:.9rem;text-align:center;max-width:24rem;line-height:1.5}
20
- `;
21
- const CHECK_ICON = `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="#085C34"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/></svg>`;
22
- const ERROR_ICON = `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="#dc2626"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z"/></svg>`;
23
- const SUCCESS_HTML = `<!DOCTYPE html>
24
- <html><head><meta charset="utf-8"><title>MagicPath CLI</title>
25
- <style>${PAGE_STYLE}</style>
26
- </head><body><div class="card"><div class="gradient"></div><div class="content">
27
- <div class="icon-box">${CHECK_ICON}</div>
28
- <h1>Logged in!</h1>
29
- <p>You can close this tab and return to your terminal.</p>
30
- </div></div></body></html>`;
31
- const ERROR_HTML = (msg) => `<!DOCTYPE html>
32
- <html><head><meta charset="utf-8"><title>MagicPath CLI</title>
33
- <style>${PAGE_STYLE}</style>
34
- </head><body><div class="card"><div class="gradient"></div><div class="content">
35
- <div class="icon-box">${ERROR_ICON}</div>
36
- <h1>Login failed</h1>
37
- <p>${msg}</p>
38
- </div></div></body></html>`;
39
- /**
40
- * Run the interactive login flow: start localhost server, open browser, receive callback with code.
41
- * Returns true if login succeeded, false if cancelled/timed out.
42
- */
43
- export async function runLoginFlow() {
44
- return new Promise((resolve, reject) => {
45
- let settled = false;
46
- let timeout;
47
- const server = http.createServer(async (req, res) => {
48
- const url = new URL(req.url || '/', `http://localhost`);
49
- if (url.pathname !== '/callback') {
50
- res.writeHead(404, { 'Content-Type': 'text/plain' });
51
- res.end('Not found');
52
- return;
53
- }
54
- const code = url.searchParams.get('code');
55
- if (!code) {
56
- res.writeHead(400, { 'Content-Type': 'text/html' });
57
- res.end(ERROR_HTML('No authorization code received.'));
58
- return;
59
- }
60
- try {
61
- const response = await axios.post(makeAuthUrl('extension/tokens'), {
62
- token: code,
63
- });
64
- const { access_token, refresh_token } = response.data;
65
- saveTokens(access_token, refresh_token);
66
- try {
67
- await fetchAndCacheUser();
68
- }
69
- catch {
70
- /* non-critical */
71
- }
72
- res.writeHead(200, { 'Content-Type': 'text/html' });
73
- res.end(SUCCESS_HTML);
74
- cleanup();
75
- spinner.succeed('Logged in successfully!');
76
- settled = true;
77
- resolve(true);
78
- }
79
- catch (error) {
80
- const msg = axios.isAxiosError(error) && error.response?.status === 400
81
- ? 'Invalid or expired authorization code. Please try again.'
82
- : 'Failed to exchange code. Please try again.';
83
- res.writeHead(400, { 'Content-Type': 'text/html' });
84
- res.end(ERROR_HTML(msg));
85
- cleanup();
86
- spinner.fail('Login failed');
87
- settled = true;
88
- reject(new MagicPathError(msg));
89
- }
90
- });
91
- function cleanup() {
92
- clearTimeout(timeout);
93
- server.close();
94
- }
95
- server.listen(0, '127.0.0.1', () => {
96
- const addr = server.address();
97
- if (!addr || typeof addr === 'string') {
98
- settled = true;
99
- reject(new MagicPathError('Failed to start local auth server.'));
100
- return;
101
- }
102
- const port = addr.port;
103
- const authUrl = makeWebUrl(`/auth/cli?port=${port}`);
104
- console.log(`\nOpening your browser to log in...\n`);
105
- console.log(`If the browser doesn't open, visit: ${authUrl}\n`);
106
- const platform = process.platform;
107
- const openCmd = platform === 'darwin'
108
- ? 'open'
109
- : platform === 'win32'
110
- ? 'start'
111
- : 'xdg-open';
112
- exec(`${openCmd} "${authUrl}"`);
113
- });
114
- const spinner = ora('Waiting for browser login...').start();
115
- timeout = setTimeout(() => {
116
- if (!settled) {
117
- cleanup();
118
- spinner.fail('Login timed out');
119
- console.log('\nTip: You can also log in with `magicpath-ai login --code <code>`.');
120
- settled = true;
121
- resolve(false);
122
- }
123
- }, LOGIN_TIMEOUT_MS);
124
- });
125
- }
126
- export function registerAuthCommands(program) {
127
- program
128
- .command('login')
129
- .description('Log in to your MagicPath account')
130
- .option('--code <code>', 'Exchange an authorization code non-interactively')
131
- .action(async (options) => {
132
- try {
133
- if (options.code) {
134
- // Non-interactive: exchange auth code directly
135
- const response = await axios.post(makeAuthUrl('extension/tokens'), {
136
- token: options.code,
137
- });
138
- const { access_token, refresh_token } = response.data;
139
- saveTokens(access_token, refresh_token);
140
- try {
141
- await fetchAndCacheUser();
142
- }
143
- catch {
144
- /* non-critical */
145
- }
146
- if (isJsonMode()) {
147
- jsonResult({ authenticated: true, method: 'code' });
148
- }
149
- console.log('Logged in successfully!');
150
- return;
151
- }
152
- if (isJsonMode()) {
153
- // In JSON mode, check if already authenticated via env var or stored tokens
154
- if (process.env.MAGICPATH_TOKEN) {
155
- jsonResult({ authenticated: true, method: 'environment' });
156
- }
157
- const tokens = loadTokens();
158
- if (tokens) {
159
- jsonResult({ authenticated: true, method: 'stored' });
160
- }
161
- jsonError(new Error('Not authenticated. Set MAGICPATH_TOKEN environment variable or run login interactively.'));
162
- }
163
- const loggedIn = await runLoginFlow();
164
- if (!loggedIn) {
165
- console.log('Login cancelled.');
166
- }
167
- }
168
- catch (err) {
169
- if (isJsonMode())
170
- jsonError(err);
171
- if (err instanceof MagicPathError) {
172
- console.error(`\n${err.message}`);
173
- process.exit(1);
174
- }
175
- throw err;
176
- }
177
- });
178
- program
179
- .command('logout')
180
- .description('Log out of your MagicPath account')
181
- .action(() => {
182
- clearSession();
183
- if (isJsonMode()) {
184
- jsonResult({ loggedOut: true });
185
- }
186
- console.log('Logged out successfully.');
187
- });
188
- }
189
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAEjC,MAAM,UAAU,GAAG;;;;;;;;;;CAUlB,CAAC;AAEF,MAAM,UAAU,GAAG,2OAA2O,CAAC;AAC/P,MAAM,UAAU,GAAG,wPAAwP,CAAC;AAE5Q,MAAM,YAAY,GAAG;;SAEZ,UAAU;;wBAEK,UAAU;;;2BAGP,CAAC;AAE5B,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC;;SAE3B,UAAU;;wBAEK,UAAU;;KAE7B,GAAG;2BACmB,CAAC;AAE5B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,OAAsC,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YAExD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE;oBACjE,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;gBAEH,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;gBACtD,UAAU,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,iBAAiB,EAAE,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,kBAAkB;gBACpB,CAAC;gBAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAEtB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;gBAC3C,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GACP,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG;oBACzD,CAAC,CAAC,0DAA0D;oBAC5D,CAAC,CAAC,4CAA4C,CAAC;gBAEnD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEzB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,OAAO;YACd,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,IAAI,cAAc,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;YAErD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,IAAI,CAAC,CAAC;YAEhE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YAClC,MAAM,OAAO,GACX,QAAQ,KAAK,QAAQ;gBACnB,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,QAAQ,KAAK,OAAO;oBACpB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,UAAU,CAAC;YAEnB,IAAI,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,GAAG,CAAC,8BAA8B,CAAC,CAAC,KAAK,EAAE,CAAC;QAE5D,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CACT,qEAAqE,CACtE,CAAC;gBACF,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,kDAAkD,CAAC;SAC3E,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,+CAA+C;gBAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE;oBACjE,KAAK,EAAE,OAAO,CAAC,IAAI;iBACpB,CAAC,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;gBACtD,UAAU,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,iBAAiB,EAAE,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,kBAAkB;gBACpB,CAAC;gBACD,IAAI,UAAU,EAAE,EAAE,CAAC;oBACjB,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBACtD,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,4EAA4E;gBAC5E,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;oBAChC,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,IAAI,MAAM,EAAE,CAAC;oBACX,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxD,CAAC;gBACD,SAAS,CACP,IAAI,KAAK,CACP,yFAAyF,CAC1F,CACF,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,UAAU,EAAE;gBAAE,SAAS,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,GAAG,EAAE;QACX,YAAY,EAAE,CAAC;QACf,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { Command } from 'commander';
2
- export declare function registerCloneCommand(program: Command): void;
@@ -1,241 +0,0 @@
1
- import prompts from 'prompts';
2
- import ora from 'ora';
3
- import { z } from 'zod';
4
- import path from 'path';
5
- import os from 'os';
6
- import fs from 'fs-extra';
7
- import { enableDebugLogger, logger } from '../util/logger.js';
8
- import { MagicPathError } from '../util/error.js';
9
- import { isJsonMode, jsonResult, jsonError } from '../util/output.js';
10
- import { downloadProject, releaseProject, unpackProject, } from '../util/project.js';
11
- import { installDependencies } from '../util/dependencies.js';
12
- import { openInIDE, openInFileManager } from '../util/ide.js';
13
- const cloneOptionsSchema = z.object({
14
- key: z.string(),
15
- debug: z.boolean().default(false),
16
- ide: z.enum(['cursor', 'antigravity', 'vscode', 'webstorm']).optional(),
17
- dir: z.string().optional(),
18
- name: z.string().optional(),
19
- });
20
- export function registerCloneCommand(program) {
21
- program
22
- .command('clone')
23
- .description('✨ Instantly bring your MagicPath project to your local playground. Edit, remix, and create in your own vibe.')
24
- .requiredOption('-k, --key <accessKey>', '🔑 One-time magic access key to unlock and download your project')
25
- .option('-d, --debug', 'Get verbose debug logs in the CLI')
26
- .option('-i, --ide <ide>', 'Pre-select IDE to open project in (cursor, antigravity, vscode, webstorm)')
27
- .option('--dir <directory>', 'Target directory for non-interactive use')
28
- .option('--name <projectName>', 'Project name for non-interactive use')
29
- .action(async (options) => {
30
- let cloneOptions;
31
- try {
32
- cloneOptions = cloneOptionsSchema.parse(options);
33
- }
34
- catch {
35
- throw new Error('Invalid CLI options for clone command.');
36
- }
37
- if (cloneOptions.debug)
38
- enableDebugLogger();
39
- const json = isJsonMode();
40
- // In JSON mode, require --dir and --name
41
- if (json && (!cloneOptions.dir || !cloneOptions.name)) {
42
- jsonError(new Error('In JSON mode, --dir and --name are required for clone.'));
43
- }
44
- logger.debug({ options });
45
- logger.debug({ options: cloneOptions });
46
- let finalTargetDir;
47
- let projectName;
48
- if (cloneOptions.dir && cloneOptions.name) {
49
- // Non-interactive mode
50
- finalTargetDir = path.resolve(cloneOptions.dir);
51
- projectName = cloneOptions.name;
52
- await fs.ensureDir(finalTargetDir);
53
- }
54
- else {
55
- // Step 1: Ask the user where to drop their fresh code
56
- const homeDir = os.homedir();
57
- const commonDirs = [
58
- { name: 'Documents', path: path.join(homeDir, 'Documents') },
59
- { name: 'Desktop', path: path.join(homeDir, 'Desktop') },
60
- { name: 'Downloads', path: path.join(homeDir, 'Downloads') },
61
- ];
62
- // Filter to only include directories that actually exist
63
- const existingDirs = await Promise.all(commonDirs.map(async (dir) => {
64
- try {
65
- const exists = await fs.pathExists(dir.path);
66
- return exists ? dir : null;
67
- }
68
- catch {
69
- return null;
70
- }
71
- }));
72
- const validDirs = existingDirs.filter((dir) => dir !== null);
73
- // Build choices array starting with current directory and home directory
74
- const choices = [
75
- {
76
- title: `Right here (current folder: ${process.cwd()})`,
77
- value: process.cwd(),
78
- },
79
- { title: `Home directory (${homeDir})`, value: homeDir },
80
- ];
81
- // Add existing standard directories
82
- validDirs.forEach((dir) => {
83
- choices.push({ title: dir.name, value: dir.path });
84
- });
85
- // Add option for custom directory
86
- choices.push({ title: 'Other (specify custom path)', value: 'custom' });
87
- const { targetDir } = await prompts({
88
- type: 'select',
89
- name: 'targetDir',
90
- message: 'Where should we put your code?',
91
- choices,
92
- initial: 0,
93
- });
94
- finalTargetDir = targetDir;
95
- // Handle custom directory selection
96
- if (targetDir === 'custom') {
97
- const { customPath } = await prompts({
98
- type: 'text',
99
- name: 'customPath',
100
- message: 'Enter the full path where you want to create your project:',
101
- initial: homeDir,
102
- validate: (value) => {
103
- if (!value)
104
- return 'Please enter a path';
105
- try {
106
- path.resolve(value);
107
- return true;
108
- }
109
- catch {
110
- return 'Please enter a valid path';
111
- }
112
- },
113
- });
114
- if (!customPath) {
115
- throw new MagicPathError('Project creation cancelled');
116
- }
117
- finalTargetDir = path.resolve(customPath);
118
- try {
119
- await fs.ensureDir(finalTargetDir);
120
- }
121
- catch (err) {
122
- throw new MagicPathError(`Failed to create or access directory: ${finalTargetDir}`);
123
- }
124
- }
125
- if (!finalTargetDir) {
126
- throw new MagicPathError('Download cancelled');
127
- }
128
- // Step 2: Ask for project name
129
- const nameResult = await prompts({
130
- type: 'text',
131
- name: 'projectName',
132
- message: 'What would you like to name your project?',
133
- initial: 'magicpath-project',
134
- });
135
- projectName = nameResult.projectName;
136
- if (!projectName) {
137
- throw new MagicPathError('Project creation cancelled');
138
- }
139
- }
140
- let filename;
141
- // Step 3: Download project
142
- const downloadSpinner = json
143
- ? null
144
- : ora('📥 Downloading project...').start();
145
- try {
146
- filename = await downloadProject(cloneOptions.key);
147
- logger.debug({ filename });
148
- downloadSpinner?.succeed('Project downloaded');
149
- }
150
- catch (err) {
151
- downloadSpinner?.fail('Download failed');
152
- if (err instanceof MagicPathError) {
153
- throw err;
154
- }
155
- else {
156
- throw new MagicPathError('Something went wrong!');
157
- }
158
- }
159
- // Step 4: Unpack project
160
- const unpackSpinner = json
161
- ? null
162
- : ora('📦 Unpacking project...').start();
163
- let projectDir;
164
- try {
165
- projectDir = unpackProject(filename, projectName, finalTargetDir);
166
- unpackSpinner?.succeed(`Project unpacked to ${projectName}`);
167
- }
168
- catch (err) {
169
- unpackSpinner?.fail('Failed to unpack project');
170
- releaseProject(filename);
171
- if (err instanceof MagicPathError) {
172
- throw err;
173
- }
174
- else {
175
- throw new MagicPathError('Something went wrong!');
176
- }
177
- }
178
- // Step 5: Install dependencies
179
- try {
180
- installDependencies(projectDir);
181
- }
182
- catch (err) {
183
- if (err instanceof MagicPathError) {
184
- throw err;
185
- }
186
- else {
187
- throw new MagicPathError('Something went wrong!');
188
- }
189
- }
190
- // JSON mode: return result
191
- if (json) {
192
- jsonResult({ projectDir });
193
- }
194
- // Step 6: Ask which IDE to open the project in (or use pre-selected one)
195
- const ideChoices = [
196
- { title: 'Cursor', value: 'cursor' },
197
- { title: 'Antigravity', value: 'antigravity' },
198
- { title: 'VS Code', value: 'vscode' },
199
- { title: 'WebStorm', value: 'webstorm' },
200
- { title: 'Open in file manager', value: 'filemanager' },
201
- { title: 'None (just finish)', value: 'none' },
202
- ];
203
- // Determine initial selection based on --ide flag
204
- let initialSelection = 0;
205
- if (cloneOptions.ide) {
206
- const preselectedIndex = ideChoices.findIndex((choice) => choice.value === cloneOptions.ide);
207
- if (preselectedIndex !== -1) {
208
- initialSelection = preselectedIndex;
209
- }
210
- }
211
- const ideResponse = await prompts({
212
- type: 'select',
213
- name: 'ide',
214
- message: 'Which IDE would you like to open the project in?',
215
- choices: ideChoices,
216
- initial: initialSelection,
217
- });
218
- // Step 7: Open in IDE or file manager if selected
219
- if (ideResponse.ide && ideResponse.ide !== 'none') {
220
- try {
221
- if (ideResponse.ide === 'filemanager') {
222
- openInFileManager(projectDir);
223
- }
224
- else {
225
- openInIDE(projectDir, ideResponse.ide);
226
- }
227
- }
228
- catch (err) {
229
- logger.debug({ err });
230
- if (err instanceof MagicPathError) {
231
- console.log(err.message);
232
- }
233
- else {
234
- console.log('⚠️ Opening failed, but your project is ready!');
235
- }
236
- }
237
- }
238
- console.log(`\n🎉 Done! Your project is ready to go at: ${projectDir}`);
239
- });
240
- }
241
- //# sourceMappingURL=clone.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/commands/clone.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { Command } from 'commander';
2
- export declare function registerGetThemeCommand(program: Command): void;
@@ -1,132 +0,0 @@
1
- import axios from 'axios';
2
- import { brandSpinner } from '../util/ui.js';
3
- import { MagicPathError } from '../util/error.js';
4
- import { getAuthHeaders } from '../util/auth.js';
5
- import { getUserDesignSystemsUrl, getDesignSystemUrl } from '../util/api.js';
6
- import { isJsonMode, jsonResult, jsonError } from '../util/output.js';
7
- export function registerGetThemeCommand(program) {
8
- program
9
- .command('get-theme')
10
- .description('Get a theme definition (CSS variables, fonts, styling prompt)')
11
- .argument('<themeIdOrName>', 'Theme ID (numeric) or name (case-insensitive match)')
12
- .action(async (themeIdOrName) => {
13
- const json = isJsonMode();
14
- try {
15
- let headers;
16
- try {
17
- headers = getAuthHeaders();
18
- }
19
- catch {
20
- throw new MagicPathError('Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.', {
21
- code: 'NOT_AUTHENTICATED',
22
- suggestion: 'Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable.',
23
- });
24
- }
25
- const spinner = json ? null : brandSpinner('Fetching theme...').start();
26
- try {
27
- // Resolve ID: if non-numeric, look up by name
28
- let themeId = themeIdOrName;
29
- let resolvedName;
30
- if (!/^\d+$/.test(themeIdOrName)) {
31
- const listResponse = await axios.get(getUserDesignSystemsUrl(), {
32
- headers,
33
- });
34
- const allThemes = listResponse.data.data?.design_systems ??
35
- listResponse.data.design_systems ??
36
- listResponse.data;
37
- const themes = Array.isArray(allThemes) ? allThemes : [];
38
- const query = themeIdOrName.toLowerCase();
39
- const match = themes.find((t) => (t.name || '').toLowerCase() === query);
40
- if (!match) {
41
- throw new MagicPathError(`Theme "${themeIdOrName}" not found.`, {
42
- code: 'NOT_FOUND',
43
- suggestion: 'Run `magicpath-ai list-themes` to see available themes.',
44
- });
45
- }
46
- themeId = String(match.id);
47
- resolvedName = match.name;
48
- }
49
- const response = await axios.get(getDesignSystemUrl(themeId), {
50
- headers,
51
- });
52
- const designSystem = response.data.data?.design_system ?? response.data.design_system;
53
- const name = designSystem.name ?? resolvedName ?? themeId;
54
- const data = designSystem.data;
55
- spinner?.succeed(`Theme: ${name}`);
56
- if (json) {
57
- jsonResult({
58
- id: String(designSystem.id ?? themeId),
59
- name,
60
- theme: data.theme,
61
- defaultTheme: data.defaultTheme,
62
- prompt: data.prompt,
63
- fonts: data.fonts,
64
- version: data.version,
65
- });
66
- }
67
- // Human-readable output
68
- console.log('');
69
- console.log(` Name: ${name}`);
70
- console.log(` ID: ${designSystem.id ?? themeId}`);
71
- console.log(` Default Theme: ${data.defaultTheme ?? 'light'}`);
72
- if (data.prompt) {
73
- console.log(` Prompt: ${data.prompt}`);
74
- }
75
- // CSS variables
76
- for (const mode of ['light', 'dark']) {
77
- const vars = data.theme?.[mode];
78
- if (vars && Object.keys(vars).length > 0) {
79
- console.log(`\n ${mode.charAt(0).toUpperCase() + mode.slice(1)} Theme Variables:`);
80
- const varWidth = Math.max(8, ...Object.keys(vars).map((k) => k.length));
81
- console.log(` ${'Variable'.padEnd(varWidth)} Value`);
82
- console.log(` ${'─'.repeat(varWidth)} ${'─'.repeat(30)}`);
83
- for (const [key, value] of Object.entries(vars)) {
84
- console.log(` ${key.padEnd(varWidth)} ${value}`);
85
- }
86
- }
87
- }
88
- // Fonts
89
- if (data.fonts && Object.keys(data.fonts).length > 0) {
90
- console.log('\n Fonts:');
91
- for (const [family, meta] of Object.entries(data.fonts)) {
92
- const weights = meta.weights
93
- ? Object.keys(meta.weights).join(', ')
94
- : 'default';
95
- console.log(` ${family} (${meta.source}, weights: ${weights})`);
96
- }
97
- }
98
- }
99
- catch (err) {
100
- spinner?.fail('Failed to fetch theme');
101
- if (axios.isAxiosError(err)) {
102
- if (err.response?.status === 401) {
103
- throw new MagicPathError('Token is invalid or expired. Run `magicpath-ai login`.', {
104
- code: 'TOKEN_EXPIRED',
105
- suggestion: 'Run `magicpath-ai login` to re-authenticate.',
106
- });
107
- }
108
- if (err.response?.status === 404 || err.response?.status === 403) {
109
- throw new MagicPathError(`Theme "${themeIdOrName}" not found or not accessible.`, {
110
- code: 'NOT_FOUND',
111
- suggestion: 'Run `magicpath-ai list-themes` to see available themes.',
112
- });
113
- }
114
- throw new MagicPathError(`API error: ${err.response?.status}`);
115
- }
116
- if (err instanceof MagicPathError)
117
- throw err;
118
- throw err;
119
- }
120
- }
121
- catch (err) {
122
- if (json)
123
- jsonError(err);
124
- if (err instanceof MagicPathError) {
125
- console.error(`\n${err.message}`);
126
- process.exit(1);
127
- }
128
- throw err;
129
- }
130
- });
131
- }
132
- //# sourceMappingURL=get-theme.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-theme.js","sourceRoot":"","sources":["../../src/commands/get-theme.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { Command } from 'commander';
2
- export declare function registerInfoCommand(program: Command): void;