@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.
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
package/dist/index.js CHANGED
@@ -1,40 +1,341 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const commander_1 = require("commander");
8
- const chalk_1 = __importDefault(require("chalk"));
9
- const init_1 = require("./commands/init");
10
- const add_1 = require("./commands/add");
11
- const validate_1 = require("./commands/validate");
12
- const generate_types_1 = require("./commands/generate-types");
13
- const whoami_1 = require("./commands/whoami");
14
- const login_1 = require("./commands/login");
15
- const status_1 = require("./commands/status");
16
- const logs_1 = require("./commands/logs");
17
- const deploy_1 = require("./commands/deploy");
18
- const open_1 = require("./commands/open");
19
- const program = new commander_1.Command();
2
+ import { Command } from 'commander';
3
+ import { log } from './utils/logger.js';
4
+ const program = new Command();
20
5
  program
21
6
  .name('neetru')
22
- .description(chalk_1.default.bold('Neetru CLI') +
23
- ' — SDK & DevOps para integrar seu SaaS com Neetru Core\n' +
24
- chalk_1.default.dim(' init · add · login · status · deploy · logs · open'))
25
- .version('1.0.0');
26
- // Setup
27
- program.addCommand((0, init_1.initCommand)());
28
- program.addCommand((0, add_1.addCommand)());
29
- program.addCommand((0, validate_1.validateCommand)());
30
- program.addCommand((0, generate_types_1.generateTypesCommand)());
31
- // Auth & info
32
- program.addCommand((0, login_1.loginCommand)());
33
- program.addCommand((0, whoami_1.whoamiCommand)());
34
- // Operations
35
- program.addCommand((0, status_1.statusCommand)());
36
- program.addCommand((0, deploy_1.deployCommand)());
37
- program.addCommand((0, logs_1.logsCommand)());
38
- program.addCommand((0, open_1.openCommand)());
39
- program.parseAsync(process.argv);
7
+ .description('Neetru Developer Kit — scaffold, AI assistant e deploy para produtos SaaS')
8
+ .version('2.0.0');
9
+ // ── neetru ai ─────────────────────────────────────────────────────────
10
+ program
11
+ .command('ai')
12
+ .description('REPL interativo com IA Neetru-aware (Claude / OpenAI / Gemini)')
13
+ .option('-m, --model <model>', 'modelo: claude | openai | gemini | auto', 'auto')
14
+ .action(async (opts) => {
15
+ const { runAiRepl } = await import('./commands/ai.js');
16
+ await runAiRepl({ model: opts.model });
17
+ });
18
+ // ── neetru init ───────────────────────────────────────────────────────
19
+ program
20
+ .command('init <name>')
21
+ .description('Scaffold de novo produto SaaS Neetru')
22
+ .option('--type <type>', 'nextjs | node-api', 'nextjs')
23
+ .action(async (name, opts) => {
24
+ const { runInit } = await import('./commands/init.js');
25
+ await runInit({ name, type: opts.type });
26
+ });
27
+ // ── neetru config ─────────────────────────────────────────────────────
28
+ const configCmd = program
29
+ .command('config')
30
+ .description('Gerenciar configurações do CLI (chaves de API, modelo padrão)');
31
+ configCmd
32
+ .command('set <key> <value>')
33
+ .description('Define uma configuração')
34
+ .action(async (key, value) => {
35
+ const { configSet } = await import('./commands/config.js');
36
+ configSet(key, value);
37
+ });
38
+ configCmd
39
+ .command('get [key]')
40
+ .description('Lê configuração(ões)')
41
+ .action(async (key) => {
42
+ const { configGet } = await import('./commands/config.js');
43
+ configGet(key);
44
+ });
45
+ configCmd
46
+ .command('path')
47
+ .description('Mostra o caminho do arquivo de configuração')
48
+ .action(async () => {
49
+ const { configPath } = await import('./commands/config.js');
50
+ configPath();
51
+ });
52
+ // ── neetru login ──────────────────────────────────────────────────────
53
+ program
54
+ .command('login')
55
+ .description('Autentica o CLI via Device Code OAuth (RFC 8628)')
56
+ .option('--token <token>', 'token nrt_<keyId>_<secret> (modo CI/legado, pula browser)')
57
+ .option('--json', 'saída em JSON (machine-readable)')
58
+ .action(async (opts) => {
59
+ const { runLogin } = await import('./commands/login.js');
60
+ await runLogin({ token: opts.token, json: !!opts.json });
61
+ });
62
+ // ── neetru logout ─────────────────────────────────────────────────────
63
+ program
64
+ .command('logout')
65
+ .description('Apaga as credenciais locais (~/.config/neetru-cli/auth.json + cache legado)')
66
+ .action(async () => {
67
+ const { runLogout } = await import('./commands/logout.js');
68
+ await runLogout();
69
+ });
70
+ // ── neetru whoami ─────────────────────────────────────────────────────
71
+ program
72
+ .command('whoami')
73
+ .description('Mostra a identidade da chave CLI corrente')
74
+ .option('--json', 'saída em JSON')
75
+ .action(async (opts) => {
76
+ const { runWhoami } = await import('./commands/whoami.js');
77
+ await runWhoami({ json: !!opts.json });
78
+ });
79
+ // ── neetru build ──────────────────────────────────────────────────────
80
+ program
81
+ .command('build')
82
+ .description('Empacota o produto no diretório atual num tarball pronto para deploy')
83
+ .option('--product <slug>', 'override do slug (default: lê neetru.config.json)')
84
+ .option('--stack <stack>', 'node | docker | php-apache | static (default: detectado)')
85
+ .option('--output <dir>', 'diretório de saída', '.neetru-build')
86
+ .option('--version <version>', 'versão (default: detectada de package.json ou timestamp)')
87
+ .option('--no-cache', 'invalida caches do build (recria lockfile, --no-cache no docker)')
88
+ .action(async (opts) => {
89
+ const { runBuild } = await import('./commands/build.js');
90
+ await runBuild({
91
+ product: opts.product,
92
+ stack: opts.stack,
93
+ output: opts.output,
94
+ version: opts.version,
95
+ noCache: !opts.cache,
96
+ });
97
+ });
98
+ // ── neetru deploy ─────────────────────────────────────────────────────
99
+ program
100
+ .command('deploy')
101
+ .description('Deploy do produto via pipeline Neetru Core (interativo por default)')
102
+ .option('--product <slug>', 'slug do produto')
103
+ .option('--version <version>', 'versão a deployar')
104
+ .option('--stack <stack>', 'node | docker | php-apache | static')
105
+ .option('--target <target>', 'cloud-run | vm', 'vm')
106
+ .option('--server <id>', 'id do server (target=vm)')
107
+ .option('--domain <domain>', 'domínio público')
108
+ .option('--port <port>', 'porta interna do app', (v) => Number.parseInt(v, 10))
109
+ .option('--artifact <file>', 'caminho do tarball já buildado')
110
+ .option('--artifact-url <url>', 'URL pública/signed do artifact (GCS, S3)')
111
+ .option('--artifact-sha256 <sha>', 'sha256 do artifact (par com --artifact-url)')
112
+ .option('--env-file <file>', 'arquivo .env com vars passadas pro deploy')
113
+ .option('--non-interactive', 'falha em vez de perguntar (modo CI)')
114
+ .action(async (opts) => {
115
+ const { runDeploy } = await import('./commands/deploy.js');
116
+ await runDeploy({
117
+ product: opts.product,
118
+ version: opts.version,
119
+ stack: opts.stack,
120
+ target: opts.target,
121
+ server: opts.server,
122
+ domain: opts.domain,
123
+ port: opts.port,
124
+ artifact: opts.artifact,
125
+ artifactUrl: opts.artifactUrl,
126
+ artifactSha256: opts.artifactSha256,
127
+ envFile: opts.envFile,
128
+ nonInteractive: !!opts.nonInteractive,
129
+ });
130
+ });
131
+ // ── neetru status ─────────────────────────────────────────────────────
132
+ program
133
+ .command('status')
134
+ .description('Mostra o status atual do workspace (build/deploy último, domínio, tier)')
135
+ .option('--client-id <id>', 'oauthClientId do workspace (UI Core /workspaces/{id})')
136
+ .option('--json', 'saída em JSON')
137
+ .action(async (opts) => {
138
+ const { runStatus } = await import('./commands/status.js');
139
+ await runStatus({ clientId: opts.clientId, json: !!opts.json });
140
+ });
141
+ // ── neetru logs ───────────────────────────────────────────────────────
142
+ program
143
+ .command('logs')
144
+ .description('Visualiza logs do workspace; suporta tail contínuo')
145
+ .option('--client-id <id>', 'oauthClientId do workspace')
146
+ .option('-f, --follow', 'tail contínuo (poll a cada 5s)')
147
+ .option('-n, --lines <count>', 'número de linhas a buscar', '50')
148
+ .option('--since <duration>', 'logs desde N atrás (ex: 30m, 2h, 1d)', '15m')
149
+ .option('--level <level>', 'filtrar por nível: info | warn | error | debug')
150
+ .option('--product <product>', 'v1.3 — filtrar por productId')
151
+ .option('--channel <channel>', 'v1.3 — filtrar por channel (stdout | stderr | app)')
152
+ .option('--correlation-id <id>', 'v1.3 — filtrar por correlationId (UUID)')
153
+ .action(async (opts) => {
154
+ const { runLogs } = await import('./commands/logs.js');
155
+ await runLogs({
156
+ clientId: opts.clientId,
157
+ follow: !!opts.follow,
158
+ lines: opts.lines,
159
+ since: opts.since,
160
+ level: opts.level,
161
+ product: opts.product,
162
+ channel: opts.channel,
163
+ correlationId: opts.correlationId,
164
+ });
165
+ });
166
+ // ── neetru validate ───────────────────────────────────────────────────
167
+ program
168
+ .command('validate')
169
+ .description('Health check da config local + conexão com Core')
170
+ .action(async () => {
171
+ const { runValidate } = await import('./commands/validate.js');
172
+ await runValidate();
173
+ });
174
+ // ── neetru open ───────────────────────────────────────────────────────
175
+ program
176
+ .command('open [target]')
177
+ .description('Abre uma página do painel Neetru no browser')
178
+ .option('--client-id <id>', 'oauthClientId do workspace (anexa em targets workspace-scoped)')
179
+ .action(async (target, opts) => {
180
+ const { runOpen } = await import('./commands/open.js');
181
+ await runOpen(target, { clientId: opts.clientId });
182
+ });
183
+ // ── neetru publish ────────────────────────────────────────────────────
184
+ program
185
+ .command('publish')
186
+ .description('Publica o produto no catálogo público da landing (public_products)')
187
+ .option('--draft', 'salva como rascunho (published=false)')
188
+ .option('--unpublish', 'remove o produto da landing (mantém o doc)')
189
+ .option('--slug <slug>', 'override do slug do neetru.config.json')
190
+ .option('--name <name>', 'override do nome')
191
+ .option('--tagline <tagline>', 'override do tagline')
192
+ .option('--description <description>', 'override da description')
193
+ .option('--icon-key <iconKey>', 'override do iconKey')
194
+ .option('--status <status>', 'override do status (live | soon | beta)')
195
+ .option('--order <order>', 'override do order (inteiro)')
196
+ .option('--cta-href <ctaHref>', 'override do ctaHref')
197
+ .option('--cta-label <ctaLabel>', 'override do ctaLabel')
198
+ .action(async (opts) => {
199
+ const { runPublish } = await import('./commands/publish.js');
200
+ await runPublish({
201
+ draft: !!opts.draft,
202
+ unpublish: !!opts.unpublish,
203
+ slug: opts.slug,
204
+ name: opts.name,
205
+ tagline: opts.tagline,
206
+ description: opts.description,
207
+ iconKey: opts.iconKey,
208
+ status: opts.status,
209
+ order: opts.order,
210
+ ctaHref: opts.ctaHref,
211
+ ctaLabel: opts.ctaLabel,
212
+ });
213
+ });
214
+ // ── neetru add ────────────────────────────────────────────────────────
215
+ program
216
+ .command('add <feature>')
217
+ .description('v1.3 — copia template (auth | billing | usage | users | support) pra src/lib/neetru/')
218
+ .option('--force', 'sobrescrever arquivos existentes')
219
+ .action(async (feature, opts) => {
220
+ const { runAdd } = await import('./commands/add.js');
221
+ await runAdd({ feature, force: !!opts.force });
222
+ });
223
+ // ── neetru mocks ──────────────────────────────────────────────────────
224
+ const mocksCmd = program
225
+ .command('mocks')
226
+ .description('v1.3 — gerenciar fixtures dev (NEETRU_ENV=dev)');
227
+ mocksCmd
228
+ .command('reset')
229
+ .description('Reseta .neetru/dev-fixtures.json para {}')
230
+ .action(async () => {
231
+ const { runMocksReset } = await import('./commands/mocks.js');
232
+ await runMocksReset();
233
+ });
234
+ // ── neetru env ────────────────────────────────────────────────────────
235
+ const envCmd = program
236
+ .command('env')
237
+ .description('v1.3 — gerenciar configuração NEETRU_ENV no .env.local');
238
+ envCmd
239
+ .command('switch <target>')
240
+ .description('Alterna NEETRU_ENV: dev | workspace | production')
241
+ .action(async (target) => {
242
+ const { runEnvSwitch } = await import('./commands/env.js');
243
+ await runEnvSwitch({ target });
244
+ });
245
+ // ── neetru db ─────────────────────────────────────────────────────────
246
+ const dbCmd = program
247
+ .command('db')
248
+ .description('v1.4 — gerência de schema/migrations/seed do produto');
249
+ dbCmd
250
+ .command('init')
251
+ .description('Cria manifest stub a partir de neetru.config.json')
252
+ .option('--out <path>', 'caminho do manifest (default db/schema.manifest.json)')
253
+ .option('--force', 'sobrescreve se já existir')
254
+ .action(async (opts) => {
255
+ const { runDbInit } = await import('./commands/db.js');
256
+ await runDbInit({ out: opts.out, force: !!opts.force });
257
+ });
258
+ dbCmd
259
+ .command('migrate <toVersion>')
260
+ .description('Aplica migration via Core (chama runMigrations Sprint 8)')
261
+ .option('--from <fromVersion>', 'versão atual (default: schemaVersion do config)')
262
+ .action(async (toVersion, opts) => {
263
+ const { runDbMigrate } = await import('./commands/db.js');
264
+ await runDbMigrate({ toVersion, fromVersion: opts.from });
265
+ });
266
+ dbCmd
267
+ .command('seed')
268
+ .description('Executa db/seed.ts no projeto (NEETRU_ENV=dev)')
269
+ .option('--script <path>', 'caminho custom do script de seed')
270
+ .action(async (opts) => {
271
+ const { runDbSeed } = await import('./commands/db.js');
272
+ await runDbSeed({ script: opts.script });
273
+ });
274
+ // ── neetru fn ─────────────────────────────────────────────────────────
275
+ const fnCmd = program
276
+ .command('fn')
277
+ .description('v1.4 — gestão de Functions/APIs do produto');
278
+ fnCmd
279
+ .command('deploy')
280
+ .description('Registra nova versão da API no catálogo neetru-apis (Sprint 7 stub)')
281
+ .option('--version <v>', 'versão da API (default: apiVersion do config ou v1)')
282
+ .option('--channel <channel>', 'stable | beta | alpha', 'stable')
283
+ .option('--spec <path>', 'caminho de OpenAPI/JSON schema')
284
+ .action(async (opts) => {
285
+ const { runFnDeploy } = await import('./commands/fn.js');
286
+ await runFnDeploy({ version: opts.version, channel: opts.channel, spec: opts.spec });
287
+ });
288
+ // ── neetru promote ────────────────────────────────────────────────────
289
+ program
290
+ .command('promote')
291
+ .description('v1.4 — solicita promotion entre ambientes (staff-gated). dev→workspace→beta→prod')
292
+ .requiredOption('--from <env>', 'dev | workspace | beta | prod')
293
+ .requiredOption('--to <env>', 'dev | workspace | beta | prod')
294
+ .option('--product <slug>', 'override do slug do neetru.config.json')
295
+ .option('--reason <text>', 'razão livre da promotion')
296
+ .option('--from-revision <rev>', 'revisão Cloud Run atual (rollback target)')
297
+ .option('--to-revision <rev>', 'revisão Cloud Run novo (target do rollout)')
298
+ .action(async (opts) => {
299
+ const { runPromote } = await import('./commands/promote.js');
300
+ await runPromote({
301
+ from: opts.from,
302
+ to: opts.to,
303
+ product: opts.product,
304
+ reason: opts.reason,
305
+ fromRevision: opts.fromRevision,
306
+ toRevision: opts.toRevision,
307
+ });
308
+ });
309
+ // ── neetru doctor ─────────────────────────────────────────────────────
310
+ program
311
+ .command('doctor')
312
+ .description('v2.0 — diagnóstico do CLI: token, core, schema, NEETRU_ENV, version')
313
+ .option('--json', 'saída em JSON (machine-readable)')
314
+ .action(async (opts) => {
315
+ const { runDoctor } = await import('./commands/doctor.js');
316
+ await runDoctor({ json: !!opts.json });
317
+ });
318
+ // ── neetru upgrade ────────────────────────────────────────────────────
319
+ program
320
+ .command('upgrade')
321
+ .description('v2.0 — verifica latest no npm e exibe instrução de upgrade')
322
+ .option('--json', 'saída em JSON')
323
+ .action(async (opts) => {
324
+ const { runUpgrade } = await import('./commands/upgrade.js');
325
+ await runUpgrade({ json: !!opts.json });
326
+ });
327
+ // ── neetru autocomplete ───────────────────────────────────────────────
328
+ program
329
+ .command('autocomplete <shell>')
330
+ .description('v2.0 — gera script de shell completion (bash | zsh | pwsh)')
331
+ .action(async (shell) => {
332
+ const { runAutocomplete } = await import('./commands/autocomplete.js');
333
+ await runAutocomplete(shell);
334
+ });
335
+ // ── parse ─────────────────────────────────────────────────────────────
336
+ program.parse(process.argv);
337
+ if (!process.argv.slice(2).length) {
338
+ log.banner();
339
+ program.outputHelp();
340
+ }
40
341
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,yCAAoC;AACpC,kDAA0B;AAC1B,0CAA8C;AAC9C,wCAA4C;AAC5C,kDAAsD;AACtD,8DAAiE;AACjE,8CAAkD;AAClD,4CAAgD;AAChD,8CAAkD;AAClD,0CAA8C;AAC9C,8CAAkD;AAClD,0CAA8C;AAE9C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CACV,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC;IACxB,0DAA0D;IAC1D,eAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAClE;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,QAAQ;AACR,OAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,IAAA,gBAAU,GAAE,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,IAAA,0BAAe,GAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,IAAA,qCAAoB,GAAE,CAAC,CAAC;AAE3C,cAAc;AACd,OAAO,CAAC,UAAU,CAAC,IAAA,oBAAY,GAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;AAEpC,aAAa;AACb,OAAO,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAElC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Contexto Neetru injetado no system prompt de todos os modelos.
3
+ * Documenta a superfície de API do Core, padrões de integração,
4
+ * auth, billing e schema Firestore para que o modelo gere código
5
+ * que já conecta corretamente na plataforma.
6
+ */
7
+ export declare const NEETRU_SYSTEM_CONTEXT: string;
8
+ /**
9
+ * Contexto adicional de projeto — lido do .neetru.json no diretório atual.
10
+ */
11
+ export declare function loadProjectContext(): Promise<string>;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Contexto Neetru injetado no system prompt de todos os modelos.
3
+ * Documenta a superfície de API do Core, padrões de integração,
4
+ * auth, billing e schema Firestore para que o modelo gere código
5
+ * que já conecta corretamente na plataforma.
6
+ */
7
+ export const NEETRU_SYSTEM_CONTEXT = `
8
+ Você é o assistente de desenvolvimento do ecossistema Neetru.
9
+ Ajuda devs a construir produtos SaaS de cima da plataforma Neetru Core.
10
+
11
+ ═══════════════════════════════════════
12
+ NEETRU CORE — SUPERFÍCIE DE API
13
+ ═══════════════════════════════════════
14
+
15
+ Base URL: https://api.neetru.com
16
+ Auth: Bearer token (neetru-api-key) no header Authorization
17
+
18
+ ── Tenants ─────────────────────────────
19
+ GET /tenants lista tenants do usuário autenticado
20
+ POST /tenants cria tenant { name, plan, metadata }
21
+ GET /tenants/:id detalhe do tenant
22
+ PATCH /tenants/:id atualiza nome/metadata
23
+ DELETE /tenants/:id soft-delete (status: arquivado)
24
+
25
+ ── Entitlements ────────────────────────
26
+ GET /entitlements/:tenantId features ativas para o tenant
27
+ Resposta: { features: string[], plan: string, limits: {...} }
28
+
29
+ ── Subscriptions ───────────────────────
30
+ GET /subscriptions/:tenantId assinatura ativa
31
+ POST /subscriptions/checkout inicia checkout Stripe { tenantId, planId }
32
+ DELETE /subscriptions/:id cancela no fim do período
33
+
34
+ ── Billing / Invoices ──────────────────
35
+ GET /invoices?tenantId=X lista faturas
36
+ GET /invoices/:id/pdf download PDF da fatura
37
+
38
+ ── Webhook ─────────────────────────────
39
+ POST /webhooks/stripe recebe eventos Stripe (configurar no dashboard)
40
+
41
+ ═══════════════════════════════════════
42
+ PADRÕES DE INTEGRAÇÃO
43
+ ═══════════════════════════════════════
44
+
45
+ Auth em Next.js (App Router):
46
+ import { createCustomerSession } from '@neetru/sdk';
47
+ // No server action após login Firebase:
48
+ await createCustomerSession(idToken);
49
+
50
+ Tenant gate (middleware):
51
+ import { withTenantGate } from '@neetru/sdk/middleware';
52
+ export const middleware = withTenantGate({ requiredFeature: 'feature-x' });
53
+
54
+ Verificar entitlement em Server Action:
55
+ import { getEntitlements } from '@neetru/sdk/server';
56
+ const { features } = await getEntitlements(tenantId);
57
+ if (!features.includes('advanced-reports')) throw new Error('Plano insuficiente');
58
+
59
+ Firestore collections relevantes (Admin SDK no Core):
60
+ tenants/{tenantId} → dados do tenant
61
+ subscriptions/{id} → assinatura (userId, tenantId, planId, status)
62
+ account_invoices/{id} → faturas
63
+ payment_methods/{id} → métodos de pagamento
64
+ support_tickets/{id} → tickets de suporte
65
+ audit_logs/{id} → auditoria append-only (NÃO escrever diretamente)
66
+ public_products/{slug} → catálogo público (leitura pública, escrita via Core)
67
+
68
+ ═══════════════════════════════════════
69
+ REGRAS DO ECOSSISTEMA
70
+ ═══════════════════════════════════════
71
+
72
+ 1. Todo produto SaaS usa tenants do Core — não crie autenticação própria.
73
+ 2. Billing sempre via Core → Stripe. Nunca cobrar diretamente.
74
+ 3. Auditoria: use recordAudit() do Core SDK — nunca escrever em audit_logs diretamente.
75
+ 4. Entitlements: verificar features ANTES de renderizar funcionalidades premium.
76
+ 5. LGPD: dados pessoais só no Firestore, nunca em logs. Soft delete padrão.
77
+ 6. Deploy: via 'neetru deploy' — não usar gcloud diretamente nos produtos.
78
+
79
+ ═══════════════════════════════════════
80
+ STACK PADRÃO DOS PRODUTOS
81
+ ═══════════════════════════════════════
82
+
83
+ Frontend: Next.js 15 (App Router) + shadcn/ui + Tailwind
84
+ Backend: Next.js Server Actions + Firebase Admin SDK
85
+ Auth: Firebase Auth → Core session cookie
86
+ DB: Firestore (Admin SDK no servidor, client SDK leitura em tempo real)
87
+ Infra: Cloud Run (gerenciado pelo Core)
88
+ Brand: tokens do BRAND.md — brand-500, brand-700, ink-950, neetru-slate-*
89
+
90
+ Quando gerar código, siga este stack. Não sugira alternativas de infra
91
+ (não é Railway, Vercel, Supabase — é o Core da Neetru).
92
+ `.trim();
93
+ /**
94
+ * Contexto adicional de projeto — lido do .neetru.json no diretório atual.
95
+ */
96
+ export async function loadProjectContext() {
97
+ try {
98
+ const fs = await import('fs/promises');
99
+ const raw = await fs.readFile('.neetru.json', 'utf-8');
100
+ const project = JSON.parse(raw);
101
+ return `
102
+ Projeto atual: ${project.name ?? 'desconhecido'}
103
+ Tipo: ${project.type ?? 'saas-product'}
104
+ Tenant: ${project.tenantId ?? 'não configurado'}
105
+ Features: ${(project.features ?? []).join(', ') || 'nenhuma configurada'}
106
+ `.trim();
107
+ }
108
+ catch {
109
+ return '';
110
+ }
111
+ }
112
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/lib/ai/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFpC,CAAC,IAAI,EAAE,CAAC;AAET;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO;iBACM,OAAO,CAAC,IAAI,IAAI,cAAc;QACvC,OAAO,CAAC,IAAI,IAAI,cAAc;UAC5B,OAAO,CAAC,QAAQ,IAAI,iBAAiB;YACnC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,qBAAqB;KACnE,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type ModelId = 'claude' | 'openai' | 'gemini' | 'auto';
2
+ export interface Message {
3
+ role: 'user' | 'assistant';
4
+ content: string;
5
+ }
6
+ /**
7
+ * Orquestrador principal: decide o modelo, injeta contexto Neetru,
8
+ * faz stream da resposta e retorna o texto completo.
9
+ */
10
+ export declare function chat(messages: Message[], onChunk: (chunk: string) => void, preferred?: ModelId): Promise<string>;
@@ -0,0 +1,92 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import OpenAI from 'openai';
3
+ import { config } from '../config.js';
4
+ import { NEETRU_SYSTEM_CONTEXT, loadProjectContext } from './context.js';
5
+ import { log } from '../../utils/logger.js';
6
+ /**
7
+ * Escolhe o modelo mais adequado para um dado tipo de tarefa.
8
+ * "auto" usa Claude por padrão — mais adequado para raciocínio de
9
+ * arquitetura e análise de código. Expande conforme as chaves configuradas.
10
+ */
11
+ function routeModel(input, preferred) {
12
+ if (preferred !== 'auto')
13
+ return preferred;
14
+ const lower = input.toLowerCase();
15
+ // Tarefas de geração pura de código → OpenAI (se disponível)
16
+ const isCodeGen = lower.includes('crie um componente') ||
17
+ lower.includes('gere o código') ||
18
+ lower.includes('escreva a função') ||
19
+ lower.includes('implemente');
20
+ const hasOpenAI = !!config.get('openaiApiKey');
21
+ if (isCodeGen && hasOpenAI)
22
+ return 'openai';
23
+ return 'claude'; // padrão: Claude para arquitetura, análise, raciocínio
24
+ }
25
+ /**
26
+ * Stream de resposta via Claude (claude-sonnet-4-5 ou superior).
27
+ * Retorna o texto completo ao final.
28
+ */
29
+ async function streamClaude(messages, systemExtra, onChunk) {
30
+ const apiKey = config.get('anthropicApiKey');
31
+ if (!apiKey)
32
+ throw new Error('anthropicApiKey não configurada. Execute: neetru config set anthropicApiKey <sk-ant-...>');
33
+ const client = new Anthropic({ apiKey });
34
+ const system = [NEETRU_SYSTEM_CONTEXT, systemExtra].filter(Boolean).join('\n\n');
35
+ let full = '';
36
+ const stream = await client.messages.stream({
37
+ model: 'claude-sonnet-4-6',
38
+ max_tokens: 8096,
39
+ system,
40
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
41
+ });
42
+ for await (const chunk of stream) {
43
+ if (chunk.type === 'content_block_delta' &&
44
+ chunk.delta.type === 'text_delta') {
45
+ onChunk(chunk.delta.text);
46
+ full += chunk.delta.text;
47
+ }
48
+ }
49
+ return full;
50
+ }
51
+ /**
52
+ * Stream de resposta via OpenAI (gpt-4o).
53
+ */
54
+ async function streamOpenAI(messages, systemExtra, onChunk) {
55
+ const apiKey = config.get('openaiApiKey');
56
+ if (!apiKey)
57
+ throw new Error('openaiApiKey não configurada. Execute: neetru config set openaiApiKey <sk-...>');
58
+ const client = new OpenAI({ apiKey });
59
+ const systemContent = [NEETRU_SYSTEM_CONTEXT, systemExtra].filter(Boolean).join('\n\n');
60
+ let full = '';
61
+ const stream = await client.chat.completions.create({
62
+ model: 'gpt-4o',
63
+ stream: true,
64
+ messages: [
65
+ { role: 'system', content: systemContent },
66
+ ...messages.map((m) => ({ role: m.role, content: m.content })),
67
+ ],
68
+ });
69
+ for await (const chunk of stream) {
70
+ const text = chunk.choices[0]?.delta?.content ?? '';
71
+ if (text) {
72
+ onChunk(text);
73
+ full += text;
74
+ }
75
+ }
76
+ return full;
77
+ }
78
+ /**
79
+ * Orquestrador principal: decide o modelo, injeta contexto Neetru,
80
+ * faz stream da resposta e retorna o texto completo.
81
+ */
82
+ export async function chat(messages, onChunk, preferred) {
83
+ const lastUserMsg = [...messages].reverse().find((m) => m.role === 'user')?.content ?? '';
84
+ const model = routeModel(lastUserMsg, preferred ?? config.get('defaultModel') ?? 'auto');
85
+ const projectCtx = await loadProjectContext();
86
+ log.dim(`modelo: ${model}`);
87
+ if (model === 'openai') {
88
+ return streamOpenAI(messages, projectCtx, onChunk);
89
+ }
90
+ return streamClaude(messages, projectCtx, onChunk);
91
+ }
92
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/lib/ai/orchestrator.ts"],"names":[],"mappings":"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"}