repowise 0.1.41 → 0.1.42

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 (81) hide show
  1. package/dist/src/commands/config.d.ts +2 -0
  2. package/dist/src/commands/config.d.ts.map +1 -0
  3. package/dist/src/commands/config.js +95 -0
  4. package/dist/src/commands/config.js.map +1 -0
  5. package/dist/src/commands/create.d.ts +2 -0
  6. package/dist/src/commands/create.d.ts.map +1 -0
  7. package/dist/src/commands/create.js +309 -0
  8. package/dist/src/commands/create.js.map +1 -0
  9. package/dist/src/commands/listen.d.ts +5 -0
  10. package/dist/src/commands/listen.d.ts.map +1 -0
  11. package/dist/src/commands/listen.js +47 -0
  12. package/dist/src/commands/listen.js.map +1 -0
  13. package/dist/src/commands/login.d.ts +5 -0
  14. package/dist/src/commands/login.d.ts.map +1 -0
  15. package/dist/src/commands/login.js +58 -0
  16. package/dist/src/commands/login.js.map +1 -0
  17. package/dist/src/commands/logout.d.ts +2 -0
  18. package/dist/src/commands/logout.d.ts.map +1 -0
  19. package/dist/src/commands/logout.js +12 -0
  20. package/dist/src/commands/logout.js.map +1 -0
  21. package/dist/src/commands/start.d.ts +2 -0
  22. package/dist/src/commands/start.d.ts.map +1 -0
  23. package/dist/src/commands/start.js +17 -0
  24. package/dist/src/commands/start.js.map +1 -0
  25. package/dist/src/commands/status.d.ts +2 -0
  26. package/dist/src/commands/status.d.ts.map +1 -0
  27. package/dist/src/commands/status.js +63 -0
  28. package/dist/src/commands/status.js.map +1 -0
  29. package/dist/src/commands/stop.d.ts +2 -0
  30. package/dist/src/commands/stop.d.ts.map +1 -0
  31. package/dist/src/commands/stop.js +17 -0
  32. package/dist/src/commands/stop.js.map +1 -0
  33. package/dist/src/commands/sync.d.ts +2 -0
  34. package/dist/src/commands/sync.d.ts.map +1 -0
  35. package/dist/src/commands/sync.js +205 -0
  36. package/dist/src/commands/sync.js.map +1 -0
  37. package/dist/src/lib/ai-tools.d.ts +23 -0
  38. package/dist/src/lib/ai-tools.d.ts.map +1 -0
  39. package/dist/src/lib/ai-tools.js +193 -0
  40. package/dist/src/lib/ai-tools.js.map +1 -0
  41. package/dist/src/lib/api.d.ts +2 -0
  42. package/dist/src/lib/api.d.ts.map +1 -0
  43. package/dist/src/lib/api.js +38 -0
  44. package/dist/src/lib/api.js.map +1 -0
  45. package/dist/src/lib/auth.d.ts +28 -0
  46. package/dist/src/lib/auth.d.ts.map +1 -0
  47. package/dist/src/lib/auth.js +271 -0
  48. package/dist/src/lib/auth.js.map +1 -0
  49. package/dist/src/lib/config.d.ts +15 -0
  50. package/dist/src/lib/config.d.ts.map +1 -0
  51. package/dist/src/lib/config.js +19 -0
  52. package/dist/src/lib/config.js.map +1 -0
  53. package/dist/src/lib/env.d.ts +10 -0
  54. package/dist/src/lib/env.d.ts.map +1 -0
  55. package/dist/src/lib/env.js +26 -0
  56. package/dist/src/lib/env.js.map +1 -0
  57. package/dist/src/lib/interview-handler.d.ts +2 -0
  58. package/dist/src/lib/interview-handler.d.ts.map +1 -0
  59. package/dist/src/lib/interview-handler.js +100 -0
  60. package/dist/src/lib/interview-handler.js.map +1 -0
  61. package/dist/src/lib/progress-renderer.d.ts +84 -0
  62. package/dist/src/lib/progress-renderer.d.ts.map +1 -0
  63. package/dist/src/lib/progress-renderer.js +388 -0
  64. package/dist/src/lib/progress-renderer.js.map +1 -0
  65. package/dist/src/lib/prompts.d.ts +7 -0
  66. package/dist/src/lib/prompts.d.ts.map +1 -0
  67. package/dist/src/lib/prompts.js +33 -0
  68. package/dist/src/lib/prompts.js.map +1 -0
  69. package/dist/src/lib/welcome.d.ts +6 -0
  70. package/dist/src/lib/welcome.d.ts.map +1 -0
  71. package/dist/src/lib/welcome.js +42 -0
  72. package/dist/src/lib/welcome.js.map +1 -0
  73. package/dist/src/types/index.d.ts +4 -0
  74. package/dist/src/types/index.d.ts.map +1 -0
  75. package/dist/src/types/index.js +2 -0
  76. package/dist/src/types/index.js.map +1 -0
  77. package/dist/tsup.config.d.ts +3 -0
  78. package/dist/tsup.config.d.ts.map +1 -0
  79. package/dist/tsup.config.js +18 -0
  80. package/dist/tsup.config.js.map +1 -0
  81. package/package.json +3 -5
@@ -0,0 +1,2 @@
1
+ export declare function config(): Promise<void>;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"AAeA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAiG5C"}
@@ -0,0 +1,95 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { select } from '@inquirer/prompts';
4
+ import { getValidCredentials, performLogin, decodeIdToken } from '../lib/auth.js';
5
+ import { apiRequest } from '../lib/api.js';
6
+ export async function config() {
7
+ const spinner = ora('Checking authentication...').start();
8
+ try {
9
+ let credentials = await getValidCredentials();
10
+ if (!credentials) {
11
+ spinner.info(chalk.yellow('Not logged in. Opening browser to authenticate...'));
12
+ credentials = await performLogin();
13
+ const { email } = decodeIdToken(credentials.idToken);
14
+ spinner.succeed(chalk.green(`Authenticated as ${chalk.bold(email)}`));
15
+ }
16
+ else {
17
+ spinner.succeed('Authenticated');
18
+ }
19
+ // Fetch repos
20
+ spinner.start('Loading repositories...');
21
+ const repos = await apiRequest('/v1/repos');
22
+ spinner.stop();
23
+ if (repos.length === 0) {
24
+ console.log(chalk.yellow('No repositories connected. Run `repowise create` first.'));
25
+ return;
26
+ }
27
+ // Select repo
28
+ const repoId = await select({
29
+ message: 'Select a repository to configure',
30
+ choices: repos.map((r) => ({
31
+ name: r.fullName,
32
+ value: r.repoId,
33
+ })),
34
+ });
35
+ const repo = repos.find((r) => r.repoId === repoId);
36
+ const currentDelivery = repo.deliveryMode ?? 'direct';
37
+ const currentBranch = repo.monitoredBranch ?? repo.defaultBranch;
38
+ console.log('');
39
+ console.log(chalk.bold(`Settings for ${repo.fullName}`));
40
+ console.log(chalk.dim(` Context storage: RepoWise servers`));
41
+ console.log(chalk.dim(` Delivery mode: ${currentDelivery}`));
42
+ console.log(chalk.dim(` Monitored branch: ${currentBranch}`));
43
+ console.log('');
44
+ // Select setting to change
45
+ const setting = await select({
46
+ message: 'What would you like to change?',
47
+ choices: [
48
+ { name: `Delivery mode (current: ${currentDelivery})`, value: 'deliveryMode' },
49
+ { name: `Monitored branch (current: ${currentBranch})`, value: 'monitoredBranch' },
50
+ ],
51
+ });
52
+ const patch = {};
53
+ if (setting === 'deliveryMode') {
54
+ const newMode = await select({
55
+ message: 'Delivery mode',
56
+ choices: [
57
+ { name: 'Direct push to branch', value: 'direct' },
58
+ { name: 'Create pull request', value: 'pr' },
59
+ ],
60
+ default: currentDelivery,
61
+ });
62
+ if (newMode === currentDelivery) {
63
+ console.log(chalk.dim('No change.'));
64
+ return;
65
+ }
66
+ patch.deliveryMode = newMode;
67
+ }
68
+ else if (setting === 'monitoredBranch') {
69
+ const { input } = await import('@inquirer/prompts');
70
+ const newBranch = await input({
71
+ message: 'Monitored branch',
72
+ default: currentBranch,
73
+ });
74
+ if (newBranch === currentBranch) {
75
+ console.log(chalk.dim('No change.'));
76
+ return;
77
+ }
78
+ patch.monitoredBranch = newBranch;
79
+ }
80
+ // Save
81
+ spinner.start('Saving...');
82
+ await apiRequest(`/v1/repos/${repoId}`, {
83
+ method: 'PATCH',
84
+ body: JSON.stringify(patch),
85
+ });
86
+ spinner.succeed(chalk.green('Setting updated'));
87
+ }
88
+ catch (err) {
89
+ spinner.stop();
90
+ const message = err instanceof Error ? err.message : 'Config failed';
91
+ console.error(chalk.red(message));
92
+ process.exitCode = 1;
93
+ }
94
+ }
95
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function create(): Promise<void>;
2
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"AAiHA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAmW5C"}
@@ -0,0 +1,309 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { mkdirSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { getValidCredentials, performLogin, decodeIdToken } from '../lib/auth.js';
7
+ import { apiRequest } from '../lib/api.js';
8
+ import { selectAiTools } from '../lib/prompts.js';
9
+ import { updateToolConfig, scanLocalContextFiles, AI_TOOL_CONFIG } from '../lib/ai-tools.js';
10
+ import { getConfig, saveConfig } from '../lib/config.js';
11
+ import { handleInterview } from '../lib/interview-handler.js';
12
+ import { ProgressRenderer, CORE_FILES } from '../lib/progress-renderer.js';
13
+ function detectRepoRoot() {
14
+ return execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim();
15
+ }
16
+ function detectRepoName(repoRoot) {
17
+ try {
18
+ const remoteUrl = execSync('git remote get-url origin', {
19
+ encoding: 'utf-8',
20
+ cwd: repoRoot,
21
+ }).trim();
22
+ // Extract repo name from URL (handles both HTTPS and SSH)
23
+ const match = remoteUrl.match(/\/([^/]+?)(?:\.git)?$/);
24
+ if (match?.[1])
25
+ return match[1];
26
+ }
27
+ catch {
28
+ // No remote configured — fall back to directory name
29
+ }
30
+ return repoRoot.split('/').pop() ?? 'unknown';
31
+ }
32
+ function formatElapsed(ms) {
33
+ const totalSeconds = Math.round(ms / 1000);
34
+ const minutes = Math.floor(totalSeconds / 60);
35
+ const seconds = totalSeconds % 60;
36
+ if (minutes === 0)
37
+ return `${seconds}s`;
38
+ return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
39
+ }
40
+ const POLL_INTERVAL_MS = 3000;
41
+ const MAX_POLL_ATTEMPTS = 600; // ~30 minutes at 3s interval
42
+ const DEFAULT_CONTEXT_FOLDER = 'repowise-context';
43
+ export async function create() {
44
+ const startTime = Date.now();
45
+ const spinner = ora('Checking authentication...').start();
46
+ try {
47
+ // Step 1: Auth check — auto-login if not authenticated (Story 2.1)
48
+ let credentials = await getValidCredentials();
49
+ if (!credentials) {
50
+ spinner.info(chalk.yellow('Not logged in. Opening browser to authenticate...'));
51
+ credentials = await performLogin();
52
+ const { email } = decodeIdToken(credentials.idToken);
53
+ spinner.succeed(chalk.green(`Authenticated as ${chalk.bold(email)}`));
54
+ }
55
+ else {
56
+ spinner.succeed('Authenticated');
57
+ }
58
+ // Step 2: Check for pending onboarding repo from dashboard (Story 2.2)
59
+ let repoId;
60
+ let repoName;
61
+ let repoRoot;
62
+ spinner.start('Checking for pending repository...');
63
+ try {
64
+ const pending = await apiRequest('/v1/onboarding/pending');
65
+ if (pending?.repoId) {
66
+ repoId = pending.repoId;
67
+ repoName = pending.repoName;
68
+ spinner.succeed(`Found pending repository: ${chalk.bold(repoName)}`);
69
+ // Clear pending onboarding after pickup
70
+ apiRequest('/v1/onboarding/pending', { method: 'DELETE' }).catch(() => { });
71
+ }
72
+ }
73
+ catch {
74
+ // No pending onboarding API available or failed — fall through to local detection
75
+ }
76
+ // Fall back to local git detection if no pending repo
77
+ if (!repoId) {
78
+ spinner.text = 'Detecting repository...';
79
+ try {
80
+ repoRoot = detectRepoRoot();
81
+ repoName = detectRepoName(repoRoot);
82
+ spinner.succeed(`Repository: ${chalk.bold(repoName)}`);
83
+ }
84
+ catch {
85
+ spinner.fail(chalk.red('Not in a git repository. Run this command from your repo directory, or select a repo on the dashboard first.'));
86
+ process.exitCode = 1;
87
+ return;
88
+ }
89
+ // Resolve repoId from API
90
+ try {
91
+ const repos = await apiRequest('/v1/repos');
92
+ const match = repos.find((r) => r.name === repoName || r.fullName.endsWith(`/${repoName}`));
93
+ if (match) {
94
+ repoId = match.repoId;
95
+ }
96
+ }
97
+ catch {
98
+ // Could not resolve — will fail at sync trigger
99
+ }
100
+ }
101
+ else {
102
+ // Try to detect local repo root even with pending repo (for downloading context files)
103
+ try {
104
+ repoRoot = detectRepoRoot();
105
+ }
106
+ catch {
107
+ // Not in a git repo directory — that's ok with pending repo
108
+ }
109
+ }
110
+ if (!repoId) {
111
+ spinner.fail(chalk.red('Could not find this repository in your RepoWise account. Connect it on the dashboard first.'));
112
+ process.exitCode = 1;
113
+ return;
114
+ }
115
+ // Step 3: AI tool selection
116
+ const { tools, hasOther } = await selectAiTools();
117
+ if (hasOther) {
118
+ console.log(chalk.cyan('\nFor AI tools not listed, context files still work with any tool that reads the filesystem.\nRequest support for your tool at: https://dashboard.repowise.ai/support/ai-tools'));
119
+ }
120
+ if (tools.length === 0 && !hasOther) {
121
+ console.log(chalk.yellow('\nNo AI tools selected. You can configure them later with `repowise config`.'));
122
+ }
123
+ // Step 4: Trigger pipeline (or resume an existing active sync)
124
+ const contextStorage = 'server';
125
+ spinner.start('Starting context generation pipeline...');
126
+ let syncId;
127
+ try {
128
+ const triggerResult = await apiRequest(`/v1/repos/${repoId}/sync`, {
129
+ method: 'POST',
130
+ body: JSON.stringify({ scanType: 'full', contextStorage }),
131
+ });
132
+ syncId = triggerResult.syncId;
133
+ }
134
+ catch (triggerErr) {
135
+ const msg = triggerErr instanceof Error ? triggerErr.message : '';
136
+ if (!msg.toLowerCase().includes('already running')) {
137
+ throw triggerErr;
138
+ }
139
+ // A sync is already in progress — find it and resume polling
140
+ spinner.text = 'Resuming existing pipeline...';
141
+ const syncs = await apiRequest(`/v1/repos/${repoId}/syncs?limit=1`);
142
+ const active = syncs.items.find((s) => s.status === 'in_progress' || s.status === 'awaiting_input');
143
+ if (!active) {
144
+ throw new Error('Could not find active sync to resume. Please try again.');
145
+ }
146
+ syncId = active.syncId;
147
+ spinner.info(chalk.cyan('Resuming existing pipeline...'));
148
+ spinner.start();
149
+ }
150
+ // Step 5: Poll for completion with enriched progress display
151
+ let pollAttempts = 0;
152
+ const progressRenderer = new ProgressRenderer();
153
+ while (true) {
154
+ if (++pollAttempts > MAX_POLL_ATTEMPTS) {
155
+ spinner.fail(chalk.red('Pipeline timed out. Check dashboard for status.'));
156
+ process.exitCode = 1;
157
+ return;
158
+ }
159
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
160
+ const syncResult = await apiRequest(`/v1/sync/${syncId}/status`);
161
+ // Update progress display first so discovery/scan sections render
162
+ // even if the status already jumped to awaiting_input or completed
163
+ progressRenderer.update(syncResult, spinner);
164
+ // Handle interview questions (Story 3.2)
165
+ if (syncResult.status === 'awaiting_input' &&
166
+ syncResult.questionId &&
167
+ syncResult.questionText) {
168
+ spinner.stop();
169
+ await handleInterview(syncId, syncResult.questionId, syncResult.questionText, syncResult.questionContext ?? undefined, syncResult.discoveryResult?.estimatedInterviewQuestions);
170
+ spinner.start('Resuming pipeline...');
171
+ continue;
172
+ }
173
+ if (syncResult.status === 'completed') {
174
+ const generatedFiles = syncResult.filesGenerated ?? [];
175
+ const fileCount = generatedFiles.length;
176
+ if (fileCount > 0) {
177
+ const coreCount = generatedFiles.filter((f) => CORE_FILES.has(f.split('/').pop() ?? f)).length;
178
+ const tailoredCount = fileCount - coreCount;
179
+ spinner.succeed(`Context generation complete — ${coreCount} core + ${tailoredCount} tailored files`);
180
+ }
181
+ else {
182
+ spinner.warn(chalk.yellow('Pipeline completed but no context files were generated.'));
183
+ console.log(chalk.yellow(' This may be due to AI throttling or a parsing issue. Try running `repowise create` again.'));
184
+ }
185
+ break;
186
+ }
187
+ if (syncResult.status === 'failed') {
188
+ spinner.fail(chalk.red(`Pipeline failed: ${syncResult.error ?? 'Unknown error'}`));
189
+ process.exitCode = 1;
190
+ return;
191
+ }
192
+ }
193
+ // Step 6: Download context files from server
194
+ if (repoRoot) {
195
+ spinner.start('Downloading context files from server...');
196
+ try {
197
+ const listResult = await apiRequest(`/v1/repos/${repoId}/context`);
198
+ const files = listResult.data?.files ??
199
+ listResult.files ??
200
+ [];
201
+ if (files.length > 0) {
202
+ const contextDir = join(repoRoot, DEFAULT_CONTEXT_FOLDER);
203
+ mkdirSync(contextDir, { recursive: true });
204
+ let downloadedCount = 0;
205
+ let failedCount = 0;
206
+ for (const file of files) {
207
+ // Path traversal protection
208
+ if (file.fileName.includes('..') || file.fileName.includes('/')) {
209
+ failedCount++;
210
+ continue;
211
+ }
212
+ const urlResult = await apiRequest(`/v1/repos/${repoId}/context/${file.fileName}`);
213
+ const presignedUrl = urlResult.data?.url ?? urlResult.url;
214
+ const response = await fetch(presignedUrl);
215
+ if (response.ok) {
216
+ const content = await response.text();
217
+ writeFileSync(join(contextDir, file.fileName), content, 'utf-8');
218
+ downloadedCount++;
219
+ }
220
+ else {
221
+ failedCount++;
222
+ }
223
+ }
224
+ if (failedCount > 0) {
225
+ spinner.warn(`Downloaded ${downloadedCount}/${files.length} files to ./${DEFAULT_CONTEXT_FOLDER}/ (${failedCount} failed)`);
226
+ }
227
+ else {
228
+ spinner.succeed(`Context files downloaded to ./${DEFAULT_CONTEXT_FOLDER}/`);
229
+ }
230
+ }
231
+ else {
232
+ spinner.warn('No context files found on server');
233
+ }
234
+ }
235
+ catch (err) {
236
+ const msg = err instanceof Error ? err.message : 'Unknown error';
237
+ spinner.warn(chalk.yellow(`Cannot reach RepoWise servers to download context: ${msg}\nFiles are stored on our servers (not in git). Retry when online.`));
238
+ }
239
+ }
240
+ // Step 7: Collect context files
241
+ const contextFolder = DEFAULT_CONTEXT_FOLDER;
242
+ let contextFiles = [];
243
+ if (repoRoot) {
244
+ contextFiles = await scanLocalContextFiles(repoRoot, contextFolder);
245
+ }
246
+ if (contextFiles.length === 0) {
247
+ console.log(chalk.yellow(` No context files found in ${contextFolder}/. Try re-running \`repowise create\`.`));
248
+ }
249
+ // Step 8: Configure AI tools
250
+ if (tools.length > 0 && repoRoot) {
251
+ spinner.start('Configuring AI tools...');
252
+ const results = [];
253
+ for (const tool of tools) {
254
+ const { created: wasCreated } = await updateToolConfig(repoRoot, tool, repoName, contextFolder, contextFiles);
255
+ const config = AI_TOOL_CONFIG[tool];
256
+ const action = wasCreated ? 'Created' : 'Updated';
257
+ results.push(` ${action} ${config.filePath}`);
258
+ }
259
+ spinner.succeed('AI tools configured');
260
+ console.log(chalk.dim(results.join('\n')));
261
+ }
262
+ // Step 9: Save config (including repo registration for the listener)
263
+ const existingConfig = await getConfig();
264
+ const existingRepos = existingConfig.repos ?? [];
265
+ const updatedRepos = existingRepos.filter((r) => r.repoId !== repoId);
266
+ if (repoRoot) {
267
+ updatedRepos.push({ repoId: repoId, localPath: repoRoot });
268
+ }
269
+ await saveConfig({
270
+ ...existingConfig,
271
+ aiTools: tools,
272
+ contextFolder,
273
+ repos: updatedRepos,
274
+ });
275
+ // Step 10: Auto-start listener
276
+ let listenerRunning = false;
277
+ try {
278
+ const { install } = (await import('@repowise/listener/service-installer'));
279
+ const { startBackground } = (await import('@repowise/listener/process-manager'));
280
+ await install();
281
+ await startBackground();
282
+ listenerRunning = true;
283
+ }
284
+ catch {
285
+ console.log(chalk.yellow('Warning: Could not start listener automatically. Run the following to enable it:'));
286
+ console.log(chalk.yellow(` $ repowise listen --install`));
287
+ }
288
+ // Step 11: Completion summary with elapsed time (Story 2.3)
289
+ const elapsed = formatElapsed(Date.now() - startTime);
290
+ console.log('');
291
+ console.log(chalk.green.bold(' All done! Setup complete!'));
292
+ console.log(chalk.green(` Your AI tools now have access to project context for ${chalk.bold(repoName)}.`));
293
+ if (listenerRunning) {
294
+ console.log('');
295
+ console.log(chalk.cyan(' The RepoWise listener is running in the background —'));
296
+ console.log(chalk.cyan(' your context will stay in sync automatically.'));
297
+ console.log(chalk.cyan(" Go back to coding, we've got it from here!"));
298
+ }
299
+ console.log('');
300
+ console.log(chalk.cyan(' Head back to the dashboard and click "Complete Onboarding" to explore your RepoWise dashboard!'));
301
+ console.log(chalk.dim(`\n Total time: ${elapsed}`));
302
+ }
303
+ catch (err) {
304
+ const message = err instanceof Error ? err.message : 'Create failed';
305
+ spinner.fail(chalk.red(message));
306
+ process.exitCode = 1;
307
+ }
308
+ }
309
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAsE3E,SAAS,cAAc;IACrB,OAAO,QAAQ,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,2BAA2B,EAAE;YACtD,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,0DAA0D;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;AAChD,CAAC;AAED,SAAS,aAAa,CAAC,EAAU;IAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACxC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;AACjE,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,6BAA6B;AAC5D,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE1D,IAAI,CAAC;QACH,mEAAmE;QACnE,IAAI,WAAW,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAChF,WAAW,GAAG,MAAM,YAAY,EAAE,CAAC;YACnC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,uEAAuE;QACvE,IAAI,MAA0B,CAAC;QAC/B,IAAI,QAAgB,CAAC;QACrB,IAAI,QAA4B,CAAC;QAEjC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAmC,wBAAwB,CAAC,CAAC;YAC7F,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACpB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBACxB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBAC5B,OAAO,CAAC,OAAO,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAErE,wCAAwC;gBACxC,UAAU,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kFAAkF;QACpF,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,GAAG,yBAAyB,CAAC;YACzC,IAAI,CAAC;gBACH,QAAQ,GAAG,cAAc,EAAE,CAAC;gBAC5B,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;gBACpC,OAAO,CAAC,OAAO,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,GAAG,CACP,8GAA8G,CAC/G,CACF,CAAC;gBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,0BAA0B;YAC1B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,UAAU,CAAiB,WAAW,CAAC,CAAC;gBAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC5F,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,uFAAuF;YACvF,IAAI,CAAC;gBACH,QAAQ,GAAG,cAAc,EAAE,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,GAAG,CACP,6FAA6F,CAC9F,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,EAAE,CAAC;QAElD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,gLAAgL,CACjL,CACF,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,8EAA8E,CAC/E,CACF,CAAC;QACJ,CAAC;QAED,+DAA+D;QAC/D,MAAM,cAAc,GAAG,QAAiB,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,UAAU,CAAqB,aAAa,MAAM,OAAO,EAAE;gBACrF,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;aAC3D,CAAC,CAAC;YACH,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;QAChC,CAAC;QAAC,OAAO,UAAmB,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACnD,MAAM,UAAU,CAAC;YACnB,CAAC;YACD,6DAA6D;YAC7D,OAAO,CAAC,IAAI,GAAG,+BAA+B,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,UAAU,CAC5B,aAAa,MAAM,gBAAgB,CACpC,CAAC;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,CAAC,MAAM,KAAK,gBAAgB,CACnE,CAAC;YACF,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAED,6DAA6D;QAC7D,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAEhD,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,EAAE,YAAY,GAAG,iBAAiB,EAAE,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBAC3E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAG,MAAM,UAAU,CAAqB,YAAY,MAAM,SAAS,CAAC,CAAC;YAErF,kEAAkE;YAClE,mEAAmE;YACnE,gBAAgB,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAE7C,yCAAyC;YACzC,IACE,UAAU,CAAC,MAAM,KAAK,gBAAgB;gBACtC,UAAU,CAAC,UAAU;gBACrB,UAAU,CAAC,YAAY,EACvB,CAAC;gBACD,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,eAAe,CACnB,MAAM,EACN,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,YAAY,EACvB,UAAU,CAAC,eAAe,IAAI,SAAS,EACvC,UAAU,CAAC,eAAe,EAAE,2BAA2B,CACxD,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACtC,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC;gBACvD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC;gBACxC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBAClB,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CACxC,CAAC,MAAM,CAAC;oBACT,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;oBAC5C,OAAO,CAAC,OAAO,CACb,iCAAiC,SAAS,WAAW,aAAa,iBAAiB,CACpF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC,CAAC;oBACtF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,6FAA6F,CAC9F,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,UAAU,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;gBACnF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC1D,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,UAAU,CAEhC,aAAa,MAAM,UAAU,CAAC,CAAC;gBAClC,MAAM,KAAK,GACT,UAAU,CAAC,IAAI,EAAE,KAAK;oBACrB,UAAgE,CAAC,KAAK;oBACvE,EAAE,CAAC;gBAEL,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;oBAC1D,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAE3C,IAAI,eAAe,GAAG,CAAC,CAAC;oBACxB,IAAI,WAAW,GAAG,CAAC,CAAC;oBACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,4BAA4B;wBAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BAChE,WAAW,EAAE,CAAC;4BACd,SAAS;wBACX,CAAC;wBACD,MAAM,SAAS,GAAG,MAAM,UAAU,CAE/B,aAAa,MAAM,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;wBACnD,MAAM,YAAY,GAChB,SAAS,CAAC,IAAI,EAAE,GAAG,IAAK,SAAwC,CAAC,GAAG,CAAC;wBACvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;wBAC3C,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;4BAChB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;4BACtC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;4BACjE,eAAe,EAAE,CAAC;wBACpB,CAAC;6BAAM,CAAC;4BACN,WAAW,EAAE,CAAC;wBAChB,CAAC;oBACH,CAAC;oBACD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;wBACpB,OAAO,CAAC,IAAI,CACV,cAAc,eAAe,IAAI,KAAK,CAAC,MAAM,eAAe,sBAAsB,MAAM,WAAW,UAAU,CAC9G,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,OAAO,CAAC,iCAAiC,sBAAsB,GAAG,CAAC,CAAC;oBAC9E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;gBACjE,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,sDAAsD,GAAG,oEAAoE,CAC9H,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,MAAM,aAAa,GAAG,sBAAsB,CAAC;QAE7C,IAAI,YAAY,GAAsB,EAAE,CAAC;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,+BAA+B,aAAa,wCAAwC,CACrF,CACF,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CACpD,QAAQ,EACR,IAAI,EACJ,QAAS,EACT,aAAa,EACb,YAAY,CACb,CAAC;gBACF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,qEAAqE;QACrE,MAAM,cAAc,GAAG,MAAM,SAAS,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACtE,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,UAAU,CAAC;YACf,GAAG,cAAc;YACjB,OAAO,EAAE,KAAK;YACd,aAAa;YACb,KAAK,EAAE,YAAY;SACpB,CAAC,CAAC;QAEH,+BAA+B;QAC/B,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAExE,CAAC;YACF,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAE9E,CAAC;YACF,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM,eAAe,EAAE,CAAC;YACxB,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,kFAAkF,CACnF,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,4DAA4D;QAC5D,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,0DAA0D,KAAK,CAAC,IAAI,CAAC,QAAS,CAAC,GAAG,CACnF,CACF,CAAC;QACF,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,kGAAkG,CACnG,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function listen(options: {
2
+ install?: boolean;
3
+ uninstall?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=listen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.d.ts","sourceRoot":"","sources":["../../../src/commands/listen.ts"],"names":[],"mappings":"AAEA,wBAAsB,MAAM,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD/F"}
@@ -0,0 +1,47 @@
1
+ import { getValidCredentials } from '../lib/auth.js';
2
+ export async function listen(options) {
3
+ if (options.install) {
4
+ try {
5
+ const { install } = (await import('@repowise/listener/service-installer'));
6
+ await install();
7
+ console.log('Auto-start service installed. The listener will start on boot.');
8
+ }
9
+ catch (err) {
10
+ const message = err instanceof Error ? err.message : 'Unknown error';
11
+ console.error(`Failed to install auto-start service: ${message}`);
12
+ console.error('You can still run the listener manually with `repowise listen`.');
13
+ process.exitCode = 1;
14
+ }
15
+ return;
16
+ }
17
+ if (options.uninstall) {
18
+ try {
19
+ const { uninstall } = (await import('@repowise/listener/service-installer'));
20
+ await uninstall();
21
+ console.log('Auto-start service removed.');
22
+ }
23
+ catch (err) {
24
+ const message = err instanceof Error ? err.message : 'Unknown error';
25
+ console.error(`Failed to uninstall auto-start service: ${message}`);
26
+ process.exitCode = 1;
27
+ }
28
+ return;
29
+ }
30
+ const credentials = await getValidCredentials();
31
+ if (!credentials) {
32
+ console.error('Not logged in. Run `repowise login` first.');
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ console.log('Starting RepoWise listener...');
37
+ // Dynamic import to avoid hard dependency on listener package
38
+ try {
39
+ const { startListener } = (await import('@repowise/listener/main'));
40
+ await startListener();
41
+ }
42
+ catch {
43
+ console.error('Failed to start listener. Ensure @repowise/listener is installed.');
44
+ process.exitCode = 1;
45
+ }
46
+ }
47
+ //# sourceMappingURL=listen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.js","sourceRoot":"","sources":["../../../src/commands/listen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAmD;IAC9E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAExE,CAAC;YACF,MAAM,OAAO,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACjF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAE1E,CAAC;YACF,MAAM,SAAS,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,2CAA2C,OAAO,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAChD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7C,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAEjE,CAAC;QACF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface LoginOptions {
2
+ browser?: boolean;
3
+ }
4
+ export declare function login(options?: LoginOptions): Promise<void>;
5
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DrE"}
@@ -0,0 +1,58 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { generateCodeVerifier, generateCodeChallenge, generateState, getAuthorizeUrl, startCallbackServer, exchangeCodeForTokens, storeCredentials, decodeIdToken, } from '../lib/auth.js';
4
+ export async function login(options = {}) {
5
+ const spinner = ora('Preparing login...').start();
6
+ try {
7
+ // Generate PKCE and state
8
+ const codeVerifier = generateCodeVerifier();
9
+ const codeChallenge = generateCodeChallenge(codeVerifier);
10
+ const state = generateState();
11
+ // Build authorize URL
12
+ const authorizeUrl = getAuthorizeUrl(codeChallenge, state);
13
+ // Start callback server first
14
+ const callbackPromise = startCallbackServer();
15
+ // Open browser or print URL
16
+ if (options.browser === false) {
17
+ spinner.stop();
18
+ console.log(`\nOpen this URL in your browser to authenticate:\n`);
19
+ console.log(chalk.cyan(authorizeUrl));
20
+ console.log(`\nWaiting for authentication...`);
21
+ }
22
+ else {
23
+ spinner.text = 'Opening browser for authentication...';
24
+ try {
25
+ const open = (await import('open')).default;
26
+ await open(authorizeUrl);
27
+ spinner.text = 'Waiting for authentication in browser...';
28
+ }
29
+ catch {
30
+ // Fall back to printing URL if open fails
31
+ spinner.stop();
32
+ console.log(`\nCould not open browser automatically. Open this URL:\n`);
33
+ console.log(chalk.cyan(authorizeUrl));
34
+ console.log(`\nWaiting for authentication...`);
35
+ }
36
+ }
37
+ // Wait for callback
38
+ const { code, state: returnedState } = await callbackPromise;
39
+ // Validate state
40
+ if (returnedState !== state) {
41
+ throw new Error('State mismatch — possible CSRF attack. Please try again.');
42
+ }
43
+ spinner.start('Exchanging authorization code...');
44
+ // Exchange code for tokens
45
+ const credentials = await exchangeCodeForTokens(code, codeVerifier);
46
+ // Store credentials
47
+ await storeCredentials(credentials);
48
+ // Decode ID token for display
49
+ const { email } = decodeIdToken(credentials.idToken);
50
+ spinner.succeed(chalk.green(`Logged in as ${chalk.bold(email)}`));
51
+ }
52
+ catch (err) {
53
+ const message = err instanceof Error ? err.message : 'Login failed';
54
+ spinner.fail(chalk.red(message));
55
+ process.exitCode = 1;
56
+ }
57
+ }
58
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function logout(): Promise<void>;
2
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAU5C"}
@@ -0,0 +1,12 @@
1
+ import chalk from 'chalk';
2
+ import { clearCredentials, getStoredCredentials } from '../lib/auth.js';
3
+ export async function logout() {
4
+ const creds = await getStoredCredentials();
5
+ if (!creds) {
6
+ console.log(chalk.yellow('Not logged in.'));
7
+ return;
8
+ }
9
+ await clearCredentials();
10
+ console.log(chalk.green('Logged out successfully.'));
11
+ }
12
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function start(): Promise<void>;
2
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/start.ts"],"names":[],"mappings":"AAAA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB3C"}
@@ -0,0 +1,17 @@
1
+ export async function start() {
2
+ try {
3
+ const { isRunning, startBackground } = (await import('@repowise/listener/process-manager'));
4
+ if (await isRunning()) {
5
+ console.log('Listener is already running.');
6
+ return;
7
+ }
8
+ const pid = await startBackground();
9
+ console.log(`Listener started (PID: ${pid}).`);
10
+ }
11
+ catch (err) {
12
+ const message = err instanceof Error ? err.message : 'Unknown error';
13
+ console.error(`Failed to start listener: ${message}`);
14
+ process.exitCode = 1;
15
+ }
16
+ }
17
+ //# sourceMappingURL=start.js.map