@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.
Files changed (135) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +109 -152
  3. package/dist/commands/add.d.ts +8 -3
  4. package/dist/commands/add.js +70 -143
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/ai.d.ts +4 -0
  7. package/dist/commands/ai.js +88 -0
  8. package/dist/commands/ai.js.map +1 -0
  9. package/dist/commands/autocomplete.d.ts +7 -0
  10. package/dist/commands/autocomplete.js +107 -0
  11. package/dist/commands/autocomplete.js.map +1 -0
  12. package/dist/commands/build.d.ts +18 -0
  13. package/dist/commands/build.js +288 -0
  14. package/dist/commands/build.js.map +1 -0
  15. package/dist/commands/config.d.ts +3 -0
  16. package/dist/commands/config.js +70 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/db.d.ts +14 -0
  19. package/dist/commands/db.js +187 -0
  20. package/dist/commands/db.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +16 -3
  22. package/dist/commands/deploy.js +400 -180
  23. package/dist/commands/deploy.js.map +1 -1
  24. package/dist/commands/doctor.d.ts +27 -0
  25. package/dist/commands/doctor.js +211 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/env.d.ts +15 -0
  28. package/dist/commands/env.js +56 -0
  29. package/dist/commands/env.js.map +1 -0
  30. package/dist/commands/fn.d.ts +6 -0
  31. package/dist/commands/fn.js +87 -0
  32. package/dist/commands/fn.js.map +1 -0
  33. package/dist/commands/init.d.ts +10 -3
  34. package/dist/commands/init.js +212 -143
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/login.d.ts +6 -3
  37. package/dist/commands/login.js +222 -92
  38. package/dist/commands/login.js.map +1 -1
  39. package/dist/commands/logout.d.ts +1 -0
  40. package/dist/commands/logout.js +28 -0
  41. package/dist/commands/logout.js.map +1 -0
  42. package/dist/commands/logs.d.ts +14 -3
  43. package/dist/commands/logs.js +132 -106
  44. package/dist/commands/logs.js.map +1 -1
  45. package/dist/commands/mocks.d.ts +5 -0
  46. package/dist/commands/mocks.js +23 -0
  47. package/dist/commands/mocks.js.map +1 -0
  48. package/dist/commands/open.d.ts +4 -3
  49. package/dist/commands/open.js +53 -85
  50. package/dist/commands/open.js.map +1 -1
  51. package/dist/commands/promote.d.ts +9 -0
  52. package/dist/commands/promote.js +114 -0
  53. package/dist/commands/promote.js.map +1 -0
  54. package/dist/commands/publish.d.ts +14 -0
  55. package/dist/commands/publish.js +180 -0
  56. package/dist/commands/publish.js.map +1 -0
  57. package/dist/commands/status.d.ts +5 -3
  58. package/dist/commands/status.js +91 -93
  59. package/dist/commands/status.js.map +1 -1
  60. package/dist/commands/upgrade.d.ts +12 -0
  61. package/dist/commands/upgrade.js +77 -0
  62. package/dist/commands/upgrade.js.map +1 -0
  63. package/dist/commands/validate.d.ts +1 -3
  64. package/dist/commands/validate.js +83 -91
  65. package/dist/commands/validate.js.map +1 -1
  66. package/dist/commands/whoami.d.ts +5 -3
  67. package/dist/commands/whoami.js +76 -28
  68. package/dist/commands/whoami.js.map +1 -1
  69. package/dist/index.d.ts +0 -1
  70. package/dist/index.js +337 -36
  71. package/dist/index.js.map +1 -1
  72. package/dist/lib/ai/context.d.ts +11 -0
  73. package/dist/lib/ai/context.js +112 -0
  74. package/dist/lib/ai/context.js.map +1 -0
  75. package/dist/lib/ai/orchestrator.d.ts +10 -0
  76. package/dist/lib/ai/orchestrator.js +92 -0
  77. package/dist/lib/ai/orchestrator.js.map +1 -0
  78. package/dist/lib/api-client.d.ts +21 -0
  79. package/dist/lib/api-client.js +65 -0
  80. package/dist/lib/api-client.js.map +1 -0
  81. package/dist/lib/auth.d.ts +15 -0
  82. package/dist/lib/auth.js +98 -0
  83. package/dist/lib/auth.js.map +1 -0
  84. package/dist/lib/config-schema.d.ts +165 -0
  85. package/dist/lib/config-schema.js +57 -0
  86. package/dist/lib/config-schema.js.map +1 -0
  87. package/dist/lib/config.d.ts +15 -0
  88. package/dist/lib/config.js +33 -0
  89. package/dist/lib/config.js.map +1 -0
  90. package/dist/utils/logger.d.ts +13 -0
  91. package/dist/utils/logger.js +27 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/package.json +35 -33
  94. package/templates/auth/callback.ts +22 -0
  95. package/templates/auth/sign-in.tsx +41 -0
  96. package/templates/billing/checkout.ts +22 -0
  97. package/templates/billing/page.tsx +43 -0
  98. package/templates/support/ticket-form.tsx +68 -0
  99. package/templates/usage/track.ts +30 -0
  100. package/templates/users/profile.tsx +43 -0
  101. package/LICENSE +0 -21
  102. package/dist/commands/add.d.ts.map +0 -1
  103. package/dist/commands/deploy.d.ts.map +0 -1
  104. package/dist/commands/generate-types.d.ts +0 -3
  105. package/dist/commands/generate-types.d.ts.map +0 -1
  106. package/dist/commands/generate-types.js +0 -150
  107. package/dist/commands/generate-types.js.map +0 -1
  108. package/dist/commands/init.d.ts.map +0 -1
  109. package/dist/commands/login.d.ts.map +0 -1
  110. package/dist/commands/logs.d.ts.map +0 -1
  111. package/dist/commands/open.d.ts.map +0 -1
  112. package/dist/commands/status.d.ts.map +0 -1
  113. package/dist/commands/validate.d.ts.map +0 -1
  114. package/dist/commands/whoami.d.ts.map +0 -1
  115. package/dist/config.d.ts +0 -14
  116. package/dist/config.d.ts.map +0 -1
  117. package/dist/config.js +0 -83
  118. package/dist/config.js.map +0 -1
  119. package/dist/index.d.ts.map +0 -1
  120. package/dist/scaffold/auth.d.ts +0 -3
  121. package/dist/scaffold/auth.d.ts.map +0 -1
  122. package/dist/scaffold/auth.js +0 -228
  123. package/dist/scaffold/auth.js.map +0 -1
  124. package/dist/scaffold/billing.d.ts +0 -3
  125. package/dist/scaffold/billing.d.ts.map +0 -1
  126. package/dist/scaffold/billing.js +0 -184
  127. package/dist/scaffold/billing.js.map +0 -1
  128. package/dist/scaffold/usage.d.ts +0 -3
  129. package/dist/scaffold/usage.d.ts.map +0 -1
  130. package/dist/scaffold/usage.js +0 -173
  131. package/dist/scaffold/usage.js.map +0 -1
  132. package/dist/scaffold/users.d.ts +0 -3
  133. package/dist/scaffold/users.d.ts.map +0 -1
  134. package/dist/scaffold/users.js +0 -135
  135. package/dist/scaffold/users.js.map +0 -1
@@ -1,150 +1,77 @@
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.addCommand = addCommand;
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
- 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
- const spinner = (0, ora_1.default)(`Gerando integração: ${chalk_1.default.bold(feature)}`).start();
95
- const outDir = path.resolve(options.outDir);
96
- try {
97
- fs.ensureDirSync(outDir);
98
- const createdFiles = await featureDef.scaffold(config, outDir);
99
- spinner.succeed(`${chalk_1.default.bold(feature)} adicionado`);
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
- // Print next steps
109
- console.log('\n' + chalk_1.default.bold('Próximos passos:'));
110
- printNextSteps(feature, options.outDir, options.framework);
111
- console.log('');
50
+ await fs.copyFile(srcPath, destPath);
51
+ log.success(`+ ${path.relative(process.cwd(), destPath)}`);
52
+ copied++;
112
53
  }
113
- catch (err) {
114
- spinner.fail(`Erro ao gerar ${feature}: ${err.message}`);
115
- process.exit(1);
116
- }
117
- });
118
- return cmd;
54
+ }
55
+ return { copied, skipped };
119
56
  }
120
- function printNextSteps(feature, outDir, framework) {
121
- switch (feature) {
122
- case 'auth':
123
- if (framework === 'nextjs') {
124
- console.log(chalk_1.default.dim(` 1. Adicione as env vars de NEETRU_CLIENT_ID e NEETRU_CLIENT_SECRET`));
125
- console.log(chalk_1.default.dim(` 2. Configure a rota de callback em seu OAuth client no painel Neetru`));
126
- console.log(chalk_1.default.dim(` 3. Use NeetruAuthProvider em seu layout raiz`));
127
- console.log(chalk_1.default.dim(` 4. Proteja rotas com requireNeetruSession()`));
128
- }
129
- else {
130
- console.log(chalk_1.default.dim(` 1. Adicione NEETRU_CLIENT_ID, NEETRU_CLIENT_SECRET às env vars`));
131
- console.log(chalk_1.default.dim(` 2. Monte as rotas /auth/login e /auth/callback`));
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
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type ModelId } from '../lib/ai/orchestrator.js';
2
+ export declare function runAiRepl(opts?: {
3
+ model?: ModelId;
4
+ }): Promise<void>;
@@ -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>;