@neetru/cli 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +136 -0
- package/README.md +109 -152
- package/dist/commands/add.d.ts +8 -3
- package/dist/commands/add.js +70 -143
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/ai.d.ts +4 -0
- package/dist/commands/ai.js +88 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/autocomplete.d.ts +7 -0
- package/dist/commands/autocomplete.js +107 -0
- package/dist/commands/autocomplete.js.map +1 -0
- package/dist/commands/build.d.ts +18 -0
- package/dist/commands/build.js +288 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +70 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/db.d.ts +14 -0
- package/dist/commands/db.js +187 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -3
- package/dist/commands/deploy.js +400 -180
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/doctor.d.ts +27 -0
- package/dist/commands/doctor.js +211 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/env.d.ts +15 -0
- package/dist/commands/env.js +56 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/fn.d.ts +6 -0
- package/dist/commands/fn.js +87 -0
- package/dist/commands/fn.js.map +1 -0
- package/dist/commands/init.d.ts +10 -3
- package/dist/commands/init.js +212 -143
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +6 -3
- package/dist/commands/login.js +222 -92
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.js +28 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +14 -3
- package/dist/commands/logs.js +132 -106
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mocks.d.ts +5 -0
- package/dist/commands/mocks.js +23 -0
- package/dist/commands/mocks.js.map +1 -0
- package/dist/commands/open.d.ts +4 -3
- package/dist/commands/open.js +53 -85
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/promote.d.ts +9 -0
- package/dist/commands/promote.js +114 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/publish.d.ts +14 -0
- package/dist/commands/publish.js +180 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/status.d.ts +5 -3
- package/dist/commands/status.js +91 -93
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade.d.ts +12 -0
- package/dist/commands/upgrade.js +77 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/validate.d.ts +1 -3
- package/dist/commands/validate.js +83 -91
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/whoami.d.ts +5 -3
- package/dist/commands/whoami.js +76 -28
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +337 -36
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/context.d.ts +11 -0
- package/dist/lib/ai/context.js +112 -0
- package/dist/lib/ai/context.js.map +1 -0
- package/dist/lib/ai/orchestrator.d.ts +10 -0
- package/dist/lib/ai/orchestrator.js +92 -0
- package/dist/lib/ai/orchestrator.js.map +1 -0
- package/dist/lib/api-client.d.ts +21 -0
- package/dist/lib/api-client.js +65 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/auth.d.ts +15 -0
- package/dist/lib/auth.js +98 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config-schema.d.ts +165 -0
- package/dist/lib/config-schema.js +57 -0
- package/dist/lib/config-schema.js.map +1 -0
- package/dist/lib/config.d.ts +15 -0
- package/dist/lib/config.js +33 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.js +27 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +35 -33
- package/templates/auth/callback.ts +22 -0
- package/templates/auth/sign-in.tsx +41 -0
- package/templates/billing/checkout.ts +22 -0
- package/templates/billing/page.tsx +43 -0
- package/templates/support/ticket-form.tsx +68 -0
- package/templates/usage/track.ts +30 -0
- package/templates/users/profile.tsx +43 -0
- package/LICENSE +0 -21
- package/dist/commands/add.d.ts.map +0 -1
- package/dist/commands/deploy.d.ts.map +0 -1
- package/dist/commands/generate-types.d.ts +0 -3
- package/dist/commands/generate-types.d.ts.map +0 -1
- package/dist/commands/generate-types.js +0 -150
- package/dist/commands/generate-types.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/open.d.ts.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/whoami.d.ts.map +0 -1
- package/dist/config.d.ts +0 -14
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -83
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/scaffold/auth.d.ts +0 -3
- package/dist/scaffold/auth.d.ts.map +0 -1
- package/dist/scaffold/auth.js +0 -228
- package/dist/scaffold/auth.js.map +0 -1
- package/dist/scaffold/billing.d.ts +0 -3
- package/dist/scaffold/billing.d.ts.map +0 -1
- package/dist/scaffold/billing.js +0 -184
- package/dist/scaffold/billing.js.map +0 -1
- package/dist/scaffold/usage.d.ts +0 -3
- package/dist/scaffold/usage.d.ts.map +0 -1
- package/dist/scaffold/usage.js +0 -173
- package/dist/scaffold/usage.js.map +0 -1
- package/dist/scaffold/users.d.ts +0 -3
- package/dist/scaffold/users.d.ts.map +0 -1
- package/dist/scaffold/users.js +0 -135
- package/dist/scaffold/users.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,40 +1,341 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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(
|
|
23
|
-
'
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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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"}
|