@reminix/cli 0.1.9 → 0.1.11

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 (39) hide show
  1. package/README.md +20 -12
  2. package/dist/commands/agent.d.ts +6 -0
  3. package/dist/commands/agent.d.ts.map +1 -0
  4. package/dist/commands/{agents.js → agent.js} +8 -10
  5. package/dist/commands/agent.js.map +1 -0
  6. package/dist/commands/deploy.d.ts +6 -0
  7. package/dist/commands/deploy.d.ts.map +1 -0
  8. package/dist/commands/deploy.js +323 -0
  9. package/dist/commands/deploy.js.map +1 -0
  10. package/dist/commands/login.d.ts.map +1 -1
  11. package/dist/commands/login.js +64 -2
  12. package/dist/commands/login.js.map +1 -1
  13. package/dist/commands/logout.d.ts +1 -1
  14. package/dist/commands/logout.d.ts.map +1 -1
  15. package/dist/commands/logout.js +3 -1
  16. package/dist/commands/logout.js.map +1 -1
  17. package/dist/commands/project.d.ts +6 -0
  18. package/dist/commands/project.d.ts.map +1 -0
  19. package/dist/commands/{projects.js → project.js} +76 -12
  20. package/dist/commands/project.js.map +1 -0
  21. package/dist/commands/secret.d.ts +6 -0
  22. package/dist/commands/secret.d.ts.map +1 -0
  23. package/dist/commands/secret.js +162 -0
  24. package/dist/commands/secret.js.map +1 -0
  25. package/dist/commands/version.d.ts +1 -1
  26. package/dist/commands/version.d.ts.map +1 -1
  27. package/dist/commands/version.js +1 -1
  28. package/dist/commands/version.js.map +1 -1
  29. package/dist/index.js +8 -4
  30. package/dist/index.js.map +1 -1
  31. package/dist/lib/api-types.d.ts +558 -0
  32. package/dist/lib/api-types.d.ts.map +1 -1
  33. package/package.json +2 -1
  34. package/dist/commands/agents.d.ts +0 -6
  35. package/dist/commands/agents.d.ts.map +0 -1
  36. package/dist/commands/agents.js.map +0 -1
  37. package/dist/commands/projects.d.ts +0 -6
  38. package/dist/commands/projects.d.ts.map +0 -1
  39. package/dist/commands/projects.js.map +0 -1
package/README.md CHANGED
@@ -21,17 +21,17 @@ yarn global add @reminix/cli
21
21
  # Login to your Reminix account
22
22
  reminix login
23
23
 
24
- # Set your default project (so you don't need -p every time)
25
- reminix config set project <org-slug>/<project-slug>
24
+ # Select your default project interactively
25
+ reminix project select
26
26
 
27
- # List your projects
28
- reminix projects list
27
+ # Deploy your project
28
+ reminix deploy
29
29
 
30
30
  # Invoke an agent
31
- reminix agents invoke my-agent -i '{"prompt": "Hello!"}'
31
+ reminix agent invoke my-agent -i '{"prompt": "Hello!"}'
32
32
 
33
33
  # Chat with an agent
34
- reminix agents chat my-agent -m "Hello!"
34
+ reminix agent chat my-agent -m "Hello!"
35
35
  ```
36
36
 
37
37
  ## Commands
@@ -41,10 +41,18 @@ reminix agents chat my-agent -m "Hello!"
41
41
  | `reminix login` | Authenticate with Reminix |
42
42
  | `reminix logout` | Clear authentication |
43
43
  | `reminix whoami` | Show current user |
44
- | `reminix projects list` | List all projects |
45
- | `reminix projects current` | Get current project details |
46
- | `reminix agents invoke <name>` | Invoke an agent with input |
47
- | `reminix agents chat <name>` | Chat with an agent |
44
+ | `reminix project list` | List all projects |
45
+ | `reminix project select` | Interactively select a default project |
46
+ | `reminix project current` | Get current project details |
47
+ | `reminix project clear` | Clear the default project |
48
+ | `reminix agent invoke <name>` | Invoke an agent with input |
49
+ | `reminix agent chat <name>` | Chat with an agent |
50
+ | `reminix secret list` | List all secrets for the project |
51
+ | `reminix secret set <key> <value>` | Set a secret (create or update) |
52
+ | `reminix secret delete <key>` | Delete a secret |
53
+ | `reminix deploy` | Deploy the current project |
54
+ | `reminix deploy status` | List recent deployments |
55
+ | `reminix deploy status <id>` | Get deployment status |
48
56
  | `reminix config set <key> <value>` | Set configuration value |
49
57
  | `reminix config get <key>` | Get configuration value |
50
58
  | `reminix config list` | List all configuration |
@@ -74,10 +82,10 @@ Most commands support `-o, --output` for different output formats:
74
82
 
75
83
  ```bash
76
84
  # Human-readable table (default)
77
- reminix projects list
85
+ reminix project list
78
86
 
79
87
  # JSON (for scripting)
80
- reminix projects list -o json
88
+ reminix project list -o json
81
89
  ```
82
90
 
83
91
  ## Documentation
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Agent command group
4
+ */
5
+ export declare const agentCommand: Command;
6
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,eAAO,MAAM,YAAY,SAEvB,CAAC"}
@@ -3,17 +3,15 @@ import { createApiClient } from '../lib/api-client.js';
3
3
  import { requireProject } from '../lib/config.js';
4
4
  import { getOutputFormat, outputJson } from '../lib/output.js';
5
5
  /**
6
- * Agents command group
6
+ * Agent command group
7
7
  */
8
- export const agentsCommand = new Command('agents')
9
- .description('Interact with agents')
10
- .action(() => {
11
- agentsCommand.help();
8
+ export const agentCommand = new Command('agent').description('Interact with agents').action(() => {
9
+ agentCommand.help();
12
10
  });
13
11
  /**
14
12
  * Invoke an agent
15
13
  */
16
- agentsCommand
14
+ agentCommand
17
15
  .command('invoke <name>')
18
16
  .description('Invoke an agent with input data')
19
17
  .option('-p, --project <id>', 'Project ID or org-slug/project-slug')
@@ -22,7 +20,7 @@ agentsCommand
22
20
  .option('-o, --output <format>', 'Output format (json, table)', 'table')
23
21
  .action(async (name, options) => {
24
22
  try {
25
- const project = requireProject(options.project, 'reminix agents invoke <name> -p <org-slug/project-slug> -i \'{"key": "value"}\'');
23
+ const project = requireProject(options.project, 'reminix agent invoke <name> -p <org-slug/project-slug> -i \'{"key": "value"}\'');
26
24
  // Parse input JSON
27
25
  let input;
28
26
  try {
@@ -111,7 +109,7 @@ agentsCommand
111
109
  /**
112
110
  * Chat with an agent
113
111
  */
114
- agentsCommand
112
+ agentCommand
115
113
  .command('chat <name>')
116
114
  .description('Start a chat session with an agent')
117
115
  .option('-p, --project <id>', 'Project ID or org-slug/project-slug')
@@ -120,7 +118,7 @@ agentsCommand
120
118
  .option('-o, --output <format>', 'Output format (json, table)', 'table')
121
119
  .action(async (name, options) => {
122
120
  try {
123
- const project = requireProject(options.project, 'reminix agents chat <name> -p <org-slug/project-slug> -m "message"');
121
+ const project = requireProject(options.project, 'reminix agent chat <name> -p <org-slug/project-slug> -m "message"');
124
122
  const client = createApiClient({ project });
125
123
  const format = getOutputFormat(options);
126
124
  const messages = [{ role: 'user', content: options.message }];
@@ -198,4 +196,4 @@ agentsCommand
198
196
  process.exit(1);
199
197
  }
200
198
  });
201
- //# sourceMappingURL=agents.js.map
199
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Deploy command
4
+ */
5
+ export declare const deployCommand: Command;
6
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4KpC;;GAEG;AACH,eAAO,MAAM,aAAa,SAyHtB,CAAC"}
@@ -0,0 +1,323 @@
1
+ import { Command } from 'commander';
2
+ import { createApiClient } from '../lib/api-client.js';
3
+ import { requireProject } from '../lib/config.js';
4
+ import { spawn } from 'child_process';
5
+ import { createReadStream, statSync, existsSync, readFileSync } from 'fs';
6
+ import { tmpdir } from 'os';
7
+ import { join } from 'path';
8
+ import { randomUUID } from 'crypto';
9
+ import { unlink } from 'fs/promises';
10
+ /**
11
+ * Default files/directories to exclude from deployment
12
+ * Covers common patterns across languages
13
+ */
14
+ const DEFAULT_EXCLUDES = [
15
+ // Version control
16
+ '.git',
17
+ '.svn',
18
+ '.hg',
19
+ // Environment & secrets
20
+ '.env',
21
+ '.env.*',
22
+ '*.pem',
23
+ '*.key',
24
+ // OS files
25
+ '.DS_Store',
26
+ 'Thumbs.db',
27
+ '*.log',
28
+ // Node.js
29
+ 'node_modules',
30
+ '.npm',
31
+ '.yarn',
32
+ '.pnpm-store',
33
+ // Python
34
+ '__pycache__',
35
+ '*.pyc',
36
+ '*.pyo',
37
+ '.venv',
38
+ 'venv',
39
+ '.pytest_cache',
40
+ '.mypy_cache',
41
+ '*.egg-info',
42
+ // Ruby
43
+ 'vendor/bundle',
44
+ '.bundle',
45
+ // Rust
46
+ 'target',
47
+ // Go
48
+ 'vendor',
49
+ // Java/Kotlin
50
+ '*.class',
51
+ '.gradle',
52
+ // Build outputs (common names)
53
+ 'dist',
54
+ 'build',
55
+ 'out',
56
+ '.next',
57
+ '.nuxt',
58
+ '.output',
59
+ '.turbo',
60
+ '.cache',
61
+ 'coverage',
62
+ // IDE/Editor
63
+ '.idea',
64
+ '*.swp',
65
+ '*~',
66
+ ];
67
+ /**
68
+ * Load excludes from .reminixignore file if it exists
69
+ */
70
+ function loadIgnoreFile(sourceDir) {
71
+ const ignorePath = join(sourceDir, '.reminixignore');
72
+ if (!existsSync(ignorePath)) {
73
+ return [];
74
+ }
75
+ const content = readFileSync(ignorePath, 'utf-8');
76
+ return content
77
+ .split('\n')
78
+ .map((line) => line.trim())
79
+ .filter((line) => line && !line.startsWith('#'));
80
+ }
81
+ /**
82
+ * Create a tarball of the current directory
83
+ */
84
+ async function createTarball(sourceDir, excludes) {
85
+ const tarballPath = join(tmpdir(), `reminix-deploy-${randomUUID()}.tar.gz`);
86
+ const excludeArgs = excludes.flatMap((pattern) => ['--exclude', pattern]);
87
+ return new Promise((resolve, reject) => {
88
+ const tar = spawn('tar', ['-czf', tarballPath, ...excludeArgs, '-C', sourceDir, '.'], {
89
+ stdio: ['ignore', 'pipe', 'pipe'],
90
+ });
91
+ let stderr = '';
92
+ tar.stderr.on('data', (data) => {
93
+ stderr += data.toString();
94
+ });
95
+ tar.on('close', (code) => {
96
+ if (code === 0) {
97
+ resolve(tarballPath);
98
+ }
99
+ else {
100
+ reject(new Error(`Failed to create tarball: ${stderr}`));
101
+ }
102
+ });
103
+ tar.on('error', (err) => {
104
+ reject(new Error(`Failed to spawn tar: ${err.message}`));
105
+ });
106
+ });
107
+ }
108
+ /**
109
+ * Upload a file to a presigned URL
110
+ */
111
+ async function uploadToPresignedUrl(filePath, presignedUrl) {
112
+ const stat = statSync(filePath);
113
+ const fileStream = createReadStream(filePath);
114
+ // Convert ReadStream to a format fetch can use
115
+ const chunks = [];
116
+ for await (const chunk of fileStream) {
117
+ chunks.push(chunk);
118
+ }
119
+ const buffer = Buffer.concat(chunks);
120
+ const response = await fetch(presignedUrl, {
121
+ method: 'PUT',
122
+ body: buffer,
123
+ headers: {
124
+ 'Content-Type': 'application/gzip',
125
+ 'Content-Length': stat.size.toString(),
126
+ },
127
+ });
128
+ if (!response.ok) {
129
+ const text = await response.text();
130
+ throw new Error(`Upload failed: ${response.status} ${response.statusText} - ${text}`);
131
+ }
132
+ }
133
+ /**
134
+ * Format bytes to human readable string
135
+ */
136
+ function formatBytes(bytes) {
137
+ if (bytes < 1024)
138
+ return `${bytes} B`;
139
+ if (bytes < 1024 * 1024)
140
+ return `${(bytes / 1024).toFixed(1)} KB`;
141
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
142
+ }
143
+ /**
144
+ * Sleep for a given number of milliseconds
145
+ */
146
+ function sleep(ms) {
147
+ return new Promise((resolve) => setTimeout(resolve, ms));
148
+ }
149
+ /**
150
+ * Deploy command
151
+ */
152
+ export const deployCommand = new Command('deploy')
153
+ .description('Deploy the current project')
154
+ .option('-p, --project <id>', 'Project ID or org-slug/project-slug')
155
+ .option('-d, --directory <path>', 'Directory to deploy (default: current directory)', '.')
156
+ .option('--no-wait', 'Do not wait for deployment to complete')
157
+ .action(async (options) => {
158
+ try {
159
+ const project = requireProject(options.project, 'reminix deploy -p <org-slug/project-slug>');
160
+ const client = createApiClient({ project });
161
+ const sourceDir = options.directory;
162
+ // Step 1: Create tarball
163
+ console.log('Creating deployment package...');
164
+ const customExcludes = loadIgnoreFile(sourceDir);
165
+ const allExcludes = [...DEFAULT_EXCLUDES, ...customExcludes];
166
+ const tarballPath = await createTarball(sourceDir, allExcludes);
167
+ try {
168
+ const stat = statSync(tarballPath);
169
+ console.log(`Package created: ${formatBytes(stat.size)}`);
170
+ // Check size limit (100MB)
171
+ const maxSize = 100 * 1024 * 1024;
172
+ if (stat.size > maxSize) {
173
+ throw new Error(`Package too large: ${formatBytes(stat.size)} (max: ${formatBytes(maxSize)})`);
174
+ }
175
+ // Step 2: Create deployment and get presigned URL
176
+ console.log('Initializing deployment...');
177
+ const { data: createData, error: createError } = await client.POST('/deployments');
178
+ if (createError || !createData) {
179
+ throw new Error(`Failed to create deployment: ${JSON.stringify(createError)}`);
180
+ }
181
+ const { deployment, upload } = createData;
182
+ console.log(`Deployment created: ${deployment.id}`);
183
+ // Step 3: Upload tarball to presigned URL
184
+ console.log('Uploading source code...');
185
+ await uploadToPresignedUrl(tarballPath, upload.url);
186
+ console.log('Upload complete.');
187
+ // Step 4: Start deployment
188
+ console.log('Starting deployment...');
189
+ const { error: startError } = await client.POST('/deployments/{id}/start', {
190
+ params: { path: { id: deployment.id } },
191
+ });
192
+ if (startError) {
193
+ throw new Error(`Failed to start deployment: ${JSON.stringify(startError)}`);
194
+ }
195
+ console.log('Deployment started.');
196
+ // Step 5: Poll for status if --wait (default)
197
+ if (options.wait !== false) {
198
+ console.log('\nWaiting for deployment to complete...\n');
199
+ let lastLogTimestamp;
200
+ let lastStatus = deployment.status;
201
+ while (true) {
202
+ const { data: statusData, error: statusError } = await client.GET('/deployments/{id}', {
203
+ params: {
204
+ path: { id: deployment.id },
205
+ query: { since: lastLogTimestamp },
206
+ },
207
+ });
208
+ if (statusError || !statusData) {
209
+ console.error('Failed to get deployment status, retrying...');
210
+ await sleep(2000);
211
+ continue;
212
+ }
213
+ const { deployment: currentDeployment, logs } = statusData;
214
+ // Print new logs
215
+ for (const log of logs) {
216
+ const timestamp = new Date(log.timestamp).toLocaleTimeString();
217
+ console.log(`[${timestamp}] [${log.step}] ${log.message}`);
218
+ lastLogTimestamp = log.timestamp;
219
+ }
220
+ // Check if status changed
221
+ if (currentDeployment.status !== lastStatus) {
222
+ lastStatus = currentDeployment.status;
223
+ }
224
+ // Check terminal states
225
+ if (currentDeployment.status === 'ready') {
226
+ console.log('\nDeployment successful!');
227
+ break;
228
+ }
229
+ if (currentDeployment.status === 'failed') {
230
+ console.error(`\nDeployment failed: ${currentDeployment.error || 'Unknown error'}`);
231
+ process.exit(1);
232
+ }
233
+ await sleep(2000);
234
+ }
235
+ }
236
+ else {
237
+ console.log(`\nDeployment ${deployment.id} is running in the background.`);
238
+ console.log('Use `reminix deploy status` to check progress.');
239
+ }
240
+ }
241
+ finally {
242
+ // Cleanup tarball
243
+ await unlink(tarballPath).catch(() => { });
244
+ }
245
+ }
246
+ catch (error) {
247
+ if (error instanceof Error) {
248
+ console.error(`Error: ${error.message}`);
249
+ }
250
+ else {
251
+ console.error('An unexpected error occurred');
252
+ }
253
+ process.exit(1);
254
+ }
255
+ });
256
+ /**
257
+ * Deployment status subcommand
258
+ */
259
+ deployCommand
260
+ .command('status [deploymentId]')
261
+ .description('Get deployment status')
262
+ .option('-p, --project <id>', 'Project ID or org-slug/project-slug')
263
+ .action(async (deploymentId, options) => {
264
+ try {
265
+ const project = requireProject(options.project, 'reminix deploy status -p <org-slug/project-slug>');
266
+ const client = createApiClient({ project });
267
+ if (deploymentId) {
268
+ // Get specific deployment
269
+ const { data, error } = await client.GET('/deployments/{id}', {
270
+ params: { path: { id: deploymentId } },
271
+ });
272
+ if (error || !data) {
273
+ throw new Error(`Failed to get deployment: ${JSON.stringify(error)}`);
274
+ }
275
+ const { deployment, logs } = data;
276
+ console.log(`Deployment: ${deployment.id}`);
277
+ console.log(`Status: ${deployment.status}`);
278
+ console.log(`Created: ${new Date(deployment.createdAt).toLocaleString()}`);
279
+ if (deployment.completedAt) {
280
+ console.log(`Completed: ${new Date(deployment.completedAt).toLocaleString()}`);
281
+ }
282
+ if (deployment.error) {
283
+ console.log(`Error: ${deployment.error}`);
284
+ }
285
+ if (logs.length > 0) {
286
+ console.log('\nRecent logs:');
287
+ for (const log of logs.slice(-10)) {
288
+ const timestamp = new Date(log.timestamp).toLocaleTimeString();
289
+ console.log(` [${timestamp}] [${log.step}] ${log.message}`);
290
+ }
291
+ }
292
+ }
293
+ else {
294
+ // List recent deployments
295
+ const { data, error } = await client.GET('/deployments', {
296
+ params: { query: { limit: '10' } },
297
+ });
298
+ if (error || !data) {
299
+ throw new Error(`Failed to list deployments: ${JSON.stringify(error)}`);
300
+ }
301
+ if (data.data.length === 0) {
302
+ console.log('No deployments found.');
303
+ return;
304
+ }
305
+ console.log('Recent deployments:\n');
306
+ for (const deployment of data.data) {
307
+ const status = deployment.status.padEnd(10);
308
+ const created = new Date(deployment.createdAt).toLocaleString();
309
+ console.log(` ${deployment.id} ${status} ${created}`);
310
+ }
311
+ }
312
+ }
313
+ catch (error) {
314
+ if (error instanceof Error) {
315
+ console.error(`Error: ${error.message}`);
316
+ }
317
+ else {
318
+ console.error('An unexpected error occurred');
319
+ }
320
+ process.exit(1);
321
+ }
322
+ });
323
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC;;GAEG;AACH,eAAO,MAAM,YAAY,SAoDrB,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkGpC;;GAEG;AACH,eAAO,MAAM,YAAY,SAsDrB,CAAC"}
@@ -1,8 +1,11 @@
1
1
  import { Command } from 'commander';
2
2
  import open from 'open';
3
+ import select from '@inquirer/select';
3
4
  import * as os from 'node:os';
4
5
  import { createAuthServer, generateState } from '../lib/auth-server.js';
5
6
  import { saveCredentials, loadCredentials } from '../lib/credentials.js';
7
+ import { createApiClient } from '../lib/api-client.js';
8
+ import { setConfigValue } from '../lib/config.js';
6
9
  /**
7
10
  * Default web app URL - can be overridden with REMINIX_WEB_URL env var
8
11
  */
@@ -24,6 +27,64 @@ function getDeviceName() {
24
27
  return 'Unknown Device';
25
28
  }
26
29
  }
30
+ /**
31
+ * Prompt user to select a project after login
32
+ */
33
+ async function promptProjectSelection() {
34
+ // Only respect env var on login (config file might be stale from different account)
35
+ const envProject = process.env.REMINIX_PROJECT;
36
+ if (envProject) {
37
+ console.log(`Using project from REMINIX_PROJECT: ${envProject}\n`);
38
+ return;
39
+ }
40
+ try {
41
+ const client = createApiClient();
42
+ const { data, error } = await client.GET('/projects', {
43
+ params: {
44
+ query: {
45
+ limit: 100,
46
+ },
47
+ },
48
+ });
49
+ if (error) {
50
+ console.log('Could not fetch projects. You can select one later with:');
51
+ console.log(' reminix project select\n');
52
+ return;
53
+ }
54
+ const projects = data?.data || [];
55
+ if (projects.length === 0) {
56
+ console.log("You don't have any projects yet.");
57
+ console.log('Create one at https://reminix.com\n');
58
+ return;
59
+ }
60
+ if (projects.length === 1) {
61
+ // Auto-select the only project
62
+ const project = projects[0];
63
+ const slug = `${project.organization?.slug || 'unknown'}/${project.slug}`;
64
+ setConfigValue('project', slug);
65
+ console.log(`Using project: ${slug}\n`);
66
+ return;
67
+ }
68
+ // Multiple projects - prompt user to select
69
+ const selected = await select({
70
+ message: 'Select a project:',
71
+ choices: projects.map((project) => {
72
+ const slug = `${project.organization?.slug || 'unknown'}/${project.slug}`;
73
+ return {
74
+ name: `${project.name} (${slug})`,
75
+ value: slug,
76
+ };
77
+ }),
78
+ });
79
+ setConfigValue('project', selected);
80
+ console.log(`\nDefault project set to: ${selected}\n`);
81
+ }
82
+ catch {
83
+ // User cancelled or error - that's fine
84
+ console.log('\nYou can select a project later with:');
85
+ console.log(' reminix project select\n');
86
+ }
87
+ }
27
88
  /**
28
89
  * Login command - authenticates user via browser
29
90
  */
@@ -62,8 +123,9 @@ export const loginCommand = new Command('login')
62
123
  const result = await waitForCallback();
63
124
  // Save credentials
64
125
  saveCredentials(result.token, result.email);
65
- console.log(`\n✓ Successfully logged in as ${result.email}!`);
66
- process.exit(0);
126
+ console.log(`\n✓ Successfully logged in as ${result.email}!\n`);
127
+ // Prompt user to select a project
128
+ await promptProjectSelection();
67
129
  }
68
130
  catch (error) {
69
131
  if (error instanceof Error) {
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Command } from 'commander';
2
2
  /**
3
- * Logout command - clears stored credentials
3
+ * Logout command - clears stored credentials and project config
4
4
  */
5
5
  export declare const logoutCommand: Command;
6
6
  //# sourceMappingURL=logout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;GAEG;AACH,eAAO,MAAM,aAAa,SAUxB,CAAC"}
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;GAEG;AACH,eAAO,MAAM,aAAa,SAWxB,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { Command } from 'commander';
2
2
  import { clearCredentials, loadCredentials } from '../lib/credentials.js';
3
+ import { unsetConfigValue } from '../lib/config.js';
3
4
  /**
4
- * Logout command - clears stored credentials
5
+ * Logout command - clears stored credentials and project config
5
6
  */
6
7
  export const logoutCommand = new Command('logout').description('Log out of Reminix').action(() => {
7
8
  const credentials = loadCredentials();
@@ -10,6 +11,7 @@ export const logoutCommand = new Command('logout').description('Log out of Remin
10
11
  return;
11
12
  }
12
13
  clearCredentials();
14
+ unsetConfigValue('project');
13
15
  console.log(`✓ Logged out of ${credentials.email}`);
14
16
  });
15
17
  //# sourceMappingURL=logout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE1E;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;IAC/F,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,gBAAgB,EAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;IAC/F,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,gBAAgB,EAAE,CAAC;IACnB,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Project command group
4
+ */
5
+ export declare const projectCommand: Command;
6
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;GAEG;AACH,eAAO,MAAM,cAAc,SAEzB,CAAC"}