@reminix/cli 0.1.2 → 0.1.4
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 +1 -1
- package/dist/commands/agents.d.ts +6 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +195 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +65 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +6 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +15 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/projects.d.ts +6 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +104 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/version.d.ts +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/commands/whoami.d.ts +6 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +21 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +25 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +52 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/api-types.d.ts +518 -0
- package/dist/lib/api-types.d.ts.map +1 -0
- package/dist/lib/api-types.js +6 -0
- package/dist/lib/api-types.js.map +1 -0
- package/dist/lib/auth-server.d.ts +21 -0
- package/dist/lib/auth-server.d.ts.map +1 -0
- package/dist/lib/auth-server.js +234 -0
- package/dist/lib/auth-server.js.map +1 -0
- package/dist/lib/credentials.d.ts +32 -0
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +86 -0
- package/dist/lib/credentials.js.map +1 -0
- package/package.json +8 -4
package/README.md
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;GAEG;AACH,eAAO,MAAM,aAAa,SAItB,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { createApiClient } from '../lib/api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Agents command group
|
|
5
|
+
*/
|
|
6
|
+
export const agentsCommand = new Command('agents')
|
|
7
|
+
.description('Interact with agents')
|
|
8
|
+
.action(() => {
|
|
9
|
+
agentsCommand.help();
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Invoke an agent
|
|
13
|
+
*/
|
|
14
|
+
agentsCommand
|
|
15
|
+
.command('invoke <name>')
|
|
16
|
+
.description('Invoke an agent with input data')
|
|
17
|
+
.requiredOption('-p, --project <id>', 'Project ID or org-slug/project-slug')
|
|
18
|
+
.requiredOption('-i, --input <json>', 'Input data as JSON string')
|
|
19
|
+
.option('--stream', 'Stream the response')
|
|
20
|
+
.option('--json', 'Output as JSON (non-streaming only)')
|
|
21
|
+
.action(async (name, options) => {
|
|
22
|
+
try {
|
|
23
|
+
// Parse input JSON
|
|
24
|
+
let input;
|
|
25
|
+
try {
|
|
26
|
+
input = JSON.parse(options.input);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
console.error('Error: Invalid JSON input. Use --input \'{"key": "value"}\'');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const client = createApiClient({ project: options.project });
|
|
33
|
+
if (options.stream) {
|
|
34
|
+
// Streaming response
|
|
35
|
+
const response = await client.POST('/agents/{name}/invoke', {
|
|
36
|
+
params: { path: { name } },
|
|
37
|
+
body: { input, stream: true },
|
|
38
|
+
parseAs: 'stream',
|
|
39
|
+
});
|
|
40
|
+
if (!response.response.ok) {
|
|
41
|
+
const errorText = await response.response.text();
|
|
42
|
+
console.error(`Error: ${errorText}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
const reader = response.response.body?.getReader();
|
|
46
|
+
if (!reader) {
|
|
47
|
+
console.error('Error: No response body');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const decoder = new TextDecoder();
|
|
51
|
+
while (true) {
|
|
52
|
+
const { done, value } = await reader.read();
|
|
53
|
+
if (done)
|
|
54
|
+
break;
|
|
55
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
56
|
+
const lines = chunk.split('\n');
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
if (line.startsWith('data: ')) {
|
|
59
|
+
const payload = line.slice(6);
|
|
60
|
+
if (payload === '[DONE]') {
|
|
61
|
+
console.log(); // Final newline
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse(payload);
|
|
66
|
+
if (parsed.chunk) {
|
|
67
|
+
process.stdout.write(parsed.chunk);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Ignore parsing errors for incomplete chunks
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Non-streaming response
|
|
79
|
+
const { data, error } = await client.POST('/agents/{name}/invoke', {
|
|
80
|
+
params: { path: { name } },
|
|
81
|
+
body: { input, stream: false },
|
|
82
|
+
});
|
|
83
|
+
if (error) {
|
|
84
|
+
console.error(`Error: ${JSON.stringify(error)}`);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
if (options.json) {
|
|
88
|
+
console.log(JSON.stringify(data, null, 2));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Type narrow to the JSON response (not SSE)
|
|
92
|
+
const jsonData = data;
|
|
93
|
+
console.log(jsonData?.output);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error instanceof Error) {
|
|
99
|
+
console.error(`Error: ${error.message}`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.error('An unexpected error occurred');
|
|
103
|
+
}
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
/**
|
|
108
|
+
* Chat with an agent
|
|
109
|
+
*/
|
|
110
|
+
agentsCommand
|
|
111
|
+
.command('chat <name>')
|
|
112
|
+
.description('Start a chat session with an agent')
|
|
113
|
+
.requiredOption('-p, --project <id>', 'Project ID or org-slug/project-slug')
|
|
114
|
+
.requiredOption('-m, --message <text>', 'Message to send')
|
|
115
|
+
.option('--stream', 'Stream the response')
|
|
116
|
+
.option('--json', 'Output as JSON (non-streaming only)')
|
|
117
|
+
.action(async (name, options) => {
|
|
118
|
+
try {
|
|
119
|
+
const client = createApiClient({ project: options.project });
|
|
120
|
+
const messages = [{ role: 'user', content: options.message }];
|
|
121
|
+
if (options.stream) {
|
|
122
|
+
// Streaming response
|
|
123
|
+
const response = await client.POST('/agents/{name}/chat', {
|
|
124
|
+
params: { path: { name } },
|
|
125
|
+
body: { messages, stream: true },
|
|
126
|
+
parseAs: 'stream',
|
|
127
|
+
});
|
|
128
|
+
if (!response.response.ok) {
|
|
129
|
+
const errorText = await response.response.text();
|
|
130
|
+
console.error(`Error: ${errorText}`);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
const reader = response.response.body?.getReader();
|
|
134
|
+
if (!reader) {
|
|
135
|
+
console.error('Error: No response body');
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
const decoder = new TextDecoder();
|
|
139
|
+
while (true) {
|
|
140
|
+
const { done, value } = await reader.read();
|
|
141
|
+
if (done)
|
|
142
|
+
break;
|
|
143
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
144
|
+
const lines = chunk.split('\n');
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
if (line.startsWith('data: ')) {
|
|
147
|
+
const payload = line.slice(6);
|
|
148
|
+
if (payload === '[DONE]') {
|
|
149
|
+
console.log(); // Final newline
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const parsed = JSON.parse(payload);
|
|
154
|
+
if (parsed.chunk) {
|
|
155
|
+
process.stdout.write(parsed.chunk);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Ignore parsing errors for incomplete chunks
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
// Non-streaming response
|
|
167
|
+
const { data, error } = await client.POST('/agents/{name}/chat', {
|
|
168
|
+
params: { path: { name } },
|
|
169
|
+
body: { messages, stream: false },
|
|
170
|
+
});
|
|
171
|
+
if (error) {
|
|
172
|
+
console.error(`Error: ${JSON.stringify(error)}`);
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
if (options.json) {
|
|
176
|
+
console.log(JSON.stringify(data, null, 2));
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// Type narrow to the JSON response (not SSE)
|
|
180
|
+
const jsonData = data;
|
|
181
|
+
console.log(jsonData?.output);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
if (error instanceof Error) {
|
|
187
|
+
console.error(`Error: ${error.message}`);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.error('An unexpected error occurred');
|
|
191
|
+
}
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC;;GAEG;AACH,eAAO,MAAM,YAAY,SAmDrB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import open from 'open';
|
|
3
|
+
import { createAuthServer, generateState } from '../lib/auth-server.js';
|
|
4
|
+
import { saveCredentials, loadCredentials } from '../lib/credentials.js';
|
|
5
|
+
/**
|
|
6
|
+
* Default web app URL - can be overridden with REMINIX_WEB_URL env var
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_WEB_URL = 'https://reminix.com';
|
|
9
|
+
/**
|
|
10
|
+
* Get the web app URL from environment or use default
|
|
11
|
+
*/
|
|
12
|
+
function getWebUrl() {
|
|
13
|
+
return process.env.REMINIX_WEB_URL || DEFAULT_WEB_URL;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Login command - authenticates user via browser
|
|
17
|
+
*/
|
|
18
|
+
export const loginCommand = new Command('login')
|
|
19
|
+
.description('Authenticate with Reminix')
|
|
20
|
+
.option('--no-browser', "Don't open browser automatically")
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
try {
|
|
23
|
+
// Check if already logged in
|
|
24
|
+
const existing = loadCredentials();
|
|
25
|
+
if (existing) {
|
|
26
|
+
console.log(`Already logged in as ${existing.email}`);
|
|
27
|
+
console.log('Run "reminix logout" first to switch accounts.');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Generate state for CSRF protection
|
|
31
|
+
const state = generateState();
|
|
32
|
+
// Start local auth server
|
|
33
|
+
console.log('Starting authentication...');
|
|
34
|
+
const { port, waitForCallback } = await createAuthServer(state);
|
|
35
|
+
// Build auth URL
|
|
36
|
+
const webUrl = getWebUrl();
|
|
37
|
+
const authUrl = `${webUrl}/cli/authorize?port=${port}&state=${state}`;
|
|
38
|
+
// Open browser or show URL
|
|
39
|
+
if (options.browser) {
|
|
40
|
+
console.log('Opening browser to log in...\n');
|
|
41
|
+
await open(authUrl);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.log('Open this URL in your browser to log in:\n');
|
|
45
|
+
console.log(` ${authUrl}\n`);
|
|
46
|
+
}
|
|
47
|
+
console.log('Waiting for authentication...');
|
|
48
|
+
// Wait for callback
|
|
49
|
+
const result = await waitForCallback();
|
|
50
|
+
// Save credentials
|
|
51
|
+
saveCredentials(result.token, result.email);
|
|
52
|
+
console.log(`\n✓ Successfully logged in as ${result.email}!`);
|
|
53
|
+
process.exit(0);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof Error) {
|
|
57
|
+
console.error(`\n✗ Login failed: ${error.message}`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.error('\n✗ Login failed: Unknown error');
|
|
61
|
+
}
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEzE;;GAEG;AACH,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAE9C;;GAEG;AACH,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,eAAe,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,cAAc,EAAE,kCAAkC,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,qCAAqC;QACrC,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAE9B,0BAA0B;QAC1B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEhE,iBAAiB;QACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,MAAM,uBAAuB,IAAI,UAAU,KAAK,EAAE,CAAC;QAEtE,2BAA2B;QAC3B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAE7C,oBAAoB;QACpB,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QAEvC,mBAAmB;QACnB,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { clearCredentials, loadCredentials } from '../lib/credentials.js';
|
|
3
|
+
/**
|
|
4
|
+
* Logout command - clears stored credentials
|
|
5
|
+
*/
|
|
6
|
+
export const logoutCommand = new Command('logout').description('Log out of Reminix').action(() => {
|
|
7
|
+
const credentials = loadCredentials();
|
|
8
|
+
if (!credentials) {
|
|
9
|
+
console.log('Not logged in.');
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
clearCredentials();
|
|
13
|
+
console.log(`✓ Logged out of ${credentials.email}`);
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;GAEG;AACH,eAAO,MAAM,eAAe,SAE1B,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { createApiClient } from '../lib/api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Projects command group
|
|
5
|
+
*/
|
|
6
|
+
export const projectsCommand = new Command('projects').description('Manage projects').action(() => {
|
|
7
|
+
projectsCommand.help();
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* List projects
|
|
11
|
+
*/
|
|
12
|
+
projectsCommand
|
|
13
|
+
.command('list')
|
|
14
|
+
.description('List all projects you have access to')
|
|
15
|
+
.option('--json', 'Output as JSON')
|
|
16
|
+
.option('--limit <number>', 'Maximum number of projects to return', '50')
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
try {
|
|
19
|
+
const client = createApiClient();
|
|
20
|
+
const { data, error } = await client.GET('/projects', {
|
|
21
|
+
params: {
|
|
22
|
+
query: {
|
|
23
|
+
limit: parseInt(options.limit, 10),
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
if (error) {
|
|
28
|
+
console.error(`Error: ${JSON.stringify(error)}`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
if (!data?.data || data.data.length === 0) {
|
|
32
|
+
console.log('No projects found.');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (options.json) {
|
|
36
|
+
console.log(JSON.stringify(data, null, 2));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Group projects by organization
|
|
40
|
+
const byOrg = new Map();
|
|
41
|
+
for (const project of data.data) {
|
|
42
|
+
const orgName = project.organization?.name || 'Unknown';
|
|
43
|
+
if (!byOrg.has(orgName)) {
|
|
44
|
+
byOrg.set(orgName, []);
|
|
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();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof Error) {
|
|
60
|
+
console.error(`Error: ${error.message}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.error('An unexpected error occurred');
|
|
64
|
+
}
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* Get current project (useful for testing auth)
|
|
70
|
+
*/
|
|
71
|
+
projectsCommand
|
|
72
|
+
.command('current')
|
|
73
|
+
.description('Get the current project')
|
|
74
|
+
.requiredOption('-p, --project <id>', 'Project ID or org-slug/project-slug')
|
|
75
|
+
.option('--json', 'Output as JSON')
|
|
76
|
+
.action(async (options) => {
|
|
77
|
+
try {
|
|
78
|
+
const client = createApiClient({ project: options.project });
|
|
79
|
+
const { data, error } = await client.GET('/projects/current');
|
|
80
|
+
if (error) {
|
|
81
|
+
console.error(`Error: ${JSON.stringify(error)}`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
if (options.json) {
|
|
85
|
+
console.log(JSON.stringify(data, null, 2));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(`Project: ${data?.name}`);
|
|
89
|
+
console.log(` ID: ${data?.id}`);
|
|
90
|
+
console.log(` Slug: ${data?.slug}`);
|
|
91
|
+
console.log(` Organization: ${data?.organizationId}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error instanceof Error) {
|
|
96
|
+
console.error(`Error: ${error.message}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.error('An unexpected error occurred');
|
|
100
|
+
}
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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.4";
|
|
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.4';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;GAEG;AACH,eAAO,MAAM,aAAa,SAiBtB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { loadCredentials, getCredentialsDirPath } from '../lib/credentials.js';
|
|
3
|
+
/**
|
|
4
|
+
* Whoami command - shows current logged-in user
|
|
5
|
+
*/
|
|
6
|
+
export const whoamiCommand = new Command('whoami')
|
|
7
|
+
.description('Show the currently logged-in user')
|
|
8
|
+
.option('--verbose', 'Show additional details')
|
|
9
|
+
.action((options) => {
|
|
10
|
+
const credentials = loadCredentials();
|
|
11
|
+
if (!credentials) {
|
|
12
|
+
console.log("Not logged in. Run 'reminix login' to authenticate.");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
console.log(credentials.email);
|
|
16
|
+
if (options.verbose) {
|
|
17
|
+
console.log(`\nToken created: ${credentials.createdAt}`);
|
|
18
|
+
console.log(`Credentials stored in: ${getCredentialsDirPath()}`);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAC9C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE/B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,0BAA0B,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { version } from './commands/version.js';
|
|
4
|
+
import { loginCommand } from './commands/login.js';
|
|
5
|
+
import { logoutCommand } from './commands/logout.js';
|
|
6
|
+
import { whoamiCommand } from './commands/whoami.js';
|
|
7
|
+
import { projectsCommand } from './commands/projects.js';
|
|
8
|
+
import { agentsCommand } from './commands/agents.js';
|
|
4
9
|
const program = new Command();
|
|
5
10
|
program
|
|
6
11
|
.name('reminix')
|
|
@@ -10,5 +15,12 @@ program
|
|
|
10
15
|
.action(() => {
|
|
11
16
|
program.help();
|
|
12
17
|
});
|
|
18
|
+
// Auth commands
|
|
19
|
+
program.addCommand(loginCommand);
|
|
20
|
+
program.addCommand(logoutCommand);
|
|
21
|
+
program.addCommand(whoamiCommand);
|
|
22
|
+
// Resource commands
|
|
23
|
+
program.addCommand(projectsCommand);
|
|
24
|
+
program.addCommand(agentsCommand);
|
|
13
25
|
program.parse();
|
|
14
26
|
//# 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,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,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,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,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { paths } from './api-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* API client options
|
|
4
|
+
*/
|
|
5
|
+
export interface ApiClientOptions {
|
|
6
|
+
/** Project ID or org-slug/project-slug (sets X-Project header) */
|
|
7
|
+
project?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create an authenticated API client
|
|
11
|
+
*
|
|
12
|
+
* @throws Error if not logged in
|
|
13
|
+
*/
|
|
14
|
+
export declare function createApiClient(options?: ApiClientOptions): import("openapi-fetch").Client<paths, `${string}/${string}`>;
|
|
15
|
+
/**
|
|
16
|
+
* Create an API client with a specific project context
|
|
17
|
+
* Convenience wrapper for createApiClient({ project })
|
|
18
|
+
*/
|
|
19
|
+
export declare function createProjectClient(project: string): import("openapi-fetch").Client<paths, `${string}/${string}`>;
|
|
20
|
+
/**
|
|
21
|
+
* Get the current user's email from credentials
|
|
22
|
+
* Returns null if not logged in
|
|
23
|
+
*/
|
|
24
|
+
export declare function getCurrentUserEmail(): string | null;
|
|
25
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +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;AAiB5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,gEAoB7D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,gEAElD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAGnD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import createClient from 'openapi-fetch';
|
|
2
|
+
import { loadCredentials } from './credentials.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default API URL - can be overridden with REMINIX_API_URL env var
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULT_API_URL = 'https://api.reminix.com';
|
|
7
|
+
/**
|
|
8
|
+
* Get the API URL from environment or use default
|
|
9
|
+
* Appends /v1 to match the OpenAPI spec paths
|
|
10
|
+
*/
|
|
11
|
+
function getApiUrl() {
|
|
12
|
+
const baseUrl = process.env.REMINIX_API_URL || DEFAULT_API_URL;
|
|
13
|
+
return `${baseUrl}/v1`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create an authenticated API client
|
|
17
|
+
*
|
|
18
|
+
* @throws Error if not logged in
|
|
19
|
+
*/
|
|
20
|
+
export function createApiClient(options = {}) {
|
|
21
|
+
const credentials = loadCredentials();
|
|
22
|
+
if (!credentials) {
|
|
23
|
+
throw new Error("Not logged in. Run 'reminix login' to authenticate.");
|
|
24
|
+
}
|
|
25
|
+
const headers = {
|
|
26
|
+
Authorization: `Bearer ${credentials.token}`,
|
|
27
|
+
};
|
|
28
|
+
// Add X-Project header if project is specified
|
|
29
|
+
if (options.project) {
|
|
30
|
+
headers['X-Project'] = options.project;
|
|
31
|
+
}
|
|
32
|
+
return createClient({
|
|
33
|
+
baseUrl: getApiUrl(),
|
|
34
|
+
headers,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create an API client with a specific project context
|
|
39
|
+
* Convenience wrapper for createApiClient({ project })
|
|
40
|
+
*/
|
|
41
|
+
export function createProjectClient(project) {
|
|
42
|
+
return createApiClient({ project });
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get the current user's email from credentials
|
|
46
|
+
* Returns null if not logged in
|
|
47
|
+
*/
|
|
48
|
+
export function getCurrentUserEmail() {
|
|
49
|
+
const credentials = loadCredentials();
|
|
50
|
+
return credentials?.email ?? null;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +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;AAEnD;;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;;;;GAIG;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,+CAA+C;IAC/C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IACzC,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"}
|