@neetru/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/LICENSE +21 -0
- package/README.md +197 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +150 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/deploy.d.ts +3 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +196 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/generate-types.d.ts +3 -0
- package/dist/commands/generate-types.d.ts.map +1 -0
- package/dist/commands/generate-types.js +150 -0
- package/dist/commands/generate-types.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +149 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +104 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +114 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/open.d.ts +3 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +91 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +99 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +99 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +33 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/scaffold/auth.d.ts +3 -0
- package/dist/scaffold/auth.d.ts.map +1 -0
- package/dist/scaffold/auth.js +228 -0
- package/dist/scaffold/auth.js.map +1 -0
- package/dist/scaffold/billing.d.ts +3 -0
- package/dist/scaffold/billing.d.ts.map +1 -0
- package/dist/scaffold/billing.js +184 -0
- package/dist/scaffold/billing.js.map +1 -0
- package/dist/scaffold/usage.d.ts +3 -0
- package/dist/scaffold/usage.d.ts.map +1 -0
- package/dist/scaffold/usage.js +173 -0
- package/dist/scaffold/usage.js.map +1 -0
- package/dist/scaffold/users.d.ts +3 -0
- package/dist/scaffold/users.d.ts.map +1 -0
- package/dist/scaffold/users.js +135 -0
- package/dist/scaffold/users.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
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.generateTypesCommand = generateTypesCommand;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const ora_1 = __importDefault(require("ora"));
|
|
43
|
+
const fs = __importStar(require("fs-extra"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const config_1 = require("../config");
|
|
46
|
+
function generateTypesCommand() {
|
|
47
|
+
const cmd = new commander_1.Command('generate-types');
|
|
48
|
+
cmd
|
|
49
|
+
.alias('gen')
|
|
50
|
+
.description('Sincroniza tipos TypeScript do Neetru Core (planos, features, entitlements)')
|
|
51
|
+
.option('--out <file>', 'Arquivo de saída', 'src/lib/neetru/neetru-types.generated.ts')
|
|
52
|
+
.action(async (options) => {
|
|
53
|
+
let config;
|
|
54
|
+
try {
|
|
55
|
+
config = (0, config_1.requireConfig)();
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
console.error(chalk_1.default.red(e.message));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
const spinner = (0, ora_1.default)('Buscando schema do Core...').start();
|
|
62
|
+
try {
|
|
63
|
+
// Try to fetch plan/feature definitions from Core
|
|
64
|
+
const res = await fetch(`${config.coreUrl}/api/v1/schema?clientId=${encodeURIComponent(config.clientId)}`, { signal: AbortSignal.timeout(8000) });
|
|
65
|
+
let planIds = ['starter', 'pro', 'enterprise'];
|
|
66
|
+
let featureKeys = ['api_calls', 'users', 'storage_gb', 'custom_domain'];
|
|
67
|
+
if (res.ok) {
|
|
68
|
+
const schema = await res.json();
|
|
69
|
+
if (schema.plans)
|
|
70
|
+
planIds = schema.plans.map((p) => p.id);
|
|
71
|
+
if (schema.features)
|
|
72
|
+
featureKeys = schema.features;
|
|
73
|
+
spinner.succeed('Schema obtido do Core');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
spinner.warn('Core offline — gerando tipos com defaults');
|
|
77
|
+
}
|
|
78
|
+
// Generate TypeScript types
|
|
79
|
+
const content = generateTypeFile(config.coreUrl, config.clientId, planIds, featureKeys);
|
|
80
|
+
const outPath = path.resolve(options.out);
|
|
81
|
+
fs.ensureDirSync(path.dirname(outPath));
|
|
82
|
+
fs.writeFileSync(outPath, content, 'utf-8');
|
|
83
|
+
console.log(chalk_1.default.green(`\n✓ Tipos gerados: ${options.out}`));
|
|
84
|
+
console.log(chalk_1.default.dim(` Planos: ${planIds.join(', ')}`));
|
|
85
|
+
console.log(chalk_1.default.dim(` Features: ${featureKeys.join(', ')}`));
|
|
86
|
+
console.log('');
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
spinner.fail(`Erro: ${err.message}`);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return cmd;
|
|
94
|
+
}
|
|
95
|
+
function generateTypeFile(coreUrl, clientId, planIds, featureKeys) {
|
|
96
|
+
const now = new Date().toISOString();
|
|
97
|
+
const planUnion = planIds.map((p) => `'${p}'`).join(' | ');
|
|
98
|
+
const featureUnion = featureKeys.map((f) => `'${f}'`).join(' | ');
|
|
99
|
+
return `/**
|
|
100
|
+
* Tipos Neetru gerados automaticamente por \`neetru generate-types\`
|
|
101
|
+
* Gerado em: ${now}
|
|
102
|
+
* Core: ${coreUrl}
|
|
103
|
+
* Client: ${clientId}
|
|
104
|
+
*
|
|
105
|
+
* NÃO editar manualmente — re-gere com \`neetru gen\`
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
// ─── Planos ────────────────────────────────────────────────────────────────
|
|
109
|
+
|
|
110
|
+
export type NeetruPlanId = ${planUnion};
|
|
111
|
+
|
|
112
|
+
export const NEETRU_PLAN_IDS = [${planIds.map((p) => `'${p}'`).join(', ')}] as const satisfies NeetruPlanId[];
|
|
113
|
+
|
|
114
|
+
// ─── Features / Entitlements ───────────────────────────────────────────────
|
|
115
|
+
|
|
116
|
+
export type NeetruFeatureKey = ${featureUnion};
|
|
117
|
+
|
|
118
|
+
export const NEETRU_FEATURE_KEYS = [${featureKeys.map((f) => `'${f}'`).join(', ')}] as const satisfies NeetruFeatureKey[];
|
|
119
|
+
|
|
120
|
+
// ─── Tipos base ────────────────────────────────────────────────────────────
|
|
121
|
+
|
|
122
|
+
export interface NeetruSubscription {
|
|
123
|
+
id: string;
|
|
124
|
+
status: 'active' | 'cancelled' | 'past_due' | 'trialing';
|
|
125
|
+
planId: NeetruPlanId;
|
|
126
|
+
planName: string;
|
|
127
|
+
priceMonthly: number;
|
|
128
|
+
currentPeriodEnd: string;
|
|
129
|
+
autoRenew: boolean;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface NeetruEntitlement {
|
|
133
|
+
featureKey: NeetruFeatureKey;
|
|
134
|
+
allowed: boolean;
|
|
135
|
+
limit?: number;
|
|
136
|
+
used?: number;
|
|
137
|
+
remaining?: number;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export type NeetruEntitlements = {
|
|
141
|
+
[K in NeetruFeatureKey]?: NeetruEntitlement;
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// ─── Helper types ──────────────────────────────────────────────────────────
|
|
145
|
+
|
|
146
|
+
export type HasPlan<P extends NeetruPlanId> = { planId: P };
|
|
147
|
+
export type HasFeature<F extends NeetruFeatureKey> = { [K in F]: NeetruEntitlement & { allowed: true } };
|
|
148
|
+
`;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=generate-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-types.js","sourceRoot":"","sources":["../../src/commands/generate-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,WAAW,IAAI,OAAO,CA0GrC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
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.initCommand = initCommand;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const ora_1 = __importDefault(require("ora"));
|
|
43
|
+
const fs = __importStar(require("fs-extra"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const config_1 = require("../config");
|
|
46
|
+
// Dynamically import inquirer to avoid top-level await issues
|
|
47
|
+
async function prompt(questions) {
|
|
48
|
+
const { default: inquirer } = await Promise.resolve().then(() => __importStar(require('inquirer')));
|
|
49
|
+
return inquirer.prompt(questions);
|
|
50
|
+
}
|
|
51
|
+
function initCommand() {
|
|
52
|
+
const cmd = new commander_1.Command('init');
|
|
53
|
+
cmd
|
|
54
|
+
.description('Inicializa a integração Neetru no projeto atual')
|
|
55
|
+
.option('--core-url <url>', 'URL do Neetru Core (ex: https://core.neetru.com)')
|
|
56
|
+
.option('--client-id <id>', 'OAuth Client ID fornecido pelo Neetru Core')
|
|
57
|
+
.option('--yes', 'Pular confirmações interativas')
|
|
58
|
+
.action(async (options) => {
|
|
59
|
+
console.log('\n' + chalk_1.default.bold.cyan('🚀 Neetru SDK — Inicialização'));
|
|
60
|
+
console.log(chalk_1.default.dim('Conectando seu SaaS ao Neetru Core\n'));
|
|
61
|
+
// Check if already initialized
|
|
62
|
+
if (fs.existsSync('neetru.json') && !options.yes) {
|
|
63
|
+
const { overwrite } = await prompt([{
|
|
64
|
+
type: 'confirm',
|
|
65
|
+
name: 'overwrite',
|
|
66
|
+
message: chalk_1.default.yellow('neetru.json já existe. Sobrescrever?'),
|
|
67
|
+
default: false,
|
|
68
|
+
}]);
|
|
69
|
+
if (!overwrite) {
|
|
70
|
+
console.log(chalk_1.default.dim('Cancelado.'));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Collect info interactively if not provided via flags
|
|
75
|
+
const coreUrl = options.coreUrl ?? (await prompt([{
|
|
76
|
+
type: 'input',
|
|
77
|
+
name: 'coreUrl',
|
|
78
|
+
message: 'URL do Neetru Core:',
|
|
79
|
+
default: 'https://core.neetru.com',
|
|
80
|
+
validate: (v) => v.startsWith('http') || 'URL inválida',
|
|
81
|
+
}])).coreUrl;
|
|
82
|
+
const clientId = options.clientId ?? (await prompt([{
|
|
83
|
+
type: 'input',
|
|
84
|
+
name: 'clientId',
|
|
85
|
+
message: 'OAuth Client ID (do painel Neetru → Workspaces → Credenciais):',
|
|
86
|
+
validate: (v) => v.length > 0 || 'Client ID obrigatório',
|
|
87
|
+
}])).clientId;
|
|
88
|
+
const projectName = path.basename(process.cwd());
|
|
89
|
+
const { features } = await prompt([{
|
|
90
|
+
type: 'checkbox',
|
|
91
|
+
name: 'features',
|
|
92
|
+
message: 'Quais integrações você precisa?',
|
|
93
|
+
choices: [
|
|
94
|
+
{ name: 'auth — Login com OAuth Neetru (SSO)', value: 'auth', checked: true },
|
|
95
|
+
{ name: 'billing — Assinaturas e planos', value: 'billing', checked: true },
|
|
96
|
+
{ name: 'usage — Metered billing (reporte de uso)', value: 'usage' },
|
|
97
|
+
{ name: 'users — API de usuários Neetru', value: 'users' },
|
|
98
|
+
],
|
|
99
|
+
}]);
|
|
100
|
+
// Validate connection
|
|
101
|
+
const spinner = (0, ora_1.default)('Verificando conexão com o Core...').start();
|
|
102
|
+
try {
|
|
103
|
+
const res = await fetch(`${coreUrl}/api/health`, { signal: AbortSignal.timeout(5000) });
|
|
104
|
+
if (res.ok) {
|
|
105
|
+
spinner.succeed('Conexão verificada');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
spinner.warn(`Core respondeu com status ${res.status} — continuando mesmo assim`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
spinner.warn('Não foi possível verificar a conexão — continuando offline');
|
|
113
|
+
}
|
|
114
|
+
// Write neetru.json
|
|
115
|
+
(0, config_1.writeLocalConfig)({
|
|
116
|
+
coreUrl,
|
|
117
|
+
clientId,
|
|
118
|
+
projectName,
|
|
119
|
+
features,
|
|
120
|
+
createdAt: new Date().toISOString(),
|
|
121
|
+
});
|
|
122
|
+
// Write .env.example entries
|
|
123
|
+
const envPath = '.env.example';
|
|
124
|
+
const envEntries = [
|
|
125
|
+
'',
|
|
126
|
+
'# Neetru Core',
|
|
127
|
+
`NEETRU_CORE_URL=${coreUrl}`,
|
|
128
|
+
`NEETRU_CLIENT_ID=${clientId}`,
|
|
129
|
+
'NEETRU_CLIENT_SECRET=your_client_secret_here',
|
|
130
|
+
...(features.includes('billing') ? ['NEETRU_WEBHOOK_SECRET=your_webhook_secret_here'] : []),
|
|
131
|
+
].join('\n');
|
|
132
|
+
if (fs.existsSync(envPath)) {
|
|
133
|
+
fs.appendFileSync(envPath, envEntries);
|
|
134
|
+
console.log(chalk_1.default.dim(` → Entradas adicionadas ao ${envPath}`));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
fs.writeFileSync(envPath, envEntries.trimStart());
|
|
138
|
+
console.log(chalk_1.default.dim(` → ${envPath} criado`));
|
|
139
|
+
}
|
|
140
|
+
console.log('\n' + chalk_1.default.green.bold('✓ neetru.json criado'));
|
|
141
|
+
console.log(chalk_1.default.dim('\nPróximos passos:'));
|
|
142
|
+
features.forEach((f) => {
|
|
143
|
+
console.log(chalk_1.default.dim(` neetru add ${f}`));
|
|
144
|
+
});
|
|
145
|
+
console.log('');
|
|
146
|
+
});
|
|
147
|
+
return cmd;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.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;AAUpC,wBAAgB,YAAY,IAAI,OAAO,CAgEtC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
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);
|
|
47
|
+
}
|
|
48
|
+
function loginCommand() {
|
|
49
|
+
const cmd = new commander_1.Command('login');
|
|
50
|
+
cmd
|
|
51
|
+
.description('Autentica o CLI com sua API key do Neetru Core')
|
|
52
|
+
.option('--core-url <url>', 'URL do Neetru Core', 'https://core.neetru.com')
|
|
53
|
+
.option('--api-key <key>', 'API key (opcional, será solicitada interativamente se omitida)')
|
|
54
|
+
.action(async (options) => {
|
|
55
|
+
console.log('\n' + chalk_1.default.bold.cyan('🔐 Neetru CLI — Login'));
|
|
56
|
+
console.log(chalk_1.default.dim('Autentique seu CLI para chamar a API do Neetru Core\n'));
|
|
57
|
+
const coreUrl = options.coreUrl;
|
|
58
|
+
let apiKey = options.apiKey;
|
|
59
|
+
if (!apiKey) {
|
|
60
|
+
console.log(chalk_1.default.dim('Obtenha sua API key em:'));
|
|
61
|
+
console.log(chalk_1.default.cyan(` ${coreUrl}/admin/credentials\n`));
|
|
62
|
+
const { key } = await prompt([{
|
|
63
|
+
type: 'password',
|
|
64
|
+
name: 'key',
|
|
65
|
+
message: 'API key:',
|
|
66
|
+
mask: '*',
|
|
67
|
+
validate: (v) => v.length >= 20 || 'API key parece inválida (muito curta)',
|
|
68
|
+
}]);
|
|
69
|
+
apiKey = key;
|
|
70
|
+
}
|
|
71
|
+
const spinner = (0, ora_1.default)('Verificando credenciais...').start();
|
|
72
|
+
try {
|
|
73
|
+
const res = await fetch(`${coreUrl}/api/v1/cli/whoami`, {
|
|
74
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
75
|
+
signal: AbortSignal.timeout(8000),
|
|
76
|
+
});
|
|
77
|
+
if (!res.ok) {
|
|
78
|
+
spinner.fail(`Falha de autenticação (HTTP ${res.status})`);
|
|
79
|
+
if (res.status === 401) {
|
|
80
|
+
console.log(chalk_1.default.dim(' → API key inválida ou expirada'));
|
|
81
|
+
}
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
const data = await res.json();
|
|
85
|
+
spinner.succeed(`Autenticado como ${chalk_1.default.cyan(data.email ?? 'usuário')} (${data.role ?? 'role desconhecida'})`);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
spinner.fail(`Erro: ${e.message}`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
// Save to global config
|
|
92
|
+
const existing = (0, config_1.readGlobalConfig)();
|
|
93
|
+
(0, config_1.writeGlobalConfig)({
|
|
94
|
+
...existing,
|
|
95
|
+
coreUrl,
|
|
96
|
+
clientSecret: apiKey,
|
|
97
|
+
});
|
|
98
|
+
console.log('\n' + chalk_1.default.green.bold('✓ Login efetuado'));
|
|
99
|
+
console.log(chalk_1.default.dim('Credenciais salvas em ~/.neetru/config.json'));
|
|
100
|
+
console.log('');
|
|
101
|
+
});
|
|
102
|
+
return cmd;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,WAAW,IAAI,OAAO,CAqGrC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logsCommand = logsCommand;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const config_1 = require("../config");
|
|
11
|
+
function logsCommand() {
|
|
12
|
+
const cmd = new commander_1.Command('logs');
|
|
13
|
+
cmd
|
|
14
|
+
.description('Visualiza logs do workspace em tempo real')
|
|
15
|
+
.option('-f, --follow', 'Tail contínuo (poll a cada 5s)')
|
|
16
|
+
.option('-n, --lines <count>', 'Número de linhas a buscar', '50')
|
|
17
|
+
.option('--since <duration>', 'Logs desde N minutos atrás (ex: 30m, 2h)', '15m')
|
|
18
|
+
.option('--level <level>', 'Filtrar por nível: info | warn | error | debug')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
let config;
|
|
21
|
+
try {
|
|
22
|
+
config = (0, config_1.requireConfig)();
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
console.error(chalk_1.default.red(e.message));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const global = (0, config_1.readGlobalConfig)();
|
|
29
|
+
const apiKey = global.clientSecret ?? process.env.NEETRU_CLI_API_KEY;
|
|
30
|
+
if (!apiKey) {
|
|
31
|
+
console.error(chalk_1.default.red('Não autenticado. Execute neetru login primeiro.'));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const lines = parseInt(options.lines, 10);
|
|
35
|
+
const sinceMs = parseDuration(options.since);
|
|
36
|
+
const fetchLogs = async (afterTs) => {
|
|
37
|
+
const params = new URLSearchParams({
|
|
38
|
+
clientId: config.clientId,
|
|
39
|
+
limit: String(lines),
|
|
40
|
+
});
|
|
41
|
+
if (afterTs)
|
|
42
|
+
params.set('after', afterTs);
|
|
43
|
+
else
|
|
44
|
+
params.set('since', String(Date.now() - sinceMs));
|
|
45
|
+
if (options.level)
|
|
46
|
+
params.set('level', options.level);
|
|
47
|
+
const res = await fetch(`${config.coreUrl}/api/v1/cli/logs?${params.toString()}`, {
|
|
48
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
49
|
+
signal: AbortSignal.timeout(10000),
|
|
50
|
+
});
|
|
51
|
+
if (!res.ok) {
|
|
52
|
+
throw new Error(`HTTP ${res.status}`);
|
|
53
|
+
}
|
|
54
|
+
const data = await res.json();
|
|
55
|
+
return data.logs ?? [];
|
|
56
|
+
};
|
|
57
|
+
const printLog = (log) => {
|
|
58
|
+
const ts = new Date(log.timestamp).toLocaleTimeString('pt-BR');
|
|
59
|
+
const levelColor = {
|
|
60
|
+
info: chalk_1.default.blue,
|
|
61
|
+
warn: chalk_1.default.yellow,
|
|
62
|
+
error: chalk_1.default.red,
|
|
63
|
+
debug: chalk_1.default.dim,
|
|
64
|
+
}[log.level] ?? chalk_1.default.white;
|
|
65
|
+
console.log(`${chalk_1.default.dim(ts)} ${levelColor(log.level.toUpperCase().padEnd(5))} ${chalk_1.default.cyan(log.source.padEnd(20))} ${log.message}`);
|
|
66
|
+
};
|
|
67
|
+
// Initial fetch
|
|
68
|
+
const spinner = (0, ora_1.default)('Buscando logs...').start();
|
|
69
|
+
let initialLogs;
|
|
70
|
+
try {
|
|
71
|
+
initialLogs = await fetchLogs();
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
spinner.fail(`Erro: ${e.message}`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
spinner.stop();
|
|
78
|
+
if (initialLogs.length === 0) {
|
|
79
|
+
console.log(chalk_1.default.dim('Nenhum log encontrado nos últimos ' + options.since));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
initialLogs.forEach(printLog);
|
|
83
|
+
}
|
|
84
|
+
if (!options.follow)
|
|
85
|
+
return;
|
|
86
|
+
// Tail mode
|
|
87
|
+
console.log(chalk_1.default.dim('\n--- Tail mode (Ctrl+C para sair) ---'));
|
|
88
|
+
let lastTimestamp = initialLogs.at(-1)?.timestamp ?? new Date().toISOString();
|
|
89
|
+
const poll = async () => {
|
|
90
|
+
try {
|
|
91
|
+
const newLogs = await fetchLogs(lastTimestamp);
|
|
92
|
+
if (newLogs.length > 0) {
|
|
93
|
+
newLogs.forEach(printLog);
|
|
94
|
+
lastTimestamp = newLogs.at(-1).timestamp;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
console.error(chalk_1.default.dim(`[poll error: ${e.message}]`));
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
setInterval(poll, 5000);
|
|
102
|
+
});
|
|
103
|
+
return cmd;
|
|
104
|
+
}
|
|
105
|
+
function parseDuration(s) {
|
|
106
|
+
const match = s.match(/^(\d+)([smhd])$/);
|
|
107
|
+
if (!match)
|
|
108
|
+
return 15 * 60000;
|
|
109
|
+
const n = parseInt(match[1], 10);
|
|
110
|
+
const unit = match[2];
|
|
111
|
+
const mult = unit === 's' ? 1000 : unit === 'm' ? 60000 : unit === 'h' ? 3600000 : 86400000;
|
|
112
|
+
return n * mult;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,WAAW,IAAI,OAAO,CAuCrC"}
|