@reminix/cli 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -87
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +16 -10
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +81 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/projects.d.ts.map +1 -1
- package/dist/commands/projects.js +25 -26
- package/dist/commands/projects.js.map +1 -1
- package/dist/commands/version.d.ts +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +5 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +10 -3
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/config.d.ts +43 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +103 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +31 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +54 -0
- package/dist/lib/output.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @reminix/cli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Official CLI for [Reminix](https://reminix.com) — deploy and manage AI agents from the command line.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -8,121 +8,81 @@ Reminix CLI - Command-line interface for Reminix.
|
|
|
8
8
|
npm install -g @reminix/cli
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Or with other package managers:
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
reminix
|
|
15
|
-
reminix
|
|
14
|
+
pnpm add -g @reminix/cli
|
|
15
|
+
yarn global add @reminix/cli
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
##
|
|
19
|
-
|
|
20
|
-
### Prerequisites
|
|
21
|
-
|
|
22
|
-
- Node.js 20+
|
|
23
|
-
- [pnpm](https://pnpm.io/) (recommended)
|
|
24
|
-
|
|
25
|
-
### Setup
|
|
18
|
+
## Quick Start
|
|
26
19
|
|
|
27
20
|
```bash
|
|
28
|
-
#
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
# Install dependencies
|
|
32
|
-
pnpm install
|
|
33
|
-
|
|
34
|
-
# Build the CLI package
|
|
35
|
-
pnpm cli:build
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### Testing Locally
|
|
21
|
+
# Login to your Reminix account
|
|
22
|
+
reminix login
|
|
39
23
|
|
|
40
|
-
|
|
24
|
+
# Set your default project (so you don't need -p every time)
|
|
25
|
+
reminix config set project <org-slug>/<project-slug>
|
|
41
26
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
pnpm cli --version
|
|
45
|
-
pnpm cli --help
|
|
27
|
+
# List your projects
|
|
28
|
+
reminix projects list
|
|
46
29
|
|
|
47
|
-
#
|
|
48
|
-
|
|
49
|
-
pnpm cli:run --version
|
|
30
|
+
# Invoke an agent
|
|
31
|
+
reminix agents invoke my-agent -i '{"prompt": "Hello!"}'
|
|
50
32
|
|
|
51
|
-
#
|
|
52
|
-
|
|
53
|
-
reminix --version
|
|
54
|
-
|
|
55
|
-
# Unlink when done
|
|
56
|
-
pnpm cli:unlink
|
|
33
|
+
# Chat with an agent
|
|
34
|
+
reminix agents chat my-agent -m "Hello!"
|
|
57
35
|
```
|
|
58
36
|
|
|
59
|
-
|
|
37
|
+
## Commands
|
|
60
38
|
|
|
61
|
-
|
|
62
|
-
|
|
39
|
+
| Command | Description |
|
|
40
|
+
|---------|-------------|
|
|
41
|
+
| `reminix login` | Authenticate with Reminix |
|
|
42
|
+
| `reminix logout` | Clear authentication |
|
|
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 |
|
|
48
|
+
| `reminix config set <key> <value>` | Set configuration value |
|
|
49
|
+
| `reminix config get <key>` | Get configuration value |
|
|
50
|
+
| `reminix config list` | List all configuration |
|
|
63
51
|
|
|
64
|
-
|
|
65
|
-
pnpm dev --version
|
|
52
|
+
## Configuration
|
|
66
53
|
|
|
67
|
-
|
|
68
|
-
pnpm build
|
|
69
|
-
node dist/index.js --version
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### Writing Tests
|
|
73
|
-
|
|
74
|
-
Tests are located in `tests/` and use [Vitest](https://vitest.dev/).
|
|
75
|
-
|
|
76
|
-
#### Test Structure
|
|
77
|
-
|
|
78
|
-
Create test files with the pattern `*.test.ts` in the `tests/` directory:
|
|
54
|
+
### Default Project
|
|
79
55
|
|
|
80
|
-
|
|
81
|
-
import { describe, it, expect } from 'vitest';
|
|
82
|
-
import { version } from '../src/commands/version.js';
|
|
56
|
+
Set a default project to avoid passing `-p` on every command:
|
|
83
57
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
expect(typeof version).toBe('string');
|
|
87
|
-
expect(version).toBeTruthy();
|
|
88
|
-
});
|
|
89
|
-
});
|
|
58
|
+
```bash
|
|
59
|
+
reminix config set project acme/my-app
|
|
90
60
|
```
|
|
91
61
|
|
|
92
|
-
|
|
62
|
+
### Environment Variables
|
|
93
63
|
|
|
94
|
-
|
|
64
|
+
| Variable | Description |
|
|
65
|
+
|----------|-------------|
|
|
66
|
+
| `REMINIX_PROJECT` | Default project (overrides config file) |
|
|
67
|
+
| `REMINIX_API_URL` | API URL (for self-hosted instances) |
|
|
95
68
|
|
|
96
|
-
|
|
97
|
-
import { describe, it, expect } from 'vitest';
|
|
98
|
-
import { execSync } from 'child_process';
|
|
69
|
+
Priority: CLI flag (`-p`) → Environment variable → Config file
|
|
99
70
|
|
|
100
|
-
|
|
101
|
-
it('should show version', () => {
|
|
102
|
-
const output = execSync('node dist/index.js --version', { encoding: 'utf-8' });
|
|
103
|
-
expect(output.trim()).toContain('0.1.0');
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
```
|
|
71
|
+
## Output Formats
|
|
107
72
|
|
|
108
|
-
|
|
73
|
+
Most commands support `-o, --output` for different output formats:
|
|
109
74
|
|
|
110
75
|
```bash
|
|
111
|
-
#
|
|
112
|
-
|
|
113
|
-
pnpm test
|
|
76
|
+
# Human-readable table (default)
|
|
77
|
+
reminix projects list
|
|
114
78
|
|
|
115
|
-
#
|
|
116
|
-
|
|
79
|
+
# JSON (for scripting)
|
|
80
|
+
reminix projects list -o json
|
|
117
81
|
```
|
|
118
82
|
|
|
119
|
-
|
|
83
|
+
## Documentation
|
|
120
84
|
|
|
121
|
-
|
|
122
|
-
# From package directory
|
|
123
|
-
cd packages/cli
|
|
124
|
-
pnpm build
|
|
125
|
-
```
|
|
85
|
+
Full documentation: [reminix.com/docs](https://reminix.com/docs)
|
|
126
86
|
|
|
127
87
|
## License
|
|
128
88
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,eAAO,MAAM,aAAa,SAItB,CAAC"}
|
package/dist/commands/agents.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { createApiClient } from '../lib/api-client.js';
|
|
3
|
+
import { requireProject } from '../lib/config.js';
|
|
4
|
+
import { getOutputFormat, outputJson } from '../lib/output.js';
|
|
3
5
|
/**
|
|
4
6
|
* Agents command group
|
|
5
7
|
*/
|
|
@@ -14,12 +16,13 @@ export const agentsCommand = new Command('agents')
|
|
|
14
16
|
agentsCommand
|
|
15
17
|
.command('invoke <name>')
|
|
16
18
|
.description('Invoke an agent with input data')
|
|
17
|
-
.
|
|
19
|
+
.option('-p, --project <id>', 'Project ID or org-slug/project-slug')
|
|
18
20
|
.requiredOption('-i, --input <json>', 'Input data as JSON string')
|
|
19
21
|
.option('--stream', 'Stream the response')
|
|
20
|
-
.option('--
|
|
22
|
+
.option('-o, --output <format>', 'Output format (json, table)', 'table')
|
|
21
23
|
.action(async (name, options) => {
|
|
22
24
|
try {
|
|
25
|
+
const project = requireProject(options.project, 'reminix agents invoke <name> -p <org-slug/project-slug> -i \'{"key": "value"}\'');
|
|
23
26
|
// Parse input JSON
|
|
24
27
|
let input;
|
|
25
28
|
try {
|
|
@@ -29,7 +32,8 @@ agentsCommand
|
|
|
29
32
|
console.error('Error: Invalid JSON input. Use --input \'{"key": "value"}\'');
|
|
30
33
|
process.exit(1);
|
|
31
34
|
}
|
|
32
|
-
const client = createApiClient({ project
|
|
35
|
+
const client = createApiClient({ project });
|
|
36
|
+
const format = getOutputFormat(options);
|
|
33
37
|
if (options.stream) {
|
|
34
38
|
// Streaming response
|
|
35
39
|
const response = await client.POST('/agents/{name}/invoke', {
|
|
@@ -84,8 +88,8 @@ agentsCommand
|
|
|
84
88
|
console.error(`Error: ${JSON.stringify(error)}`);
|
|
85
89
|
process.exit(1);
|
|
86
90
|
}
|
|
87
|
-
if (
|
|
88
|
-
|
|
91
|
+
if (format === 'json') {
|
|
92
|
+
outputJson(data);
|
|
89
93
|
}
|
|
90
94
|
else {
|
|
91
95
|
// Type narrow to the JSON response (not SSE)
|
|
@@ -110,13 +114,15 @@ agentsCommand
|
|
|
110
114
|
agentsCommand
|
|
111
115
|
.command('chat <name>')
|
|
112
116
|
.description('Start a chat session with an agent')
|
|
113
|
-
.
|
|
117
|
+
.option('-p, --project <id>', 'Project ID or org-slug/project-slug')
|
|
114
118
|
.requiredOption('-m, --message <text>', 'Message to send')
|
|
115
119
|
.option('--stream', 'Stream the response')
|
|
116
|
-
.option('--
|
|
120
|
+
.option('-o, --output <format>', 'Output format (json, table)', 'table')
|
|
117
121
|
.action(async (name, options) => {
|
|
118
122
|
try {
|
|
119
|
-
const
|
|
123
|
+
const project = requireProject(options.project, 'reminix agents chat <name> -p <org-slug/project-slug> -m "message"');
|
|
124
|
+
const client = createApiClient({ project });
|
|
125
|
+
const format = getOutputFormat(options);
|
|
120
126
|
const messages = [{ role: 'user', content: options.message }];
|
|
121
127
|
if (options.stream) {
|
|
122
128
|
// Streaming response
|
|
@@ -172,8 +178,8 @@ agentsCommand
|
|
|
172
178
|
console.error(`Error: ${JSON.stringify(error)}`);
|
|
173
179
|
process.exit(1);
|
|
174
180
|
}
|
|
175
|
-
if (
|
|
176
|
-
|
|
181
|
+
if (format === 'json') {
|
|
182
|
+
outputJson(data);
|
|
177
183
|
}
|
|
178
184
|
else {
|
|
179
185
|
// Type narrow to the JSON response (not SSE)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,eAAO,MAAM,aAAa,SAItB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { loadConfig, setConfigValue, unsetConfigValue } from '../lib/config.js';
|
|
3
|
+
const VALID_KEYS = ['project'];
|
|
4
|
+
/**
|
|
5
|
+
* Config command group
|
|
6
|
+
*/
|
|
7
|
+
export const configCommand = new Command('config')
|
|
8
|
+
.description('Manage CLI configuration')
|
|
9
|
+
.action(() => {
|
|
10
|
+
configCommand.help();
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Set a config value
|
|
14
|
+
*/
|
|
15
|
+
configCommand
|
|
16
|
+
.command('set <key> <value>')
|
|
17
|
+
.description('Set a configuration value')
|
|
18
|
+
.action((key, value) => {
|
|
19
|
+
if (!VALID_KEYS.includes(key)) {
|
|
20
|
+
console.error(`Error: Invalid config key '${key}'. Valid keys: ${VALID_KEYS.join(', ')}`);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
setConfigValue(key, value);
|
|
24
|
+
console.log(`Set ${key} = ${value}`);
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Get a config value
|
|
28
|
+
*/
|
|
29
|
+
configCommand
|
|
30
|
+
.command('get <key>')
|
|
31
|
+
.description('Get a configuration value')
|
|
32
|
+
.action((key) => {
|
|
33
|
+
if (!VALID_KEYS.includes(key)) {
|
|
34
|
+
console.error(`Error: Invalid config key '${key}'. Valid keys: ${VALID_KEYS.join(', ')}`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const config = loadConfig();
|
|
38
|
+
const value = config[key];
|
|
39
|
+
if (value === undefined) {
|
|
40
|
+
console.log(`${key} is not set`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.log(value);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Unset a config value
|
|
48
|
+
*/
|
|
49
|
+
configCommand
|
|
50
|
+
.command('unset <key>')
|
|
51
|
+
.description('Remove a configuration value')
|
|
52
|
+
.action((key) => {
|
|
53
|
+
if (!VALID_KEYS.includes(key)) {
|
|
54
|
+
console.error(`Error: Invalid config key '${key}'. Valid keys: ${VALID_KEYS.join(', ')}`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
unsetConfigValue(key);
|
|
58
|
+
console.log(`Unset ${key}`);
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* List all config values
|
|
62
|
+
*/
|
|
63
|
+
configCommand
|
|
64
|
+
.command('list')
|
|
65
|
+
.description('List all configuration values')
|
|
66
|
+
.action(() => {
|
|
67
|
+
const config = loadConfig();
|
|
68
|
+
const entries = Object.entries(config);
|
|
69
|
+
if (entries.length === 0) {
|
|
70
|
+
console.log('No configuration set.');
|
|
71
|
+
console.log('\nAvailable keys:');
|
|
72
|
+
for (const key of VALID_KEYS) {
|
|
73
|
+
console.log(` ${key}`);
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
for (const [key, value] of entries) {
|
|
78
|
+
console.log(`${key} = ${value}`);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
//# 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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,eAAO,MAAM,eAAe,SAE1B,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { createApiClient } from '../lib/api-client.js';
|
|
3
|
+
import { requireProject } from '../lib/config.js';
|
|
4
|
+
import { getOutputFormat, outputJson, table } from '../lib/output.js';
|
|
3
5
|
/**
|
|
4
6
|
* Projects command group
|
|
5
7
|
*/
|
|
@@ -12,11 +14,12 @@ export const projectsCommand = new Command('projects').description('Manage proje
|
|
|
12
14
|
projectsCommand
|
|
13
15
|
.command('list')
|
|
14
16
|
.description('List all projects you have access to')
|
|
15
|
-
.option('--
|
|
17
|
+
.option('-o, --output <format>', 'Output format (json, table)', 'table')
|
|
16
18
|
.option('--limit <number>', 'Maximum number of projects to return', '50')
|
|
17
19
|
.action(async (options) => {
|
|
18
20
|
try {
|
|
19
21
|
const client = createApiClient();
|
|
22
|
+
const format = getOutputFormat(options);
|
|
20
23
|
const { data, error } = await client.GET('/projects', {
|
|
21
24
|
params: {
|
|
22
25
|
query: {
|
|
@@ -29,30 +32,24 @@ projectsCommand
|
|
|
29
32
|
process.exit(1);
|
|
30
33
|
}
|
|
31
34
|
if (!data?.data || data.data.length === 0) {
|
|
32
|
-
|
|
35
|
+
if (format === 'json') {
|
|
36
|
+
outputJson({ data: [], hasMore: false, nextCursor: null });
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.log('No projects found.');
|
|
40
|
+
}
|
|
33
41
|
return;
|
|
34
42
|
}
|
|
35
|
-
if (
|
|
36
|
-
|
|
43
|
+
if (format === 'json') {
|
|
44
|
+
outputJson(data);
|
|
37
45
|
}
|
|
38
46
|
else {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
byOrg.get(orgName).push(project);
|
|
47
|
-
}
|
|
48
|
-
for (const [orgName, projects] of byOrg) {
|
|
49
|
-
console.log(`\n${orgName}:`);
|
|
50
|
-
for (const project of projects) {
|
|
51
|
-
const orgSlug = project.organization?.slug || 'unknown';
|
|
52
|
-
console.log(` ${project.name} (${orgSlug}/${project.slug})`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
console.log();
|
|
47
|
+
const rows = data.data.map((project) => [
|
|
48
|
+
project.name,
|
|
49
|
+
`${project.organization?.slug || 'unknown'}/${project.slug}`,
|
|
50
|
+
project.organization?.name || 'Unknown',
|
|
51
|
+
]);
|
|
52
|
+
table(['NAME', 'SLUG', 'ORGANIZATION'], rows);
|
|
56
53
|
}
|
|
57
54
|
}
|
|
58
55
|
catch (error) {
|
|
@@ -71,18 +68,20 @@ projectsCommand
|
|
|
71
68
|
projectsCommand
|
|
72
69
|
.command('current')
|
|
73
70
|
.description('Get the current project')
|
|
74
|
-
.
|
|
75
|
-
.option('--
|
|
71
|
+
.option('-p, --project <id>', 'Project ID or org-slug/project-slug')
|
|
72
|
+
.option('-o, --output <format>', 'Output format (json, table)', 'table')
|
|
76
73
|
.action(async (options) => {
|
|
77
74
|
try {
|
|
78
|
-
const
|
|
75
|
+
const project = requireProject(options.project, 'reminix projects current -p <org-slug/project-slug>');
|
|
76
|
+
const client = createApiClient({ project });
|
|
77
|
+
const format = getOutputFormat(options);
|
|
79
78
|
const { data, error } = await client.GET('/projects/current');
|
|
80
79
|
if (error) {
|
|
81
80
|
console.error(`Error: ${JSON.stringify(error)}`);
|
|
82
81
|
process.exit(1);
|
|
83
82
|
}
|
|
84
|
-
if (
|
|
85
|
-
|
|
83
|
+
if (format === 'json') {
|
|
84
|
+
outputJson(data);
|
|
86
85
|
}
|
|
87
86
|
else {
|
|
88
87
|
console.log(`Project: ${data?.name}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "0.1.
|
|
1
|
+
export declare const version = "0.1.9";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/commands/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '0.1.
|
|
1
|
+
export const version = '0.1.9';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/dist/index.js
CHANGED
|
@@ -7,8 +7,12 @@ import { logoutCommand } from './commands/logout.js';
|
|
|
7
7
|
import { whoamiCommand } from './commands/whoami.js';
|
|
8
8
|
import { projectsCommand } from './commands/projects.js';
|
|
9
9
|
import { agentsCommand } from './commands/agents.js';
|
|
10
|
+
import { configCommand } from './commands/config.js';
|
|
10
11
|
const pkg = { name: '@reminix/cli', version };
|
|
11
|
-
|
|
12
|
+
// Skip update checks in CI environments
|
|
13
|
+
if (!process.env.CI) {
|
|
14
|
+
updateNotifier({ pkg, updateCheckInterval: 1000 * 60 * 60 }).notify();
|
|
15
|
+
}
|
|
12
16
|
const program = new Command();
|
|
13
17
|
program
|
|
14
18
|
.name('reminix')
|
|
@@ -25,5 +29,7 @@ program.addCommand(whoamiCommand);
|
|
|
25
29
|
// Resource commands
|
|
26
30
|
program.addCommand(projectsCommand);
|
|
27
31
|
program.addCommand(agentsCommand);
|
|
32
|
+
// Configuration
|
|
33
|
+
program.addCommand(configCommand);
|
|
28
34
|
program.parse();
|
|
29
35
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;AAE9C,wCAAwC;AACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,wBAAwB,CAAC;KAC3D,kBAAkB,EAAE;KACpB,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,gBAAgB;AAChB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,gBAAgB;AAChB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/lib/api-client.d.ts
CHANGED
|
@@ -9,6 +9,11 @@ export interface ApiClientOptions {
|
|
|
9
9
|
/**
|
|
10
10
|
* Create an authenticated API client
|
|
11
11
|
*
|
|
12
|
+
* Uses project from (in priority order):
|
|
13
|
+
* 1. options.project (explicit)
|
|
14
|
+
* 2. REMINIX_PROJECT env var
|
|
15
|
+
* 3. Global config (~/.config/reminix/config.json)
|
|
16
|
+
*
|
|
12
17
|
* @throws Error if not logged in
|
|
13
18
|
*/
|
|
14
19
|
export declare function createApiClient(options?: ApiClientOptions): import("openapi-fetch").Client<paths, `${string}/${string}`>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAkB5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,gEAqB7D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,gEAElD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAGnD"}
|
package/dist/lib/api-client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import createClient from 'openapi-fetch';
|
|
2
2
|
import { loadCredentials } from './credentials.js';
|
|
3
|
+
import { getDefaultProject } from './config.js';
|
|
3
4
|
/**
|
|
4
5
|
* Default API URL - can be overridden with REMINIX_API_URL env var
|
|
5
6
|
*/
|
|
@@ -15,6 +16,11 @@ function getApiUrl() {
|
|
|
15
16
|
/**
|
|
16
17
|
* Create an authenticated API client
|
|
17
18
|
*
|
|
19
|
+
* Uses project from (in priority order):
|
|
20
|
+
* 1. options.project (explicit)
|
|
21
|
+
* 2. REMINIX_PROJECT env var
|
|
22
|
+
* 3. Global config (~/.config/reminix/config.json)
|
|
23
|
+
*
|
|
18
24
|
* @throws Error if not logged in
|
|
19
25
|
*/
|
|
20
26
|
export function createApiClient(options = {}) {
|
|
@@ -25,9 +31,10 @@ export function createApiClient(options = {}) {
|
|
|
25
31
|
const headers = {
|
|
26
32
|
Authorization: `Bearer ${credentials.token}`,
|
|
27
33
|
};
|
|
28
|
-
// Add X-Project header if project is specified
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
// Add X-Project header if project is specified (explicit > env var > config)
|
|
35
|
+
const project = options.project || getDefaultProject();
|
|
36
|
+
if (project) {
|
|
37
|
+
headers['X-Project'] = project;
|
|
31
38
|
}
|
|
32
39
|
return createClient({
|
|
33
40
|
baseUrl: getApiUrl(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAElD;;;GAGG;AACH,SAAS,SAAS;IAChB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,eAAe,CAAC;IAC/D,OAAO,GAAG,OAAO,KAAK,CAAC;AACzB,CAAC;AAUD;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,UAA4B,EAAE;IAC5D,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,WAAW,CAAC,KAAK,EAAE;KAC7C,CAAC;IAEF,6EAA6E;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;IACjC,CAAC;IAED,OAAO,YAAY,CAAQ;QACzB,OAAO,EAAE,SAAS,EAAE;QACpB,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,OAAO,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,OAAO,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global configuration for the Reminix CLI
|
|
3
|
+
*/
|
|
4
|
+
export interface Config {
|
|
5
|
+
/** Default project (org-slug/project-slug) */
|
|
6
|
+
project?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Load the global config
|
|
10
|
+
* Returns empty config if file doesn't exist
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadConfig(): Config;
|
|
13
|
+
/**
|
|
14
|
+
* Save the global config
|
|
15
|
+
*/
|
|
16
|
+
export declare function saveConfig(config: Config): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get a config value
|
|
19
|
+
*/
|
|
20
|
+
export declare function getConfigValue<K extends keyof Config>(key: K): Config[K];
|
|
21
|
+
/**
|
|
22
|
+
* Set a config value
|
|
23
|
+
*/
|
|
24
|
+
export declare function setConfigValue<K extends keyof Config>(key: K, value: Config[K]): void;
|
|
25
|
+
/**
|
|
26
|
+
* Unset a config value
|
|
27
|
+
*/
|
|
28
|
+
export declare function unsetConfigValue<K extends keyof Config>(key: K): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get the default project from environment variable or config
|
|
31
|
+
* Priority: REMINIX_PROJECT env var > config file
|
|
32
|
+
*/
|
|
33
|
+
export declare function getDefaultProject(): string | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Get project from options, env var, or config.
|
|
36
|
+
* Exits with helpful error if no project is available.
|
|
37
|
+
*
|
|
38
|
+
* @param optionsProject - Project from CLI options (-p flag)
|
|
39
|
+
* @param usageExample - Example command to show in error message
|
|
40
|
+
* @returns The project string
|
|
41
|
+
*/
|
|
42
|
+
export declare function requireProject(optionsProject: string | undefined, usageExample: string): string;
|
|
43
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAgBD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAanC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAU/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAGxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAIrF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAIrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAStD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAe/F"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
/**
|
|
5
|
+
* Get the path to the config directory
|
|
6
|
+
*/
|
|
7
|
+
function getConfigDir() {
|
|
8
|
+
return path.join(os.homedir(), '.config', 'reminix');
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get the path to the config file
|
|
12
|
+
*/
|
|
13
|
+
function getConfigPath() {
|
|
14
|
+
return path.join(getConfigDir(), 'config.json');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Load the global config
|
|
18
|
+
* Returns empty config if file doesn't exist
|
|
19
|
+
*/
|
|
20
|
+
export function loadConfig() {
|
|
21
|
+
const configPath = getConfigPath();
|
|
22
|
+
try {
|
|
23
|
+
if (fs.existsSync(configPath)) {
|
|
24
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
25
|
+
return JSON.parse(content);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Ignore errors, return empty config
|
|
30
|
+
}
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Save the global config
|
|
35
|
+
*/
|
|
36
|
+
export function saveConfig(config) {
|
|
37
|
+
const configDir = getConfigDir();
|
|
38
|
+
const configPath = getConfigPath();
|
|
39
|
+
// Ensure config directory exists
|
|
40
|
+
if (!fs.existsSync(configDir)) {
|
|
41
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get a config value
|
|
47
|
+
*/
|
|
48
|
+
export function getConfigValue(key) {
|
|
49
|
+
const config = loadConfig();
|
|
50
|
+
return config[key];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Set a config value
|
|
54
|
+
*/
|
|
55
|
+
export function setConfigValue(key, value) {
|
|
56
|
+
const config = loadConfig();
|
|
57
|
+
config[key] = value;
|
|
58
|
+
saveConfig(config);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Unset a config value
|
|
62
|
+
*/
|
|
63
|
+
export function unsetConfigValue(key) {
|
|
64
|
+
const config = loadConfig();
|
|
65
|
+
delete config[key];
|
|
66
|
+
saveConfig(config);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the default project from environment variable or config
|
|
70
|
+
* Priority: REMINIX_PROJECT env var > config file
|
|
71
|
+
*/
|
|
72
|
+
export function getDefaultProject() {
|
|
73
|
+
// Check environment variable first
|
|
74
|
+
const envProject = process.env.REMINIX_PROJECT;
|
|
75
|
+
if (envProject) {
|
|
76
|
+
return envProject;
|
|
77
|
+
}
|
|
78
|
+
// Fall back to config file
|
|
79
|
+
return getConfigValue('project');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get project from options, env var, or config.
|
|
83
|
+
* Exits with helpful error if no project is available.
|
|
84
|
+
*
|
|
85
|
+
* @param optionsProject - Project from CLI options (-p flag)
|
|
86
|
+
* @param usageExample - Example command to show in error message
|
|
87
|
+
* @returns The project string
|
|
88
|
+
*/
|
|
89
|
+
export function requireProject(optionsProject, usageExample) {
|
|
90
|
+
const project = optionsProject || getDefaultProject();
|
|
91
|
+
if (!project) {
|
|
92
|
+
console.error('Error: No project specified.');
|
|
93
|
+
console.error('');
|
|
94
|
+
console.error('Set a default project:');
|
|
95
|
+
console.error(' reminix config set project <org-slug/project-slug>');
|
|
96
|
+
console.error('');
|
|
97
|
+
console.error('Or use the -p flag:');
|
|
98
|
+
console.error(` ${usageExample}`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
return project;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting utilities for CLI commands
|
|
3
|
+
*/
|
|
4
|
+
export type OutputFormat = 'json' | 'table';
|
|
5
|
+
/**
|
|
6
|
+
* Get the output format from command options
|
|
7
|
+
* Validates the format and exits with error if invalid
|
|
8
|
+
*/
|
|
9
|
+
export declare function getOutputFormat(options: {
|
|
10
|
+
output?: string;
|
|
11
|
+
}): OutputFormat;
|
|
12
|
+
/**
|
|
13
|
+
* Output data as formatted JSON
|
|
14
|
+
*/
|
|
15
|
+
export declare function outputJson(data: unknown): void;
|
|
16
|
+
/**
|
|
17
|
+
* Render data as an ASCII table
|
|
18
|
+
*
|
|
19
|
+
* @param headers - Column headers
|
|
20
|
+
* @param rows - Array of row data (each row is an array of cell values)
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* table(['NAME', 'SLUG'], [['Project One', 'proj-1'], ['Project Two', 'proj-2']])
|
|
24
|
+
* // Output:
|
|
25
|
+
* // NAME SLUG
|
|
26
|
+
* // ──────────── ──────
|
|
27
|
+
* // Project One proj-1
|
|
28
|
+
* // Project Two proj-2
|
|
29
|
+
*/
|
|
30
|
+
export declare function table(headers: string[], rows: string[][]): void;
|
|
31
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAS1E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAwB/D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting utilities for CLI commands
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get the output format from command options
|
|
6
|
+
* Validates the format and exits with error if invalid
|
|
7
|
+
*/
|
|
8
|
+
export function getOutputFormat(options) {
|
|
9
|
+
const format = options.output?.toLowerCase();
|
|
10
|
+
if (format && !['json', 'table'].includes(format)) {
|
|
11
|
+
console.error(`Error: Invalid output format '${format}'. Use 'json' or 'table'.`);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
return format || 'table';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Output data as formatted JSON
|
|
18
|
+
*/
|
|
19
|
+
export function outputJson(data) {
|
|
20
|
+
console.log(JSON.stringify(data, null, 2));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Render data as an ASCII table
|
|
24
|
+
*
|
|
25
|
+
* @param headers - Column headers
|
|
26
|
+
* @param rows - Array of row data (each row is an array of cell values)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* table(['NAME', 'SLUG'], [['Project One', 'proj-1'], ['Project Two', 'proj-2']])
|
|
30
|
+
* // Output:
|
|
31
|
+
* // NAME SLUG
|
|
32
|
+
* // ──────────── ──────
|
|
33
|
+
* // Project One proj-1
|
|
34
|
+
* // Project Two proj-2
|
|
35
|
+
*/
|
|
36
|
+
export function table(headers, rows) {
|
|
37
|
+
if (rows.length === 0) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Calculate column widths (max of header and all cell values)
|
|
41
|
+
const widths = headers.map((header, colIndex) => Math.max(header.length, ...rows.map((row) => (row[colIndex] || '').length)));
|
|
42
|
+
// Format a single row
|
|
43
|
+
const formatRow = (cells) => cells.map((cell, i) => (cell || '').padEnd(widths[i])).join(' ');
|
|
44
|
+
// Build the table
|
|
45
|
+
const headerLine = formatRow(headers);
|
|
46
|
+
const separatorLine = widths.map((w) => '─'.repeat(w)).join(' ');
|
|
47
|
+
const dataLines = rows.map((row) => formatRow(row));
|
|
48
|
+
console.log(headerLine);
|
|
49
|
+
console.log(separatorLine);
|
|
50
|
+
for (const line of dataLines) {
|
|
51
|
+
console.log(line);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAA4B;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAE7C,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,iCAAiC,MAAM,2BAA2B,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAQ,MAAuB,IAAI,OAAO,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,KAAK,CAAC,OAAiB,EAAE,IAAgB;IACvD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,8DAA8D;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAC9C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAC5E,CAAC;IAEF,sBAAsB;IACtB,MAAM,SAAS,GAAG,CAAC,KAAe,EAAE,EAAE,CACpC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAErE,kBAAkB;IAClB,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
|