@neetru/cli 1.0.1 → 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/add.js
CHANGED
|
@@ -1,150 +1,77 @@
|
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
const auth_1 = require("../scaffold/auth");
|
|
47
|
-
const billing_1 = require("../scaffold/billing");
|
|
48
|
-
const usage_1 = require("../scaffold/usage");
|
|
49
|
-
const users_1 = require("../scaffold/users");
|
|
50
|
-
const FEATURES = {
|
|
51
|
-
auth: {
|
|
52
|
-
description: 'OAuth 2.0 / OIDC com Neetru Core (login, callback, session)',
|
|
53
|
-
scaffold: auth_1.scaffoldAuth,
|
|
54
|
-
},
|
|
55
|
-
billing: {
|
|
56
|
-
description: 'Client de assinaturas e planos via Neetru API',
|
|
57
|
-
scaffold: billing_1.scaffoldBilling,
|
|
58
|
-
},
|
|
59
|
-
usage: {
|
|
60
|
-
description: 'Metered billing — reporte de eventos de uso',
|
|
61
|
-
scaffold: usage_1.scaffoldUsage,
|
|
62
|
-
},
|
|
63
|
-
users: {
|
|
64
|
-
description: 'API de usuários Neetru (perfil, preferências)',
|
|
65
|
-
scaffold: users_1.scaffoldUsers,
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
function addCommand() {
|
|
69
|
-
const cmd = new commander_1.Command('add');
|
|
70
|
-
cmd
|
|
71
|
-
.description('Adiciona uma integração Neetru ao projeto')
|
|
72
|
-
.argument('<feature>', `Feature a adicionar: ${Object.keys(FEATURES).join(' | ')}`)
|
|
73
|
-
.option('--out-dir <dir>', 'Diretório de saída dos arquivos gerados', 'src/lib/neetru')
|
|
74
|
-
.option('--framework <name>', 'Framework do projeto (nextjs | express | fastify | plain)', 'nextjs')
|
|
75
|
-
.action(async (feature, options) => {
|
|
76
|
-
const featureDef = FEATURES[feature];
|
|
77
|
-
if (!featureDef) {
|
|
78
|
-
console.error(chalk_1.default.red(`Feature desconhecida: ${feature}`));
|
|
79
|
-
console.log(chalk_1.default.dim(`Disponíveis: ${Object.keys(FEATURES).join(', ')}`));
|
|
80
|
-
process.exit(1);
|
|
81
|
-
}
|
|
82
|
-
let config;
|
|
83
|
-
try {
|
|
84
|
-
config = (0, config_1.requireConfig)();
|
|
85
|
-
}
|
|
86
|
-
catch (e) {
|
|
87
|
-
console.error(chalk_1.default.red(e.message));
|
|
88
|
-
process.exit(1);
|
|
89
|
-
}
|
|
90
|
-
// Check if feature already added
|
|
91
|
-
if (config.features.includes(feature)) {
|
|
92
|
-
console.log(chalk_1.default.yellow(`${feature} já está listado em neetru.json`));
|
|
1
|
+
/**
|
|
2
|
+
* `neetru add <feature>` — copia um template em `cli/templates/{feature}/*`
|
|
3
|
+
* para `src/lib/neetru/{feature}/*` no projeto atual.
|
|
4
|
+
*
|
|
5
|
+
* Features suportadas: `auth`, `billing`, `usage`, `users`, `support`.
|
|
6
|
+
*
|
|
7
|
+
* Não sobrescreve arquivos existentes — caller deve remover/editar manualmente
|
|
8
|
+
* antes de rodar add de novo no mesmo feature.
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'node:fs/promises';
|
|
11
|
+
import * as fsSync from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
import { log } from '../utils/logger.js';
|
|
15
|
+
const SUPPORTED = ['auth', 'billing', 'usage', 'users', 'support'];
|
|
16
|
+
function isSupported(feature) {
|
|
17
|
+
return SUPPORTED.includes(feature);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve diretório de templates. Em produção (instalado globalmente) o dir
|
|
21
|
+
* fica em `cli/templates` relativo ao binário. Em dev (workspace local), o
|
|
22
|
+
* mesmo path resolve corretamente.
|
|
23
|
+
*/
|
|
24
|
+
function resolveTemplatesDir() {
|
|
25
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
26
|
+
const __dirname = path.dirname(__filename);
|
|
27
|
+
// dist/commands/add.js → ../../templates (cli/dist/commands → cli/templates)
|
|
28
|
+
return path.resolve(__dirname, '../../templates');
|
|
29
|
+
}
|
|
30
|
+
async function copyDir(srcDir, destDir, force) {
|
|
31
|
+
let copied = 0;
|
|
32
|
+
let skipped = 0;
|
|
33
|
+
const entries = await fs.readdir(srcDir, { withFileTypes: true });
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
36
|
+
const destPath = path.join(destDir, entry.name);
|
|
37
|
+
if (entry.isDirectory()) {
|
|
38
|
+
await fs.mkdir(destPath, { recursive: true });
|
|
39
|
+
const r = await copyDir(srcPath, destPath, force);
|
|
40
|
+
copied += r.copied;
|
|
41
|
+
skipped += r.skipped;
|
|
93
42
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
console.log(chalk_1.default.dim('\nArquivos gerados:'));
|
|
101
|
-
createdFiles.forEach((f) => console.log(chalk_1.default.dim(` ${f}`)));
|
|
102
|
-
// Update neetru.json features list
|
|
103
|
-
if (!config.features.includes(feature)) {
|
|
104
|
-
config.features.push(feature);
|
|
105
|
-
const { writeLocalConfig } = await Promise.resolve().then(() => __importStar(require('../config')));
|
|
106
|
-
writeLocalConfig(config);
|
|
43
|
+
else {
|
|
44
|
+
const exists = fsSync.existsSync(destPath);
|
|
45
|
+
if (exists && !force) {
|
|
46
|
+
log.warn(`Skip (existe): ${path.relative(process.cwd(), destPath)}`);
|
|
47
|
+
skipped++;
|
|
48
|
+
continue;
|
|
107
49
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
console.log('');
|
|
50
|
+
await fs.copyFile(srcPath, destPath);
|
|
51
|
+
log.success(`+ ${path.relative(process.cwd(), destPath)}`);
|
|
52
|
+
copied++;
|
|
112
53
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
process.exit(1);
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
return cmd;
|
|
54
|
+
}
|
|
55
|
+
return { copied, skipped };
|
|
119
56
|
}
|
|
120
|
-
function
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
break;
|
|
134
|
-
case 'billing':
|
|
135
|
-
console.log(chalk_1.default.dim(` 1. Adicione NEETRU_CLIENT_ID às env vars`));
|
|
136
|
-
console.log(chalk_1.default.dim(` 2. Use neetruBilling.getSubscription() para verificar plano ativo`));
|
|
137
|
-
console.log(chalk_1.default.dim(` 3. Use neetruBilling.checkEntitlement() para feature flags`));
|
|
138
|
-
break;
|
|
139
|
-
case 'usage':
|
|
140
|
-
console.log(chalk_1.default.dim(` 1. Inicialize o UsageReporter com seu clientId`));
|
|
141
|
-
console.log(chalk_1.default.dim(` 2. Chame reporter.track(eventType, quantity) nos pontos de uso`));
|
|
142
|
-
console.log(chalk_1.default.dim(` 3. Eventos são enviados em batch a cada 60s automaticamente`));
|
|
143
|
-
break;
|
|
144
|
-
case 'users':
|
|
145
|
-
console.log(chalk_1.default.dim(` 1. Use neetruUsers.getProfile(token) para buscar dados do usuário`));
|
|
146
|
-
console.log(chalk_1.default.dim(` 2. O token vem do fluxo OAuth (neetru add auth)`));
|
|
147
|
-
break;
|
|
57
|
+
export async function runAdd(opts) {
|
|
58
|
+
const { feature, cwd = process.cwd(), force = false } = opts;
|
|
59
|
+
if (!isSupported(feature)) {
|
|
60
|
+
log.error(`Feature "${feature}" não suportada. Disponíveis: ${SUPPORTED.join(', ')}.`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const templatesDir = resolveTemplatesDir();
|
|
65
|
+
const srcDir = path.join(templatesDir, feature);
|
|
66
|
+
if (!fsSync.existsSync(srcDir)) {
|
|
67
|
+
log.error(`Template "${feature}" não encontrado em ${templatesDir}.`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
return;
|
|
148
70
|
}
|
|
71
|
+
const destDir = path.join(cwd, 'src', 'lib', 'neetru', feature);
|
|
72
|
+
await fs.mkdir(destDir, { recursive: true });
|
|
73
|
+
const { copied, skipped } = await copyDir(srcDir, destDir, force);
|
|
74
|
+
log.info(`Concluído: ${copied} criados, ${skipped} pulados.`);
|
|
75
|
+
log.dim(`Próximo passo: configure NEETRU_API_KEY/NEETRU_PRODUCT_ID em .env.local.`);
|
|
149
76
|
}
|
|
150
77
|
//# sourceMappingURL=add.js.map
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as readline from 'readline/promises';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { chat } from '../lib/ai/orchestrator.js';
|
|
4
|
+
import { log } from '../utils/logger.js';
|
|
5
|
+
const PROMPT_PREFIX = chalk.hex('#1E90FF').bold(' › ');
|
|
6
|
+
const ASSISTANT_PREFIX = chalk.dim(' ◆ ');
|
|
7
|
+
const HELP_TEXT = `
|
|
8
|
+
Comandos especiais:
|
|
9
|
+
/sair /exit encerrar sessão
|
|
10
|
+
/limpar /clear limpar histórico de contexto
|
|
11
|
+
/modelo <nome> trocar modelo (claude | openai | gemini | auto)
|
|
12
|
+
/help mostrar este texto
|
|
13
|
+
`.trim();
|
|
14
|
+
export async function runAiRepl(opts = {}) {
|
|
15
|
+
log.banner();
|
|
16
|
+
log.info('Assistente Neetru — contexto da plataforma carregado.');
|
|
17
|
+
log.info('Digite /help para ver comandos. /sair para encerrar.');
|
|
18
|
+
log.separator();
|
|
19
|
+
console.log();
|
|
20
|
+
const rl = readline.createInterface({
|
|
21
|
+
input: process.stdin,
|
|
22
|
+
output: process.stdout,
|
|
23
|
+
terminal: true,
|
|
24
|
+
});
|
|
25
|
+
const history = [];
|
|
26
|
+
let currentModel = opts.model ?? 'auto';
|
|
27
|
+
let running = true;
|
|
28
|
+
rl.on('close', () => {
|
|
29
|
+
running = false;
|
|
30
|
+
});
|
|
31
|
+
while (running) {
|
|
32
|
+
let input;
|
|
33
|
+
try {
|
|
34
|
+
input = (await rl.question(PROMPT_PREFIX)).trim();
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
break; // EOF / SIGINT
|
|
38
|
+
}
|
|
39
|
+
if (!input)
|
|
40
|
+
continue;
|
|
41
|
+
// Comandos internos
|
|
42
|
+
if (input === '/sair' || input === '/exit') {
|
|
43
|
+
log.dim('Encerrando sessão.');
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
if (input === '/limpar' || input === '/clear') {
|
|
47
|
+
history.length = 0;
|
|
48
|
+
log.success('Histórico limpo.');
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (input === '/help') {
|
|
52
|
+
console.log(HELP_TEXT);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (input.startsWith('/modelo ') || input.startsWith('/model ')) {
|
|
56
|
+
const m = input.split(' ')[1];
|
|
57
|
+
if (['claude', 'openai', 'gemini', 'auto'].includes(m)) {
|
|
58
|
+
currentModel = m;
|
|
59
|
+
log.success(`Modelo alterado para: ${m}`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
log.warn('Modelos disponíveis: claude | openai | gemini | auto');
|
|
63
|
+
}
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
history.push({ role: 'user', content: input });
|
|
67
|
+
console.log();
|
|
68
|
+
process.stdout.write(ASSISTANT_PREFIX);
|
|
69
|
+
let fullResponse = '';
|
|
70
|
+
try {
|
|
71
|
+
fullResponse = await chat(history, (chunk) => log.stream(chunk), currentModel);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
log.newline();
|
|
75
|
+
log.error(err?.message ?? 'Erro na chamada ao modelo.');
|
|
76
|
+
history.pop(); // remove mensagem do usuário que falhou
|
|
77
|
+
console.log();
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
log.newline();
|
|
81
|
+
console.log();
|
|
82
|
+
if (fullResponse) {
|
|
83
|
+
history.push({ role: 'assistant', content: fullResponse });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
rl.close();
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type Shell = 'bash' | 'zsh' | 'pwsh';
|
|
2
|
+
export declare const TOP_LEVEL_COMMANDS: readonly ["ai", "init", "config", "login", "logout", "whoami", "build", "deploy", "status", "logs", "validate", "open", "publish", "add", "mocks", "env", "db", "fn", "promote", "doctor", "upgrade", "autocomplete"];
|
|
3
|
+
export interface AutocompleteOptions {
|
|
4
|
+
shell?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function generateAutocompleteScript(shell: Shell): string;
|
|
7
|
+
export declare function runAutocomplete(shellArg: string | undefined, _opts?: AutocompleteOptions): Promise<void>;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru autocomplete <bash|zsh|pwsh>` — gera script de shell completion.
|
|
3
|
+
*
|
|
4
|
+
* Sprint 12 v2.0. Implementação minimalista — gera script estático com lista
|
|
5
|
+
* de subcomandos top-level. Usuário cola na config do shell.
|
|
6
|
+
*
|
|
7
|
+
* Bash: neetru autocomplete bash >> ~/.bashrc
|
|
8
|
+
* Zsh: neetru autocomplete zsh >> ~/.zshrc
|
|
9
|
+
* PWSH: neetru autocomplete pwsh >> $PROFILE
|
|
10
|
+
*
|
|
11
|
+
* Stable subcommands (sem subcomando-de-subcomando — keep simple).
|
|
12
|
+
*/
|
|
13
|
+
import chalk from 'chalk';
|
|
14
|
+
export const TOP_LEVEL_COMMANDS = [
|
|
15
|
+
'ai',
|
|
16
|
+
'init',
|
|
17
|
+
'config',
|
|
18
|
+
'login',
|
|
19
|
+
'logout',
|
|
20
|
+
'whoami',
|
|
21
|
+
'build',
|
|
22
|
+
'deploy',
|
|
23
|
+
'status',
|
|
24
|
+
'logs',
|
|
25
|
+
'validate',
|
|
26
|
+
'open',
|
|
27
|
+
'publish',
|
|
28
|
+
'add',
|
|
29
|
+
'mocks',
|
|
30
|
+
'env',
|
|
31
|
+
'db',
|
|
32
|
+
'fn',
|
|
33
|
+
'promote',
|
|
34
|
+
'doctor',
|
|
35
|
+
'upgrade',
|
|
36
|
+
'autocomplete',
|
|
37
|
+
];
|
|
38
|
+
function bashScript() {
|
|
39
|
+
const cmds = TOP_LEVEL_COMMANDS.join(' ');
|
|
40
|
+
return `# neetru CLI bash completion (v2.0)
|
|
41
|
+
_neetru_complete() {
|
|
42
|
+
local cur prev
|
|
43
|
+
COMPREPLY=()
|
|
44
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
45
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
46
|
+
if [ \${COMP_CWORD} -eq 1 ]; then
|
|
47
|
+
COMPREPLY=( $(compgen -W "${cmds}" -- "\${cur}") )
|
|
48
|
+
return 0
|
|
49
|
+
fi
|
|
50
|
+
}
|
|
51
|
+
complete -F _neetru_complete neetru
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
function zshScript() {
|
|
55
|
+
// Formato compsys do zsh.
|
|
56
|
+
const cmds = TOP_LEVEL_COMMANDS.map((c) => ` '${c}'`).join('\n');
|
|
57
|
+
return `#compdef neetru
|
|
58
|
+
# neetru CLI zsh completion (v2.0)
|
|
59
|
+
_neetru() {
|
|
60
|
+
local -a commands
|
|
61
|
+
commands=(
|
|
62
|
+
${cmds}
|
|
63
|
+
)
|
|
64
|
+
if (( CURRENT == 2 )); then
|
|
65
|
+
_describe 'command' commands
|
|
66
|
+
fi
|
|
67
|
+
}
|
|
68
|
+
_neetru "$@"
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
function pwshScript() {
|
|
72
|
+
const cmds = TOP_LEVEL_COMMANDS.map((c) => ` '${c}'`).join(',\n');
|
|
73
|
+
return `# neetru CLI PowerShell completion (v2.0)
|
|
74
|
+
Register-ArgumentCompleter -Native -CommandName neetru -ScriptBlock {
|
|
75
|
+
param($wordToComplete, $commandAst, $cursorPosition)
|
|
76
|
+
$commands = @(
|
|
77
|
+
${cmds}
|
|
78
|
+
)
|
|
79
|
+
$commands | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {
|
|
80
|
+
[System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
export function generateAutocompleteScript(shell) {
|
|
86
|
+
switch (shell) {
|
|
87
|
+
case 'bash':
|
|
88
|
+
return bashScript();
|
|
89
|
+
case 'zsh':
|
|
90
|
+
return zshScript();
|
|
91
|
+
case 'pwsh':
|
|
92
|
+
return pwshScript();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export async function runAutocomplete(shellArg, _opts = {}) {
|
|
96
|
+
const valid = ['bash', 'zsh', 'pwsh'];
|
|
97
|
+
const s = (shellArg ?? '').toLowerCase();
|
|
98
|
+
if (!valid.includes(s)) {
|
|
99
|
+
console.error(chalk.red(`Shell inválido "${shellArg ?? ''}". Use: ${valid.join(' | ')}`));
|
|
100
|
+
process.exit(2);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const script = generateAutocompleteScript(s);
|
|
104
|
+
// Escreve direto pra stdout (pipe-friendly).
|
|
105
|
+
process.stdout.write(script);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/commands/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,MAAM;IACN,SAAS;IACT,KAAK;IACL,OAAO;IACP,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,QAAQ;IACR,SAAS;IACT,cAAc;CACN,CAAC;AAMX,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO;;;;;;;gCAOuB,IAAI;;;;;CAKnC,CAAC;AACF,CAAC;AAED,SAAS,SAAS;IAChB,0BAA0B;IAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO;;;;;EAKP,IAAI;;;;;;;CAOL,CAAC;AACF,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO;;;;EAIP,IAAI;;;;;;CAML,CAAC;AACF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAY;IACrD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,UAAU,EAAE,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,SAAS,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,UAAU,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA4B,EAC5B,QAA6B,EAAE;IAE/B,MAAM,KAAK,GAAY,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAU,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,mBAAmB,QAAQ,IAAI,EAAE,WAAW,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAC3E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,0BAA0B,CAAC,CAAU,CAAC,CAAC;IACtD,6CAA6C;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface BuildOptions {
|
|
2
|
+
product?: string;
|
|
3
|
+
stack?: 'node' | 'docker' | 'php-apache' | 'static';
|
|
4
|
+
output?: string;
|
|
5
|
+
noCache?: boolean;
|
|
6
|
+
version?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface BuildManifest {
|
|
9
|
+
slug: string;
|
|
10
|
+
version: string;
|
|
11
|
+
stack: 'node' | 'docker' | 'php-apache' | 'static';
|
|
12
|
+
tarball: string;
|
|
13
|
+
sha256: string;
|
|
14
|
+
sizeBytes: number;
|
|
15
|
+
entrypoint?: string;
|
|
16
|
+
builtAt: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function runBuild(opts?: BuildOptions): Promise<BuildManifest>;
|