sentron-cli 1.0.0
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 +78 -0
- package/dist/api.d.ts +81 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +90 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +348 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/metrics.d.ts +6 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +150 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/storage.d.ts +21 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +50 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/styling.d.ts +65 -0
- package/dist/utils/styling.d.ts.map +1 -0
- package/dist/utils/styling.js +124 -0
- package/dist/utils/styling.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# @sentron/cli
|
|
2
|
+
|
|
3
|
+
Command-line interface for the Sentron API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Run directly with npx
|
|
9
|
+
npx @sentron/cli auth signin
|
|
10
|
+
|
|
11
|
+
# Or install globally
|
|
12
|
+
npm install -g @sentron/cli
|
|
13
|
+
sentron auth signin
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Commands
|
|
17
|
+
|
|
18
|
+
### Authentication
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Sign in via browser
|
|
22
|
+
sentron auth signin
|
|
23
|
+
|
|
24
|
+
# Get current user info
|
|
25
|
+
sentron auth me
|
|
26
|
+
|
|
27
|
+
# Check authentication status
|
|
28
|
+
sentron auth status
|
|
29
|
+
|
|
30
|
+
# Sign out
|
|
31
|
+
sentron auth signout
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### API Keys
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Create a new API key
|
|
38
|
+
sentron auth api-key create
|
|
39
|
+
|
|
40
|
+
# List all API keys
|
|
41
|
+
sentron auth api-key list
|
|
42
|
+
|
|
43
|
+
# Revoke an API key
|
|
44
|
+
sentron auth api-key revoke <id>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Metrics
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# View usage summary
|
|
51
|
+
sentron metrics
|
|
52
|
+
|
|
53
|
+
# View detailed metrics
|
|
54
|
+
sentron metrics get
|
|
55
|
+
|
|
56
|
+
# View metrics for specific time period
|
|
57
|
+
sentron metrics get --days 7
|
|
58
|
+
|
|
59
|
+
# Output as JSON
|
|
60
|
+
sentron metrics --json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Configuration
|
|
64
|
+
|
|
65
|
+
The CLI stores credentials in `~/.sentron/token`.
|
|
66
|
+
|
|
67
|
+
To use a custom API URL, set the `SENTRON_API_URL` environment variable:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
export SENTRON_API_URL=https://api.sentron.dev
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Links
|
|
74
|
+
|
|
75
|
+
- Website: https://sentron.dev
|
|
76
|
+
- Documentation: https://sentron.dev/docs
|
|
77
|
+
- GitHub: https://github.com/sentron-dev/sentron
|
|
78
|
+
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Client
|
|
3
|
+
* Makes HTTP requests to the Sentron API
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Make an authenticated API request
|
|
7
|
+
*/
|
|
8
|
+
export declare function apiRequest<T = any>(endpoint: string, options?: RequestInit): Promise<T>;
|
|
9
|
+
/**
|
|
10
|
+
* API endpoints
|
|
11
|
+
*/
|
|
12
|
+
export declare const api: {
|
|
13
|
+
auth: {
|
|
14
|
+
signin(): Promise<{
|
|
15
|
+
authUrl: string;
|
|
16
|
+
signInAttemptId: string;
|
|
17
|
+
}>;
|
|
18
|
+
verifyCli(signInAttemptId: string): Promise<{
|
|
19
|
+
token: string;
|
|
20
|
+
userId: string;
|
|
21
|
+
email: string;
|
|
22
|
+
firstName?: string;
|
|
23
|
+
lastName?: string;
|
|
24
|
+
}>;
|
|
25
|
+
me(): Promise<{
|
|
26
|
+
id: string;
|
|
27
|
+
email: string;
|
|
28
|
+
firstName?: string;
|
|
29
|
+
lastName?: string;
|
|
30
|
+
createdAt: string;
|
|
31
|
+
}>;
|
|
32
|
+
};
|
|
33
|
+
apiKeys: {
|
|
34
|
+
create(name: string, expiresInDays?: number): Promise<{
|
|
35
|
+
id: string;
|
|
36
|
+
key: string;
|
|
37
|
+
name: string;
|
|
38
|
+
keyPrefix: string;
|
|
39
|
+
createdAt: string;
|
|
40
|
+
expiresAt: string | null;
|
|
41
|
+
}>;
|
|
42
|
+
list(): Promise<{
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
keyPrefix: string;
|
|
46
|
+
lastUsedAt: string | null;
|
|
47
|
+
createdAt: string;
|
|
48
|
+
expiresAt: string | null;
|
|
49
|
+
}[]>;
|
|
50
|
+
revoke(id: string): Promise<any>;
|
|
51
|
+
};
|
|
52
|
+
metrics: {
|
|
53
|
+
get(days?: number): Promise<{
|
|
54
|
+
totalRequests: number;
|
|
55
|
+
totalRequestsThisMonth: number;
|
|
56
|
+
totalMcpCalls: number;
|
|
57
|
+
totalCliCommands: number;
|
|
58
|
+
successRate: number;
|
|
59
|
+
avgResponseTime: number;
|
|
60
|
+
requestsByInterface: Record<string, number>;
|
|
61
|
+
requestsByDay: Array<{
|
|
62
|
+
date: string;
|
|
63
|
+
count: number;
|
|
64
|
+
}>;
|
|
65
|
+
topEndpoints: Array<{
|
|
66
|
+
endpoint: string;
|
|
67
|
+
count: number;
|
|
68
|
+
}>;
|
|
69
|
+
}>;
|
|
70
|
+
getSummary(): Promise<{
|
|
71
|
+
totalRequests: number;
|
|
72
|
+
totalRequestsThisMonth: number;
|
|
73
|
+
totalMcpCalls: number;
|
|
74
|
+
totalCliCommands: number;
|
|
75
|
+
successRate: number;
|
|
76
|
+
avgResponseTime: number;
|
|
77
|
+
requestsByInterface: Record<string, number>;
|
|
78
|
+
}>;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CA8BZ;AAED;;GAEG;AACH,eAAO,MAAM,GAAG;;;qBAYqB,MAAM;6BAAmB,MAAM;;mCAG/B,MAAM;mBAW5B,MAAM;oBACL,MAAM;mBACP,MAAM;wBACD,MAAM;uBACP,MAAM;;;gBAMb,MAAM;mBACH,MAAM;wBACD,MAAM;uBACP,MAAM;uBACN,MAAM;;;;qBAMF,MAAM,kBAAkB,MAAM;gBAEzC,MAAM;iBACL,MAAM;kBACL,MAAM;uBACD,MAAM;uBACN,MAAM;uBACN,MAAM,GAAG,IAAI;;;gBASpB,MAAM;kBACJ,MAAM;uBACD,MAAM;wBACL,MAAM,GAAG,IAAI;uBACd,MAAM;uBACN,MAAM,GAAG,IAAI;;mBAIX,MAAM;;;;2BAQJ,MAAM;oCACG,MAAM;2BACf,MAAM;8BACH,MAAM;yBACX,MAAM;6BACF,MAAM;iCACF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;2BAC5B,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;0BACvC,KAAK,CAAC;gBAAE,QAAQ,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;;;2BAMzC,MAAM;oCACG,MAAM;2BACf,MAAM;8BACH,MAAM;yBACX,MAAM;6BACF,MAAM;iCACF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;CAIlD,CAAA"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Client
|
|
3
|
+
* Makes HTTP requests to the Sentron API
|
|
4
|
+
*/
|
|
5
|
+
import { config } from './config.js';
|
|
6
|
+
import { getStoredToken } from './utils/storage.js';
|
|
7
|
+
/**
|
|
8
|
+
* Make an authenticated API request
|
|
9
|
+
*/
|
|
10
|
+
export async function apiRequest(endpoint, options = {}) {
|
|
11
|
+
const token = await getStoredToken();
|
|
12
|
+
const headers = {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'X-Request-Source': 'cli',
|
|
15
|
+
...(options.headers || {}),
|
|
16
|
+
};
|
|
17
|
+
if (token) {
|
|
18
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
19
|
+
}
|
|
20
|
+
const url = endpoint.startsWith('http') ? endpoint : `${config.baseUrl}${endpoint}`;
|
|
21
|
+
const response = await fetch(url, {
|
|
22
|
+
...options,
|
|
23
|
+
headers,
|
|
24
|
+
});
|
|
25
|
+
const data = await response.json().catch(() => ({}));
|
|
26
|
+
if (!response.ok || !data.success) {
|
|
27
|
+
const error = new Error(data.error?.message || `Request failed: ${response.status}`);
|
|
28
|
+
error.code = data.error?.code || 'REQUEST_FAILED';
|
|
29
|
+
error.status = response.status;
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
return data.data;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* API endpoints
|
|
36
|
+
*/
|
|
37
|
+
export const api = {
|
|
38
|
+
auth: {
|
|
39
|
+
async signin() {
|
|
40
|
+
const response = await fetch(`${config.baseUrl}/auth/signin`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: { 'Content-Type': 'application/json' },
|
|
43
|
+
body: JSON.stringify({}),
|
|
44
|
+
});
|
|
45
|
+
const data = await response.json();
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new Error(data.error?.message || 'Failed to initiate sign in');
|
|
48
|
+
}
|
|
49
|
+
return data.data;
|
|
50
|
+
},
|
|
51
|
+
async verifyCli(signInAttemptId) {
|
|
52
|
+
const response = await fetch(`${config.baseUrl}/auth/verify-cli`, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: { 'Content-Type': 'application/json' },
|
|
55
|
+
body: JSON.stringify({ signInAttemptId }),
|
|
56
|
+
});
|
|
57
|
+
const data = await response.json();
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
throw new Error(data.error?.message || 'Authentication failed');
|
|
60
|
+
}
|
|
61
|
+
return data.data;
|
|
62
|
+
},
|
|
63
|
+
async me() {
|
|
64
|
+
return apiRequest('/auth/me');
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
apiKeys: {
|
|
68
|
+
async create(name, expiresInDays) {
|
|
69
|
+
return apiRequest('/api-keys', {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
body: JSON.stringify({ name, expiresInDays }),
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
async list() {
|
|
75
|
+
return apiRequest('/api-keys');
|
|
76
|
+
},
|
|
77
|
+
async revoke(id) {
|
|
78
|
+
return apiRequest(`/api-keys/${id}`, { method: 'DELETE' });
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
metrics: {
|
|
82
|
+
async get(days = 30) {
|
|
83
|
+
return apiRequest(`/metrics?days=${days}`);
|
|
84
|
+
},
|
|
85
|
+
async getSummary() {
|
|
86
|
+
return apiRequest('/metrics/summary');
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0DnC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QA6UjD"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Commands
|
|
3
|
+
*/
|
|
4
|
+
import * as readline from 'readline';
|
|
5
|
+
import { exec } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import { api } from '../api.js';
|
|
8
|
+
import { getStoredToken, storeToken, removeToken, getTokenPath } from '../utils/storage.js';
|
|
9
|
+
import { printHeader, printSection, printSuccess, printError, printInfo, printWarning, printBox, printPrompt, printLoading, printLoadingComplete, printLoadingError, brand, } from '../utils/styling.js';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
/**
|
|
12
|
+
* Prompt for input
|
|
13
|
+
*/
|
|
14
|
+
function prompt(question) {
|
|
15
|
+
const rl = readline.createInterface({
|
|
16
|
+
input: process.stdin,
|
|
17
|
+
output: process.stdout,
|
|
18
|
+
});
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
rl.question(question, (answer) => {
|
|
21
|
+
rl.close();
|
|
22
|
+
resolve(answer.trim());
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Open URL in browser
|
|
28
|
+
*/
|
|
29
|
+
async function openBrowser(url) {
|
|
30
|
+
try {
|
|
31
|
+
const platform = process.platform;
|
|
32
|
+
if (platform === 'darwin') {
|
|
33
|
+
await execAsync(`open "${url}"`);
|
|
34
|
+
}
|
|
35
|
+
else if (platform === 'win32') {
|
|
36
|
+
await execAsync(`start "${url}"`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
await execAsync(`xdg-open "${url}"`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Ignore errors
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function setupAuthCommands(program) {
|
|
47
|
+
const authCmd = program
|
|
48
|
+
.command('auth')
|
|
49
|
+
.description('Authentication commands');
|
|
50
|
+
// Sign in command
|
|
51
|
+
authCmd
|
|
52
|
+
.command('signin')
|
|
53
|
+
.alias('login')
|
|
54
|
+
.description('Sign in via browser')
|
|
55
|
+
.action(async () => {
|
|
56
|
+
try {
|
|
57
|
+
printHeader();
|
|
58
|
+
printSection('Authentication');
|
|
59
|
+
printLoading('Initializing authentication');
|
|
60
|
+
const { authUrl, signInAttemptId } = await api.auth.signin();
|
|
61
|
+
printLoadingComplete();
|
|
62
|
+
printInfo('Opening browser for authentication...');
|
|
63
|
+
console.log();
|
|
64
|
+
printInfo(`If browser doesn't open, visit: ${brand.accent(authUrl)}`);
|
|
65
|
+
console.log();
|
|
66
|
+
await openBrowser(authUrl);
|
|
67
|
+
printLoading('Waiting for authentication in browser');
|
|
68
|
+
// Poll for verification (max 2 minutes)
|
|
69
|
+
const maxAttempts = 60;
|
|
70
|
+
const pollInterval = 2000;
|
|
71
|
+
let verifyResult = null;
|
|
72
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
73
|
+
try {
|
|
74
|
+
verifyResult = await api.auth.verifyCli(signInAttemptId);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (i === maxAttempts - 1) {
|
|
79
|
+
throw new Error('Authentication timeout. Please try again.');
|
|
80
|
+
}
|
|
81
|
+
await new Promise(r => setTimeout(r, pollInterval));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (!verifyResult) {
|
|
85
|
+
throw new Error('Authentication failed');
|
|
86
|
+
}
|
|
87
|
+
printLoadingComplete();
|
|
88
|
+
// Create an API key for CLI use
|
|
89
|
+
console.log();
|
|
90
|
+
printSection('API Key Setup');
|
|
91
|
+
printInfo('Creating an API key for CLI access...');
|
|
92
|
+
console.log();
|
|
93
|
+
const apiKeyName = await prompt(printPrompt('API Key Name (e.g., "CLI Key")'));
|
|
94
|
+
if (!apiKeyName) {
|
|
95
|
+
printError('API key name is required');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
const expiresInput = await prompt(printPrompt('Expiration in days (optional, press Enter for no expiration)'));
|
|
99
|
+
const expiresInDays = expiresInput ? parseInt(expiresInput) : undefined;
|
|
100
|
+
if (expiresInput && (isNaN(expiresInDays) || expiresInDays <= 0)) {
|
|
101
|
+
printError('Expiration must be a positive number');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
// Temporarily store JWT to create API key
|
|
105
|
+
await storeToken(verifyResult.token);
|
|
106
|
+
printLoading('Creating API key');
|
|
107
|
+
const keyData = await api.apiKeys.create(apiKeyName, expiresInDays);
|
|
108
|
+
printLoadingComplete();
|
|
109
|
+
// Store API key (replaces JWT)
|
|
110
|
+
await storeToken(keyData.key);
|
|
111
|
+
console.log();
|
|
112
|
+
printSection('Sign In Successful');
|
|
113
|
+
printBox([
|
|
114
|
+
`User ID: ${verifyResult.userId}`,
|
|
115
|
+
`Email: ${verifyResult.email}`,
|
|
116
|
+
verifyResult.firstName ? `Name: ${verifyResult.firstName} ${verifyResult.lastName || ''}`.trim() : '',
|
|
117
|
+
].filter(Boolean));
|
|
118
|
+
console.log();
|
|
119
|
+
printSection('API Key Created');
|
|
120
|
+
printBox([
|
|
121
|
+
`Name: ${keyData.name}`,
|
|
122
|
+
`Key: ${brand.accent(keyData.key)}`,
|
|
123
|
+
`Prefix: ${brand.muted(keyData.keyPrefix)}...`,
|
|
124
|
+
keyData.expiresAt ? `Expires: ${new Date(keyData.expiresAt).toLocaleDateString()}` : 'Expires: Never',
|
|
125
|
+
]);
|
|
126
|
+
console.log();
|
|
127
|
+
printInfo(`Credentials saved to ${brand.muted(getTokenPath())}`);
|
|
128
|
+
printWarning('⚠️ Save this API key now! You won\'t be able to see it again.');
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
printLoadingError();
|
|
132
|
+
console.log();
|
|
133
|
+
printError(error instanceof Error ? error.message : 'Authentication failed');
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// Get account info
|
|
138
|
+
authCmd
|
|
139
|
+
.command('me')
|
|
140
|
+
.alias('whoami')
|
|
141
|
+
.description('Get current account information')
|
|
142
|
+
.option('--json', 'Output as JSON')
|
|
143
|
+
.action(async (options) => {
|
|
144
|
+
try {
|
|
145
|
+
const token = await getStoredToken();
|
|
146
|
+
if (!token) {
|
|
147
|
+
printError('Not signed in. Run "sentron auth signin" first.');
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
printLoading('Fetching account information');
|
|
151
|
+
const userInfo = await api.auth.me();
|
|
152
|
+
printLoadingComplete();
|
|
153
|
+
if (options.json) {
|
|
154
|
+
console.log(JSON.stringify(userInfo, null, 2));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.log();
|
|
158
|
+
printSection('Account Information');
|
|
159
|
+
printBox([
|
|
160
|
+
`ID: ${userInfo.id}`,
|
|
161
|
+
`Email: ${userInfo.email}`,
|
|
162
|
+
userInfo.firstName ? `Name: ${userInfo.firstName} ${userInfo.lastName || ''}`.trim() : '',
|
|
163
|
+
`Created: ${new Date(userInfo.createdAt).toLocaleDateString()}`,
|
|
164
|
+
].filter(Boolean));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
printLoadingError();
|
|
169
|
+
console.log();
|
|
170
|
+
printError(error instanceof Error ? error.message : 'Failed to get account info');
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// Status command
|
|
175
|
+
authCmd
|
|
176
|
+
.command('status')
|
|
177
|
+
.description('Check authentication status')
|
|
178
|
+
.action(async () => {
|
|
179
|
+
const token = await getStoredToken();
|
|
180
|
+
if (!token) {
|
|
181
|
+
printSection('Authentication Status');
|
|
182
|
+
printBox([
|
|
183
|
+
`Status: ${brand.warning('Not signed in')}`,
|
|
184
|
+
'',
|
|
185
|
+
`Run ${brand.accent('sentron auth signin')} to sign in`,
|
|
186
|
+
]);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
printLoading('Checking authentication status');
|
|
191
|
+
const userInfo = await api.auth.me();
|
|
192
|
+
printLoadingComplete();
|
|
193
|
+
console.log();
|
|
194
|
+
printSection('Authentication Status');
|
|
195
|
+
printBox([
|
|
196
|
+
`Status: ${brand.success('Signed in')}`,
|
|
197
|
+
`User: ${userInfo.email}`,
|
|
198
|
+
`ID: ${brand.muted(userInfo.id)}`,
|
|
199
|
+
]);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
printLoadingError();
|
|
203
|
+
console.log();
|
|
204
|
+
printSection('Authentication Status');
|
|
205
|
+
printBox([
|
|
206
|
+
`Status: ${brand.error('Invalid token')}`,
|
|
207
|
+
'',
|
|
208
|
+
`Run ${brand.accent('sentron auth signin')} to sign in again`,
|
|
209
|
+
]);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
// Sign out command
|
|
213
|
+
authCmd
|
|
214
|
+
.command('signout')
|
|
215
|
+
.alias('logout')
|
|
216
|
+
.description('Sign out and remove stored credentials')
|
|
217
|
+
.action(async () => {
|
|
218
|
+
const removed = await removeToken();
|
|
219
|
+
printSection('Sign Out');
|
|
220
|
+
if (removed) {
|
|
221
|
+
printSuccess('Signed out successfully');
|
|
222
|
+
printInfo(`Credentials removed from ${brand.muted(getTokenPath())}`);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
printInfo('Already signed out');
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
// API Key subcommands
|
|
229
|
+
const apiKeyCmd = authCmd
|
|
230
|
+
.command('api-key')
|
|
231
|
+
.alias('apikey')
|
|
232
|
+
.description('Manage API keys');
|
|
233
|
+
// Create API key
|
|
234
|
+
apiKeyCmd
|
|
235
|
+
.command('create')
|
|
236
|
+
.description('Create a new API key')
|
|
237
|
+
.option('-n, --name <name>', 'Name for the API key')
|
|
238
|
+
.option('-e, --expires <days>', 'Expiration in days')
|
|
239
|
+
.action(async (options) => {
|
|
240
|
+
try {
|
|
241
|
+
const token = await getStoredToken();
|
|
242
|
+
if (!token) {
|
|
243
|
+
printError('Not signed in. Run "sentron auth signin" first.');
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
246
|
+
const name = options.name || await prompt(printPrompt('API Key Name'));
|
|
247
|
+
if (!name) {
|
|
248
|
+
printError('Name is required');
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
const expiresInDays = options.expires ? parseInt(options.expires) : undefined;
|
|
252
|
+
printLoading('Creating API key');
|
|
253
|
+
const result = await api.apiKeys.create(name, expiresInDays);
|
|
254
|
+
printLoadingComplete();
|
|
255
|
+
console.log();
|
|
256
|
+
printSection('API Key Created');
|
|
257
|
+
printBox([
|
|
258
|
+
`Name: ${result.name}`,
|
|
259
|
+
`Key: ${brand.accent(result.key)}`,
|
|
260
|
+
`Prefix: ${brand.muted(result.keyPrefix)}...`,
|
|
261
|
+
`Created: ${new Date(result.createdAt).toLocaleDateString()}`,
|
|
262
|
+
result.expiresAt ? `Expires: ${new Date(result.expiresAt).toLocaleDateString()}` : 'Expires: Never',
|
|
263
|
+
]);
|
|
264
|
+
console.log();
|
|
265
|
+
printWarning('⚠️ Save this key now! You won\'t be able to see it again.');
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
printLoadingError();
|
|
269
|
+
console.log();
|
|
270
|
+
printError(error instanceof Error ? error.message : 'Failed to create API key');
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
// List API keys
|
|
275
|
+
apiKeyCmd
|
|
276
|
+
.command('list')
|
|
277
|
+
.alias('ls')
|
|
278
|
+
.description('List all your API keys')
|
|
279
|
+
.option('--json', 'Output as JSON')
|
|
280
|
+
.action(async (options) => {
|
|
281
|
+
try {
|
|
282
|
+
const token = await getStoredToken();
|
|
283
|
+
if (!token) {
|
|
284
|
+
printError('Not signed in. Run "sentron auth signin" first.');
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
printLoading('Fetching API keys');
|
|
288
|
+
const keys = await api.apiKeys.list();
|
|
289
|
+
printLoadingComplete();
|
|
290
|
+
if (options.json) {
|
|
291
|
+
console.log(JSON.stringify(keys, null, 2));
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
console.log();
|
|
295
|
+
printSection('API Keys');
|
|
296
|
+
if (keys.length === 0) {
|
|
297
|
+
printInfo('No API keys found. Create one with "sentron auth api-key create"');
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
keys.forEach((key) => {
|
|
301
|
+
printBox([
|
|
302
|
+
`ID: ${brand.muted(key.id)}`,
|
|
303
|
+
`Name: ${key.name}`,
|
|
304
|
+
`Prefix: ${key.keyPrefix}...`,
|
|
305
|
+
`Created: ${new Date(key.createdAt).toLocaleDateString()}`,
|
|
306
|
+
key.lastUsedAt ? `Last Used: ${new Date(key.lastUsedAt).toLocaleDateString()}` : 'Last Used: Never',
|
|
307
|
+
key.expiresAt ? `Expires: ${new Date(key.expiresAt).toLocaleDateString()}` : 'Expires: Never',
|
|
308
|
+
]);
|
|
309
|
+
console.log();
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
printLoadingError();
|
|
316
|
+
console.log();
|
|
317
|
+
printError(error instanceof Error ? error.message : 'Failed to list API keys');
|
|
318
|
+
process.exit(1);
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
// Revoke API key
|
|
322
|
+
apiKeyCmd
|
|
323
|
+
.command('revoke <id>')
|
|
324
|
+
.alias('delete')
|
|
325
|
+
.description('Revoke an API key')
|
|
326
|
+
.action(async (id) => {
|
|
327
|
+
try {
|
|
328
|
+
const token = await getStoredToken();
|
|
329
|
+
if (!token) {
|
|
330
|
+
printError('Not signed in. Run "sentron auth signin" first.');
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
printLoading('Revoking API key');
|
|
334
|
+
await api.apiKeys.revoke(id);
|
|
335
|
+
printLoadingComplete();
|
|
336
|
+
console.log();
|
|
337
|
+
printSection('API Key Revoked');
|
|
338
|
+
printSuccess('API key revoked successfully');
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
printLoadingError();
|
|
342
|
+
console.log();
|
|
343
|
+
printError(error instanceof Error ? error.message : 'Failed to revoke API key');
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/commands/metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAuKpD"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Commands
|
|
3
|
+
*/
|
|
4
|
+
import { api } from '../api.js';
|
|
5
|
+
import { getStoredToken } from '../utils/storage.js';
|
|
6
|
+
import { printSection, printError, printInfo, printBox, printLoading, printLoadingComplete, printLoadingError, brand, } from '../utils/styling.js';
|
|
7
|
+
export function setupMetricsCommands(program) {
|
|
8
|
+
const metricsCmd = program
|
|
9
|
+
.command('metrics')
|
|
10
|
+
.description('View usage metrics');
|
|
11
|
+
// Get metrics summary
|
|
12
|
+
metricsCmd
|
|
13
|
+
.command('summary')
|
|
14
|
+
.alias('s')
|
|
15
|
+
.description('Get usage summary')
|
|
16
|
+
.option('--json', 'Output as JSON')
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
try {
|
|
19
|
+
const token = await getStoredToken();
|
|
20
|
+
if (!token) {
|
|
21
|
+
printError('Not signed in. Run "sentron auth signin" first.');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
printLoading('Fetching metrics');
|
|
25
|
+
const metrics = await api.metrics.getSummary();
|
|
26
|
+
printLoadingComplete();
|
|
27
|
+
if (options.json) {
|
|
28
|
+
console.log(JSON.stringify(metrics, null, 2));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log();
|
|
32
|
+
printSection('Usage Summary');
|
|
33
|
+
printBox([
|
|
34
|
+
`Total Requests: ${brand.accent(metrics.totalRequests.toString())}`,
|
|
35
|
+
`This Month: ${metrics.totalRequestsThisMonth}`,
|
|
36
|
+
`MCP Calls: ${metrics.totalMcpCalls}`,
|
|
37
|
+
`CLI Commands: ${metrics.totalCliCommands}`,
|
|
38
|
+
`Success Rate: ${brand.success(metrics.successRate + '%')}`,
|
|
39
|
+
`Avg Response Time: ${metrics.avgResponseTime}ms`,
|
|
40
|
+
]);
|
|
41
|
+
if (Object.keys(metrics.requestsByInterface).length > 0) {
|
|
42
|
+
console.log();
|
|
43
|
+
printSection('By Interface');
|
|
44
|
+
printBox(Object.entries(metrics.requestsByInterface).map(([iface, count]) => `${iface.padEnd(10)} ${count}`));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
printLoadingError();
|
|
50
|
+
console.log();
|
|
51
|
+
printError(error instanceof Error ? error.message : 'Failed to get metrics');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// Get detailed metrics
|
|
56
|
+
metricsCmd
|
|
57
|
+
.command('get')
|
|
58
|
+
.alias('show')
|
|
59
|
+
.description('Get detailed usage metrics')
|
|
60
|
+
.option('-d, --days <days>', 'Number of days to include', '30')
|
|
61
|
+
.option('--json', 'Output as JSON')
|
|
62
|
+
.action(async (options) => {
|
|
63
|
+
try {
|
|
64
|
+
const token = await getStoredToken();
|
|
65
|
+
if (!token) {
|
|
66
|
+
printError('Not signed in. Run "sentron auth signin" first.');
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
const days = parseInt(options.days) || 30;
|
|
70
|
+
printLoading(`Fetching metrics for last ${days} days`);
|
|
71
|
+
const metrics = await api.metrics.get(days);
|
|
72
|
+
printLoadingComplete();
|
|
73
|
+
if (options.json) {
|
|
74
|
+
console.log(JSON.stringify(metrics, null, 2));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log();
|
|
78
|
+
printSection('Usage Metrics');
|
|
79
|
+
printBox([
|
|
80
|
+
`Total Requests: ${brand.accent(metrics.totalRequests.toString())}`,
|
|
81
|
+
`This Month: ${metrics.totalRequestsThisMonth}`,
|
|
82
|
+
`MCP Calls: ${metrics.totalMcpCalls}`,
|
|
83
|
+
`CLI Commands: ${metrics.totalCliCommands}`,
|
|
84
|
+
`Success Rate: ${brand.success(metrics.successRate + '%')}`,
|
|
85
|
+
`Avg Response Time: ${metrics.avgResponseTime}ms`,
|
|
86
|
+
]);
|
|
87
|
+
if (Object.keys(metrics.requestsByInterface).length > 0) {
|
|
88
|
+
console.log();
|
|
89
|
+
printSection('By Interface');
|
|
90
|
+
printBox(Object.entries(metrics.requestsByInterface).map(([iface, count]) => `${iface.padEnd(10)} ${count}`));
|
|
91
|
+
}
|
|
92
|
+
if (metrics.topEndpoints && metrics.topEndpoints.length > 0) {
|
|
93
|
+
console.log();
|
|
94
|
+
printSection('Top Endpoints');
|
|
95
|
+
printBox(metrics.topEndpoints.slice(0, 5).map((ep) => `${ep.endpoint.padEnd(25)} ${ep.count}`));
|
|
96
|
+
}
|
|
97
|
+
if (metrics.requestsByDay && metrics.requestsByDay.length > 0) {
|
|
98
|
+
console.log();
|
|
99
|
+
printSection('Daily Activity (Last 7 Days)');
|
|
100
|
+
const recent = metrics.requestsByDay.slice(-7);
|
|
101
|
+
printBox(recent.map((day) => {
|
|
102
|
+
const date = new Date(day.date).toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });
|
|
103
|
+
const bar = '█'.repeat(Math.min(day.count, 20));
|
|
104
|
+
return `${date.padEnd(15)} ${bar} ${day.count}`;
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
printLoadingError();
|
|
111
|
+
console.log();
|
|
112
|
+
printError(error instanceof Error ? error.message : 'Failed to get metrics');
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
// Default action - show summary
|
|
117
|
+
metricsCmd
|
|
118
|
+
.action(async () => {
|
|
119
|
+
try {
|
|
120
|
+
const token = await getStoredToken();
|
|
121
|
+
if (!token) {
|
|
122
|
+
printError('Not signed in. Run "sentron auth signin" first.');
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
printLoading('Fetching metrics');
|
|
126
|
+
const metrics = await api.metrics.getSummary();
|
|
127
|
+
printLoadingComplete();
|
|
128
|
+
console.log();
|
|
129
|
+
printSection('Usage Summary');
|
|
130
|
+
printBox([
|
|
131
|
+
`Total Requests: ${brand.accent(metrics.totalRequests.toString())}`,
|
|
132
|
+
`This Month: ${metrics.totalRequestsThisMonth}`,
|
|
133
|
+
`MCP Calls: ${metrics.totalMcpCalls}`,
|
|
134
|
+
`CLI Commands: ${metrics.totalCliCommands}`,
|
|
135
|
+
`Success Rate: ${brand.success(metrics.successRate + '%')}`,
|
|
136
|
+
`Avg Response Time: ${metrics.avgResponseTime}ms`,
|
|
137
|
+
]);
|
|
138
|
+
console.log();
|
|
139
|
+
printInfo('Run "sentron metrics get" for detailed metrics');
|
|
140
|
+
printInfo('Run "sentron metrics --help" for more options');
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
printLoadingError();
|
|
144
|
+
console.log();
|
|
145
|
+
printError(error instanceof Error ? error.message : 'Failed to get metrics');
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/commands/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,MAAM;;;;CAWlB,CAAA"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Configuration
|
|
3
|
+
*/
|
|
4
|
+
export const config = {
|
|
5
|
+
// Production API URL
|
|
6
|
+
apiUrl: process.env.SENTRON_API_URL || 'https://api.sentron.dev',
|
|
7
|
+
// API version
|
|
8
|
+
apiVersion: 'v1',
|
|
9
|
+
// Get full API base URL
|
|
10
|
+
get baseUrl() {
|
|
11
|
+
return `${this.apiUrl}/api/${this.apiVersion}`;
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB;IAEhE,cAAc;IACd,UAAU,EAAE,IAAI;IAEhB,wBAAwB;IACxB,IAAI,OAAO;QACT,OAAO,GAAG,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAA;IAChD,CAAC;CACF,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Sentron CLI
|
|
4
|
+
* Command-line interface for Sentron API
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* npx @sentron/cli auth signin
|
|
8
|
+
* npx @sentron/cli auth me
|
|
9
|
+
* npx @sentron/cli metrics
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import { setupAuthCommands } from './commands/auth.js';
|
|
13
|
+
import { setupMetricsCommands } from './commands/metrics.js';
|
|
14
|
+
const program = new Command();
|
|
15
|
+
program
|
|
16
|
+
.name('sentron')
|
|
17
|
+
.description('Sentron CLI - Command-line interface for Sentron API')
|
|
18
|
+
.version('1.0.0');
|
|
19
|
+
// Setup command groups
|
|
20
|
+
setupAuthCommands(program);
|
|
21
|
+
setupMetricsCommands(program);
|
|
22
|
+
// Parse arguments
|
|
23
|
+
program.parse();
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAE5D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,sDAAsD,CAAC;KACnE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,uBAAuB;AACvB,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC1B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAE7B,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Storage
|
|
3
|
+
* Stores API key in ~/.sentron/token
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Get stored token (API key)
|
|
7
|
+
*/
|
|
8
|
+
export declare function getStoredToken(): Promise<string | null>;
|
|
9
|
+
/**
|
|
10
|
+
* Store token (API key) to file
|
|
11
|
+
*/
|
|
12
|
+
export declare function storeToken(token: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Remove stored token
|
|
15
|
+
*/
|
|
16
|
+
export declare function removeToken(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Get token file path
|
|
19
|
+
*/
|
|
20
|
+
export declare function getTokenPath(): string;
|
|
21
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU7D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7D;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Storage
|
|
3
|
+
* Stores API key in ~/.sentron/token
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
const TOKEN_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '', '.sentron');
|
|
9
|
+
const TOKEN_FILE = path.join(TOKEN_DIR, 'token');
|
|
10
|
+
/**
|
|
11
|
+
* Get stored token (API key)
|
|
12
|
+
*/
|
|
13
|
+
export async function getStoredToken() {
|
|
14
|
+
try {
|
|
15
|
+
if (!existsSync(TOKEN_FILE)) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const token = await fs.readFile(TOKEN_FILE, 'utf-8');
|
|
19
|
+
return token.trim() || null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Store token (API key) to file
|
|
27
|
+
*/
|
|
28
|
+
export async function storeToken(token) {
|
|
29
|
+
await fs.mkdir(TOKEN_DIR, { recursive: true });
|
|
30
|
+
await fs.writeFile(TOKEN_FILE, token, { mode: 0o600 });
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Remove stored token
|
|
34
|
+
*/
|
|
35
|
+
export async function removeToken() {
|
|
36
|
+
try {
|
|
37
|
+
await fs.unlink(TOKEN_FILE);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get token file path
|
|
46
|
+
*/
|
|
47
|
+
export function getTokenPath() {
|
|
48
|
+
return TOKEN_FILE;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,UAAU,CAAC,CAAA;AAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACpD,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Styling Utilities
|
|
3
|
+
* Beautiful terminal output
|
|
4
|
+
*/
|
|
5
|
+
import kleur from 'kleur';
|
|
6
|
+
export declare const brand: {
|
|
7
|
+
primary: kleur.Color;
|
|
8
|
+
accent: kleur.Color;
|
|
9
|
+
success: kleur.Color;
|
|
10
|
+
warning: kleur.Color;
|
|
11
|
+
error: kleur.Color;
|
|
12
|
+
muted: kleur.Color;
|
|
13
|
+
bold: kleur.Color;
|
|
14
|
+
};
|
|
15
|
+
export declare const text: {
|
|
16
|
+
dim: kleur.Color;
|
|
17
|
+
bold: kleur.Color;
|
|
18
|
+
italic: kleur.Color;
|
|
19
|
+
underline: kleur.Color;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Print header with logo
|
|
23
|
+
*/
|
|
24
|
+
export declare function printHeader(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Print section header
|
|
27
|
+
*/
|
|
28
|
+
export declare function printSection(title: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Print success message
|
|
31
|
+
*/
|
|
32
|
+
export declare function printSuccess(message: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Print error message
|
|
35
|
+
*/
|
|
36
|
+
export declare function printError(message: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Print info message
|
|
39
|
+
*/
|
|
40
|
+
export declare function printInfo(message: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Print warning message
|
|
43
|
+
*/
|
|
44
|
+
export declare function printWarning(message: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Print a box with content
|
|
47
|
+
*/
|
|
48
|
+
export declare function printBox(lines: string[]): void;
|
|
49
|
+
/**
|
|
50
|
+
* Print prompt
|
|
51
|
+
*/
|
|
52
|
+
export declare function printPrompt(question: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Start loading animation
|
|
55
|
+
*/
|
|
56
|
+
export declare function printLoading(message: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Complete loading with success
|
|
59
|
+
*/
|
|
60
|
+
export declare function printLoadingComplete(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Complete loading with error
|
|
63
|
+
*/
|
|
64
|
+
export declare function printLoadingError(): void;
|
|
65
|
+
//# sourceMappingURL=styling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styling.d.ts","sourceRoot":"","sources":["../../src/utils/styling.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,eAAO,MAAM,KAAK;;;;;;;;CAQjB,CAAA;AAED,eAAO,MAAM,IAAI;;;;;CAKhB,CAAA;AAED;;GAEG;AACH,wBAAgB,WAAW,SAM1B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QAEzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,QAE3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,QAEzC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,QAExC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,QAE3C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAWvC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,QAW3C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,SAMnC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,SAMhC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Styling Utilities
|
|
3
|
+
* Beautiful terminal output
|
|
4
|
+
*/
|
|
5
|
+
import kleur from 'kleur';
|
|
6
|
+
// Brand colors
|
|
7
|
+
export const brand = {
|
|
8
|
+
primary: kleur.cyan,
|
|
9
|
+
accent: kleur.magenta,
|
|
10
|
+
success: kleur.green,
|
|
11
|
+
warning: kleur.yellow,
|
|
12
|
+
error: kleur.red,
|
|
13
|
+
muted: kleur.gray,
|
|
14
|
+
bold: kleur.bold,
|
|
15
|
+
};
|
|
16
|
+
export const text = {
|
|
17
|
+
dim: kleur.dim,
|
|
18
|
+
bold: kleur.bold,
|
|
19
|
+
italic: kleur.italic,
|
|
20
|
+
underline: kleur.underline,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Print header with logo
|
|
24
|
+
*/
|
|
25
|
+
export function printHeader() {
|
|
26
|
+
console.log();
|
|
27
|
+
console.log(brand.primary(' ╭─────────────────────────────────────╮'));
|
|
28
|
+
console.log(brand.primary(' │') + brand.bold(' SENTRON CLI ') + brand.primary('│'));
|
|
29
|
+
console.log(brand.primary(' ╰─────────────────────────────────────╯'));
|
|
30
|
+
console.log();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Print section header
|
|
34
|
+
*/
|
|
35
|
+
export function printSection(title) {
|
|
36
|
+
console.log(brand.bold(brand.primary(`▸ ${title}`)));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Print success message
|
|
40
|
+
*/
|
|
41
|
+
export function printSuccess(message) {
|
|
42
|
+
console.log(brand.success('✔ ') + message);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Print error message
|
|
46
|
+
*/
|
|
47
|
+
export function printError(message) {
|
|
48
|
+
console.log(brand.error('✖ ') + message);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Print info message
|
|
52
|
+
*/
|
|
53
|
+
export function printInfo(message) {
|
|
54
|
+
console.log(brand.muted('ℹ ') + message);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Print warning message
|
|
58
|
+
*/
|
|
59
|
+
export function printWarning(message) {
|
|
60
|
+
console.log(brand.warning('⚠ ') + message);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Print a box with content
|
|
64
|
+
*/
|
|
65
|
+
export function printBox(lines) {
|
|
66
|
+
const maxLen = Math.max(...lines.map(l => stripAnsi(l).length), 30);
|
|
67
|
+
const border = brand.muted('─'.repeat(maxLen + 4));
|
|
68
|
+
console.log(brand.muted('┌') + border + brand.muted('┐'));
|
|
69
|
+
lines.forEach(line => {
|
|
70
|
+
const stripped = stripAnsi(line);
|
|
71
|
+
const padding = ' '.repeat(maxLen - stripped.length);
|
|
72
|
+
console.log(brand.muted('│') + ' ' + line + padding + ' ' + brand.muted('│'));
|
|
73
|
+
});
|
|
74
|
+
console.log(brand.muted('└') + border + brand.muted('┘'));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Print prompt
|
|
78
|
+
*/
|
|
79
|
+
export function printPrompt(question) {
|
|
80
|
+
return brand.primary('? ') + question + brand.muted(': ');
|
|
81
|
+
}
|
|
82
|
+
// Loading state
|
|
83
|
+
let loadingInterval = null;
|
|
84
|
+
let loadingMessage = '';
|
|
85
|
+
/**
|
|
86
|
+
* Start loading animation
|
|
87
|
+
*/
|
|
88
|
+
export function printLoading(message) {
|
|
89
|
+
loadingMessage = message;
|
|
90
|
+
const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
91
|
+
let i = 0;
|
|
92
|
+
process.stdout.write(brand.primary(frames[0]) + ' ' + message);
|
|
93
|
+
loadingInterval = setInterval(() => {
|
|
94
|
+
i = (i + 1) % frames.length;
|
|
95
|
+
process.stdout.write(`\r${brand.primary(frames[i])} ${message}`);
|
|
96
|
+
}, 80);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Complete loading with success
|
|
100
|
+
*/
|
|
101
|
+
export function printLoadingComplete() {
|
|
102
|
+
if (loadingInterval) {
|
|
103
|
+
clearInterval(loadingInterval);
|
|
104
|
+
loadingInterval = null;
|
|
105
|
+
}
|
|
106
|
+
process.stdout.write(`\r${brand.success('✔')} ${loadingMessage}\n`);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Complete loading with error
|
|
110
|
+
*/
|
|
111
|
+
export function printLoadingError() {
|
|
112
|
+
if (loadingInterval) {
|
|
113
|
+
clearInterval(loadingInterval);
|
|
114
|
+
loadingInterval = null;
|
|
115
|
+
}
|
|
116
|
+
process.stdout.write(`\r${brand.error('✖')} ${loadingMessage}\n`);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Strip ANSI codes from string
|
|
120
|
+
*/
|
|
121
|
+
function stripAnsi(str) {
|
|
122
|
+
return str.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=styling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styling.js","sourceRoot":"","sources":["../../src/utils/styling.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sentron-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Sentron CLI - Command-line interface for Sentron API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"sentron": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"sentron",
|
|
17
|
+
"cli",
|
|
18
|
+
"api",
|
|
19
|
+
"mcp"
|
|
20
|
+
],
|
|
21
|
+
"author": "Sentron",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/sentron-dev/sentron"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://sentron.dev",
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18.0.0"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"commander": "^12.0.0",
|
|
33
|
+
"kleur": "^4.1.5"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^20.11.0",
|
|
37
|
+
"tsx": "^4.7.0",
|
|
38
|
+
"typescript": "^5.3.3"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
|