@neetru/cli 1.0.0 → 2.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/CHANGELOG.md +136 -0
- package/README.md +109 -152
- package/dist/commands/add.d.ts +8 -3
- package/dist/commands/add.js +70 -143
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/ai.d.ts +4 -0
- package/dist/commands/ai.js +88 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/autocomplete.d.ts +7 -0
- package/dist/commands/autocomplete.js +107 -0
- package/dist/commands/autocomplete.js.map +1 -0
- package/dist/commands/build.d.ts +18 -0
- package/dist/commands/build.js +288 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +70 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/db.d.ts +14 -0
- package/dist/commands/db.js +187 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -3
- package/dist/commands/deploy.js +400 -180
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/doctor.d.ts +27 -0
- package/dist/commands/doctor.js +211 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/env.d.ts +15 -0
- package/dist/commands/env.js +56 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/fn.d.ts +6 -0
- package/dist/commands/fn.js +87 -0
- package/dist/commands/fn.js.map +1 -0
- package/dist/commands/init.d.ts +10 -3
- package/dist/commands/init.js +212 -143
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +6 -3
- package/dist/commands/login.js +222 -92
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.js +28 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +14 -3
- package/dist/commands/logs.js +132 -106
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mocks.d.ts +5 -0
- package/dist/commands/mocks.js +23 -0
- package/dist/commands/mocks.js.map +1 -0
- package/dist/commands/open.d.ts +4 -3
- package/dist/commands/open.js +53 -85
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/promote.d.ts +9 -0
- package/dist/commands/promote.js +114 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/publish.d.ts +14 -0
- package/dist/commands/publish.js +180 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/status.d.ts +5 -3
- package/dist/commands/status.js +91 -93
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade.d.ts +12 -0
- package/dist/commands/upgrade.js +77 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/validate.d.ts +1 -3
- package/dist/commands/validate.js +83 -91
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/whoami.d.ts +5 -3
- package/dist/commands/whoami.js +76 -28
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +337 -36
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/context.d.ts +11 -0
- package/dist/lib/ai/context.js +112 -0
- package/dist/lib/ai/context.js.map +1 -0
- package/dist/lib/ai/orchestrator.d.ts +10 -0
- package/dist/lib/ai/orchestrator.js +92 -0
- package/dist/lib/ai/orchestrator.js.map +1 -0
- package/dist/lib/api-client.d.ts +21 -0
- package/dist/lib/api-client.js +65 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/auth.d.ts +15 -0
- package/dist/lib/auth.js +98 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config-schema.d.ts +165 -0
- package/dist/lib/config-schema.js +57 -0
- package/dist/lib/config-schema.js.map +1 -0
- package/dist/lib/config.d.ts +15 -0
- package/dist/lib/config.js +33 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.js +27 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +35 -33
- package/templates/auth/callback.ts +22 -0
- package/templates/auth/sign-in.tsx +41 -0
- package/templates/billing/checkout.ts +22 -0
- package/templates/billing/page.tsx +43 -0
- package/templates/support/ticket-form.tsx +68 -0
- package/templates/usage/track.ts +30 -0
- package/templates/users/profile.tsx +43 -0
- package/LICENSE +0 -21
- package/dist/commands/add.d.ts.map +0 -1
- package/dist/commands/deploy.d.ts.map +0 -1
- package/dist/commands/generate-types.d.ts +0 -3
- package/dist/commands/generate-types.d.ts.map +0 -1
- package/dist/commands/generate-types.js +0 -150
- package/dist/commands/generate-types.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/open.d.ts.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/whoami.d.ts.map +0 -1
- package/dist/config.d.ts +0 -14
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -83
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/scaffold/auth.d.ts +0 -3
- package/dist/scaffold/auth.d.ts.map +0 -1
- package/dist/scaffold/auth.js +0 -228
- package/dist/scaffold/auth.js.map +0 -1
- package/dist/scaffold/billing.d.ts +0 -3
- package/dist/scaffold/billing.d.ts.map +0 -1
- package/dist/scaffold/billing.js +0 -184
- package/dist/scaffold/billing.js.map +0 -1
- package/dist/scaffold/usage.d.ts +0 -3
- package/dist/scaffold/usage.d.ts.map +0 -1
- package/dist/scaffold/usage.js +0 -173
- package/dist/scaffold/usage.js.map +0 -1
- package/dist/scaffold/users.d.ts +0 -3
- package/dist/scaffold/users.d.ts.map +0 -1
- package/dist/scaffold/users.js +0 -135
- package/dist/scaffold/users.js.map +0 -1
package/dist/commands/login.js
CHANGED
|
@@ -1,104 +1,234 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.loginCommand = loginCommand;
|
|
40
|
-
const commander_1 = require("commander");
|
|
41
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
-
const ora_1 = __importDefault(require("ora"));
|
|
43
|
-
const config_1 = require("../config");
|
|
44
|
-
async function prompt(questions) {
|
|
45
|
-
const { default: inquirer } = await Promise.resolve().then(() => __importStar(require('inquirer')));
|
|
46
|
-
return inquirer.prompt(questions);
|
|
1
|
+
/**
|
|
2
|
+
* `neetru login` — Device Code OAuth (RFC 8628).
|
|
3
|
+
*
|
|
4
|
+
* Sprint 1: substitui o paste manual de token por fluxo browser-aware.
|
|
5
|
+
*
|
|
6
|
+
* Steps:
|
|
7
|
+
* 1. POST {api}/api/v1/oauth/device/authorize → device_code, user_code,
|
|
8
|
+
* verification_uri, interval, expires_in.
|
|
9
|
+
* 2. Print user_code + abrir browser na verification_uri (best-effort).
|
|
10
|
+
* 3. Polling POST {api}/api/v1/oauth/device/token a cada `interval` s
|
|
11
|
+
* até receber access_token, slow_down (interval+5s) ou erro fatal.
|
|
12
|
+
* 4. Salvar token em ~/.config/neetru-cli/auth.json (chmod 0600).
|
|
13
|
+
* 5. Validar via /api/cli/v1/whoami pra mostrar identidade.
|
|
14
|
+
*
|
|
15
|
+
* Mantém `--token` legado pra CI: pula o flow e salva direto.
|
|
16
|
+
* Suporta `--json` pra ambientes scriptados (saída machine-readable).
|
|
17
|
+
*/
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import ora from 'ora';
|
|
20
|
+
import { spawn } from 'node:child_process';
|
|
21
|
+
import { config } from '../lib/config.js';
|
|
22
|
+
import { saveToken } from '../lib/auth.js';
|
|
23
|
+
import { apiRequest, CliApiError, CliNetworkError } from '../lib/api-client.js';
|
|
24
|
+
import { log } from '../utils/logger.js';
|
|
25
|
+
const TOKEN_PATTERN = /^nrt_[a-z0-9]{8,16}_[A-Za-z0-9_\-=]{20,64}$/;
|
|
26
|
+
const DEVICE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';
|
|
27
|
+
const POLL_TIMEOUT_MS = 10 * 60 * 1000; // 10min
|
|
28
|
+
function emitJson(obj) {
|
|
29
|
+
console.log(JSON.stringify(obj));
|
|
47
30
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
mask: '*',
|
|
67
|
-
validate: (v) => v.length >= 20 || 'API key parece inválida (muito curta)',
|
|
68
|
-
}]);
|
|
69
|
-
apiKey = key;
|
|
31
|
+
/**
|
|
32
|
+
* Best-effort cross-platform browser open. Falha silenciosamente — usuário
|
|
33
|
+
* sempre tem fallback de copiar/colar a URL.
|
|
34
|
+
*/
|
|
35
|
+
function openBrowser(url) {
|
|
36
|
+
try {
|
|
37
|
+
if (process.platform === 'win32') {
|
|
38
|
+
// Detached `start` via cmd.exe — empty title arg is required.
|
|
39
|
+
spawn('cmd', ['/c', 'start', '""', url], {
|
|
40
|
+
detached: true,
|
|
41
|
+
stdio: 'ignore',
|
|
42
|
+
windowsHide: true,
|
|
43
|
+
}).unref();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (process.platform === 'darwin') {
|
|
47
|
+
spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();
|
|
48
|
+
return;
|
|
70
49
|
}
|
|
71
|
-
|
|
50
|
+
spawn('xdg-open', [url], { detached: true, stdio: 'ignore' }).unref();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// ignore — caller já printou a URL.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function sleep(ms) {
|
|
57
|
+
return new Promise((res) => setTimeout(res, ms));
|
|
58
|
+
}
|
|
59
|
+
async function pollForToken(deviceCode, initialIntervalSec, expiresAtMs, json) {
|
|
60
|
+
let intervalMs = initialIntervalSec * 1000;
|
|
61
|
+
const spinner = json
|
|
62
|
+
? null
|
|
63
|
+
: ora({ text: 'Aguardando aprovação no browser…', color: 'blue' }).start();
|
|
64
|
+
while (Date.now() < expiresAtMs) {
|
|
65
|
+
await sleep(intervalMs);
|
|
72
66
|
try {
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
67
|
+
const result = await apiRequest('/api/v1/oauth/device/token', {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
body: {
|
|
70
|
+
grant_type: DEVICE_GRANT_TYPE,
|
|
71
|
+
device_code: deviceCode,
|
|
72
|
+
client_id: 'neetru-cli',
|
|
73
|
+
},
|
|
76
74
|
});
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
spinner?.succeed('Autorização concedida.');
|
|
76
|
+
return result.access_token;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof CliApiError) {
|
|
80
|
+
// Códigos RFC 8628.
|
|
81
|
+
if (error.code === 'authorization_pending') {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (error.code === 'slow_down') {
|
|
85
|
+
intervalMs += 5_000;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (error.code === 'access_denied') {
|
|
89
|
+
spinner?.fail('Autorização negada pelo usuário.');
|
|
90
|
+
throw new Error('access_denied');
|
|
81
91
|
}
|
|
82
|
-
|
|
92
|
+
if (error.code === 'expired_token') {
|
|
93
|
+
spinner?.fail('Código expirou. Reinicie `neetru login`.');
|
|
94
|
+
throw new Error('expired_token');
|
|
95
|
+
}
|
|
96
|
+
spinner?.fail(`Erro do servidor: ${error.code}`);
|
|
97
|
+
throw new Error(error.code);
|
|
98
|
+
}
|
|
99
|
+
if (error instanceof CliNetworkError) {
|
|
100
|
+
// Trata como transient — segue tentando até timeout.
|
|
101
|
+
continue;
|
|
83
102
|
}
|
|
84
|
-
|
|
85
|
-
|
|
103
|
+
spinner?.fail(error.message);
|
|
104
|
+
throw error;
|
|
86
105
|
}
|
|
87
|
-
|
|
88
|
-
|
|
106
|
+
}
|
|
107
|
+
spinner?.fail('Timeout aguardando aprovação.');
|
|
108
|
+
throw new Error('timeout');
|
|
109
|
+
}
|
|
110
|
+
export async function runLogin(opts = {}) {
|
|
111
|
+
const json = !!opts.json;
|
|
112
|
+
if (!json)
|
|
113
|
+
log.banner();
|
|
114
|
+
// ── Path legado: --token <nrt_...> pula o device flow.
|
|
115
|
+
if (opts.token) {
|
|
116
|
+
const token = opts.token.trim();
|
|
117
|
+
if (!TOKEN_PATTERN.test(token)) {
|
|
118
|
+
if (json)
|
|
119
|
+
emitJson({ ok: false, error: 'invalid_token_format' });
|
|
120
|
+
else
|
|
121
|
+
log.error('Token inválido. Formato esperado: nrt_<keyId>_<secret>');
|
|
89
122
|
process.exit(1);
|
|
90
123
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
124
|
+
try {
|
|
125
|
+
const me = await apiRequest('/api/cli/v1/whoami', { token });
|
|
126
|
+
const path = await saveToken(token, me.email);
|
|
127
|
+
// Compat: alguns comandos legados ainda leem do Conf.
|
|
128
|
+
config.set('neetruApiKey', token);
|
|
129
|
+
if (json) {
|
|
130
|
+
emitJson({ ok: true, email: me.email, role: me.role, path });
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
log.success(`Logado como ${chalk.bold(me.email)} (role: ${chalk.bold(me.role)})`);
|
|
134
|
+
log.dim(`Token salvo em ${path}`);
|
|
135
|
+
}
|
|
136
|
+
process.exit(0);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
handleFatalAuthError(err, json);
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// ── Device Code flow.
|
|
144
|
+
let authResp;
|
|
145
|
+
try {
|
|
146
|
+
authResp = await apiRequest('/api/v1/oauth/device/authorize', {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
body: { client_id: 'neetru-cli' },
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
if (json)
|
|
153
|
+
emitJson({ ok: false, error: 'authorize_failed', message: err.message });
|
|
154
|
+
else
|
|
155
|
+
log.error(`Falha ao iniciar login: ${err.message}`);
|
|
156
|
+
process.exit(2);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const verifyUrl = authResp.verification_uri_complete ?? authResp.verification_uri;
|
|
160
|
+
if (json) {
|
|
161
|
+
emitJson({
|
|
162
|
+
ok: true,
|
|
163
|
+
stage: 'awaiting_approval',
|
|
164
|
+
user_code: authResp.user_code,
|
|
165
|
+
verification_uri: authResp.verification_uri,
|
|
166
|
+
verification_uri_complete: authResp.verification_uri_complete ?? null,
|
|
167
|
+
expires_in: authResp.expires_in,
|
|
97
168
|
});
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
console.log(
|
|
101
|
-
|
|
102
|
-
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
console.log();
|
|
172
|
+
console.log(` ${chalk.dim('Código de verificação')}`);
|
|
173
|
+
console.log(` ${chalk.bold.cyan(authResp.user_code)}`);
|
|
174
|
+
console.log();
|
|
175
|
+
console.log(` ${chalk.dim('Verifique em')} ${chalk.underline(authResp.verification_uri)}`);
|
|
176
|
+
console.log();
|
|
177
|
+
}
|
|
178
|
+
openBrowser(verifyUrl);
|
|
179
|
+
const expiresAtMs = Date.now() + Math.min(authResp.expires_in * 1000, POLL_TIMEOUT_MS);
|
|
180
|
+
let accessToken;
|
|
181
|
+
try {
|
|
182
|
+
accessToken = await pollForToken(authResp.device_code, authResp.interval ?? 5, expiresAtMs, json);
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
const message = err.message;
|
|
186
|
+
if (json)
|
|
187
|
+
emitJson({ ok: false, error: message });
|
|
188
|
+
else
|
|
189
|
+
log.error(`Login falhou: ${message}`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Valida + persiste.
|
|
194
|
+
try {
|
|
195
|
+
const me = await apiRequest('/api/cli/v1/whoami', { token: accessToken });
|
|
196
|
+
const path = await saveToken(accessToken, me.email);
|
|
197
|
+
// Compat: legacy commands podem usar Conf — mantemos o token lá também.
|
|
198
|
+
config.set('neetruApiKey', accessToken);
|
|
199
|
+
if (json) {
|
|
200
|
+
emitJson({ ok: true, email: me.email, role: me.role, path });
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log();
|
|
204
|
+
log.success(`Logado como ${chalk.bold(me.email)} (role: ${chalk.bold(me.role)})`);
|
|
205
|
+
log.dim(`Token salvo em ${path}`);
|
|
206
|
+
}
|
|
207
|
+
process.exit(0);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
handleFatalAuthError(err, json);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function handleFatalAuthError(err, json) {
|
|
214
|
+
if (err instanceof CliApiError) {
|
|
215
|
+
if (json)
|
|
216
|
+
emitJson({ ok: false, status: err.status, error: err.code, message: err.message });
|
|
217
|
+
else
|
|
218
|
+
log.error(`Servidor retornou ${err.status}: ${err.message}`);
|
|
219
|
+
process.exit(err.status === 401 || err.status === 403 ? 1 : 2);
|
|
220
|
+
}
|
|
221
|
+
if (err instanceof CliNetworkError) {
|
|
222
|
+
if (json)
|
|
223
|
+
emitJson({ ok: false, error: 'network', message: err.message });
|
|
224
|
+
else
|
|
225
|
+
log.error(err.message);
|
|
226
|
+
process.exit(2);
|
|
227
|
+
}
|
|
228
|
+
if (json)
|
|
229
|
+
emitJson({ ok: false, error: 'unknown', message: err.message });
|
|
230
|
+
else
|
|
231
|
+
log.error(err.message);
|
|
232
|
+
process.exit(2);
|
|
103
233
|
}
|
|
104
234
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,aAAa,GAAG,6CAA6C,CAAC;AACpE,MAAM,iBAAiB,GAAG,8CAA8C,CAAC;AACzE,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ;AA6BhD,SAAS,QAAQ,CAAC,GAA4B;IAC5C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,8DAA8D;YAC9D,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE;gBACvC,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAClE,OAAO;QACT,CAAC;QACD,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,UAAkB,EAClB,kBAA0B,EAC1B,WAAmB,EACnB,IAAa;IAEb,IAAI,UAAU,GAAG,kBAAkB,GAAG,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7E,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QAChC,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,4BAA4B,EAC5B;gBACE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE;oBACJ,UAAU,EAAE,iBAAiB;oBAC7B,WAAW,EAAE,UAAU;oBACvB,SAAS,EAAE,YAAY;iBACxB;aACF,CACF,CAAC;YACF,OAAO,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC,YAAY,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,oBAAoB;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;oBAC3C,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC/B,UAAU,IAAI,KAAK,CAAC;oBACpB,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBACnC,OAAO,EAAE,IAAI,CAAC,kCAAkC,CAAC,CAAC;oBAClD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;gBACnC,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBACnC,OAAO,EAAE,IAAI,CAAC,0CAA0C,CAAC,CAAC;oBAC1D,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;gBACnC,CAAC;gBACD,OAAO,EAAE,IAAI,CAAC,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBACrC,qDAAqD;gBACrD,SAAS;YACX,CAAC;YACD,OAAO,EAAE,IAAI,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC/C,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAqB,EAAE;IACpD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAExB,wDAAwD;IACxD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI;gBAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;;gBAC5D,GAAG,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,UAAU,CAAiB,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;YAC9C,sDAAsD;YACtD,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClF,GAAG,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,OAAO;IACT,CAAC;IAED,uBAAuB;IACvB,IAAI,QAAiC,CAAC;IACtC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,UAAU,CACzB,gCAAgC,EAChC;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;SAClC,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,IAAI;YAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;;YACzF,GAAG,CAAC,KAAK,CAAC,2BAA4B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,yBAAyB,IAAI,QAAQ,CAAC,gBAAgB,CAAC;IAElF,IAAI,IAAI,EAAE,CAAC;QACT,QAAQ,CAAC;YACP,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,mBAAmB;YAC1B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;YAC3C,yBAAyB,EAAE,QAAQ,CAAC,yBAAyB,IAAI,IAAI;YACrE,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,SAAS,CAAC,CAAC;IAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,EAAE,eAAe,CAAC,CAAC;IAEvF,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,YAAY,CAC9B,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,QAAQ,IAAI,CAAC,EACtB,WAAW,EACX,IAAI,CACL,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,CAAC;QACvC,IAAI,IAAI;YAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;;YAC7C,GAAG,CAAC,KAAK,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,UAAU,CAAiB,oBAAoB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QACpD,wEAAwE;QACxE,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAExC,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClF,GAAG,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAY,EAAE,IAAa;IACvD,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI;YAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;;YACxF,GAAG,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;QACnC,IAAI,IAAI;YAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;;YACrE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,IAAI;QAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;;QAChF,GAAG,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runLogout(): Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru logout` — limpa credenciais locais.
|
|
3
|
+
*
|
|
4
|
+
* Sprint 1: arquivo canônico é ~/.config/neetru-cli/auth.json.
|
|
5
|
+
* Mantemos cleanup do Conf storage legado por compat com sessões antigas.
|
|
6
|
+
*/
|
|
7
|
+
import { config } from '../lib/config.js';
|
|
8
|
+
import { clearToken, getAuthFilePath } from '../lib/auth.js';
|
|
9
|
+
import { log } from '../utils/logger.js';
|
|
10
|
+
export async function runLogout() {
|
|
11
|
+
let removed = false;
|
|
12
|
+
try {
|
|
13
|
+
if (await clearToken())
|
|
14
|
+
removed = true;
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
log.warn(`Falha ao remover ${getAuthFilePath()}: ${err.message}`);
|
|
18
|
+
}
|
|
19
|
+
if (config.get('neetruApiKey')) {
|
|
20
|
+
config.delete('neetruApiKey');
|
|
21
|
+
removed = true;
|
|
22
|
+
}
|
|
23
|
+
if (removed)
|
|
24
|
+
log.success('Sessão local apagada.');
|
|
25
|
+
else
|
|
26
|
+
log.warn('Nenhuma sessão ativa.');
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,CAAC;QACH,IAAI,MAAM,UAAU,EAAE;YAAE,OAAO,GAAG,IAAI,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,oBAAoB,eAAe,EAAE,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO;QAAE,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;;QAC7C,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/commands/logs.d.ts
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
export interface LogsOptions {
|
|
2
|
+
clientId?: string;
|
|
3
|
+
follow?: boolean;
|
|
4
|
+
lines?: string;
|
|
5
|
+
since?: string;
|
|
6
|
+
level?: string;
|
|
7
|
+
/** v1.3 — filtrar por productId (corresponde a `logs/{productId}/...`). */
|
|
8
|
+
product?: string;
|
|
9
|
+
/** v1.3 — filtrar por channel (`stdout` | `stderr` | `app` etc). */
|
|
10
|
+
channel?: string;
|
|
11
|
+
/** v1.3 — buscar logs com `correlationId == <uuid>`. */
|
|
12
|
+
correlationId?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function runLogs(opts: LogsOptions): Promise<void>;
|