@neetru/cli 2.0.0 → 2.1.1

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 (72) hide show
  1. package/dist/commands/agent-release.d.ts +13 -0
  2. package/dist/commands/agent-release.js +204 -0
  3. package/dist/commands/agent-release.js.map +1 -0
  4. package/dist/commands/agent-write.d.ts +12 -0
  5. package/dist/commands/agent-write.js +94 -0
  6. package/dist/commands/agent-write.js.map +1 -0
  7. package/dist/commands/api-catalog.d.ts +20 -0
  8. package/dist/commands/api-catalog.js +126 -0
  9. package/dist/commands/api-catalog.js.map +1 -0
  10. package/dist/commands/audit.d.ts +8 -0
  11. package/dist/commands/audit.js +69 -0
  12. package/dist/commands/audit.js.map +1 -0
  13. package/dist/commands/billing.d.ts +6 -0
  14. package/dist/commands/billing.js +69 -0
  15. package/dist/commands/billing.js.map +1 -0
  16. package/dist/commands/build.js +10 -3
  17. package/dist/commands/build.js.map +1 -1
  18. package/dist/commands/cloud-run.d.ts +11 -0
  19. package/dist/commands/cloud-run.js +87 -0
  20. package/dist/commands/cloud-run.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +7 -0
  22. package/dist/commands/deploy.js +150 -17
  23. package/dist/commands/deploy.js.map +1 -1
  24. package/dist/commands/deployments.d.ts +11 -0
  25. package/dist/commands/deployments.js +69 -0
  26. package/dist/commands/deployments.js.map +1 -0
  27. package/dist/commands/dr.d.ts +11 -0
  28. package/dist/commands/dr.js +79 -0
  29. package/dist/commands/dr.js.map +1 -0
  30. package/dist/commands/infra-read.d.ts +9 -0
  31. package/dist/commands/infra-read.js +113 -0
  32. package/dist/commands/infra-read.js.map +1 -0
  33. package/dist/commands/init.d.ts +13 -1
  34. package/dist/commands/init.js +327 -70
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/products-db.d.ts +37 -0
  37. package/dist/commands/products-db.js +230 -0
  38. package/dist/commands/products-db.js.map +1 -0
  39. package/dist/commands/products.d.ts +12 -0
  40. package/dist/commands/products.js +97 -0
  41. package/dist/commands/products.js.map +1 -0
  42. package/dist/commands/servers.d.ts +23 -0
  43. package/dist/commands/servers.js +166 -0
  44. package/dist/commands/servers.js.map +1 -0
  45. package/dist/commands/support.d.ts +25 -0
  46. package/dist/commands/support.js +184 -0
  47. package/dist/commands/support.js.map +1 -0
  48. package/dist/commands/surface-status.d.ts +5 -0
  49. package/dist/commands/surface-status.js +63 -0
  50. package/dist/commands/surface-status.js.map +1 -0
  51. package/dist/commands/tenants.d.ts +34 -0
  52. package/dist/commands/tenants.js +179 -0
  53. package/dist/commands/tenants.js.map +1 -0
  54. package/dist/commands/workspaces.d.ts +15 -0
  55. package/dist/commands/workspaces.js +72 -0
  56. package/dist/commands/workspaces.js.map +1 -0
  57. package/dist/index.js +775 -6
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/api-client.d.ts +18 -0
  60. package/dist/lib/api-client.js +124 -4
  61. package/dist/lib/api-client.js.map +1 -1
  62. package/dist/lib/cli-read.d.ts +13 -0
  63. package/dist/lib/cli-read.js +103 -0
  64. package/dist/lib/cli-read.js.map +1 -0
  65. package/dist/lib/cli-write.d.ts +47 -0
  66. package/dist/lib/cli-write.js +137 -0
  67. package/dist/lib/cli-write.js.map +1 -0
  68. package/dist/lib/config-schema.d.ts +10 -10
  69. package/dist/lib/render.d.ts +16 -0
  70. package/dist/lib/render.js +74 -0
  71. package/dist/lib/render.js.map +1 -0
  72. package/package.json +4 -4
@@ -0,0 +1,69 @@
1
+ /**
2
+ * `neetru deployments create|rollback` — control plane de deployments.
3
+ *
4
+ * Endpoints:
5
+ * POST /api/cli/v1/deployments (create)
6
+ * POST /api/cli/v1/deployments/{id}/rollback (rollback — destrutivo)
7
+ *
8
+ * `neetru deploy` (pipeline de produto interativo) continua existindo à parte;
9
+ * estes comandos operam o recurso `deployments/` direto (paridade com a UI).
10
+ */
11
+ import ora from 'ora';
12
+ import { apiRequest } from '../lib/api-client.js';
13
+ import { requireToken, handleApiError, confirmDestructive, printWriteResult, resolveStepUp, } from '../lib/cli-write.js';
14
+ import { log } from '../utils/logger.js';
15
+ export async function runDeploymentsCreate(opts) {
16
+ const token = await requireToken(opts.json);
17
+ const spinner = opts.json
18
+ ? null
19
+ : ora({ text: `Criando deployment ${opts.product}@${opts.version}…`, color: 'blue' }).start();
20
+ let res;
21
+ try {
22
+ res = await apiRequest('/api/cli/v1/deployments', {
23
+ method: 'POST',
24
+ token,
25
+ body: {
26
+ productId: opts.product,
27
+ tenantId: opts.tenant,
28
+ version: opts.version,
29
+ environmentId: opts.env,
30
+ serverId: opts.server,
31
+ },
32
+ });
33
+ spinner?.stop();
34
+ }
35
+ catch (error) {
36
+ spinner?.fail('Falha ao criar deployment.');
37
+ handleApiError(error, opts.json);
38
+ }
39
+ if (opts.json) {
40
+ console.log(JSON.stringify(res));
41
+ return;
42
+ }
43
+ log.success(`Deployment criado: ${res.id}`);
44
+ if (res.canary)
45
+ log.dim('Canary habilitado — propague via UI após o soak.');
46
+ }
47
+ export async function runDeploymentsRollback(id, opts) {
48
+ if (!id) {
49
+ log.error('Uso: neetru deployments rollback <deploymentId>');
50
+ process.exit(1);
51
+ }
52
+ const token = await requireToken(opts.json);
53
+ await confirmDestructive(`Rollback do deployment ${id}? Isso dispara um novo deploy da versão anterior em produção.`, opts);
54
+ const { headers } = await resolveStepUp(opts);
55
+ const spinner = opts.json
56
+ ? null
57
+ : ora({ text: `Rollback do deployment ${id}…`, color: 'blue' }).start();
58
+ let res;
59
+ try {
60
+ res = await apiRequest(`/api/cli/v1/deployments/${encodeURIComponent(id)}/rollback${opts.dryRun ? '?dryRun=true' : ''}`, { method: 'POST', token, headers });
61
+ spinner?.stop();
62
+ }
63
+ catch (error) {
64
+ spinner?.fail('Falha ao fazer rollback.');
65
+ handleApiError(error, opts.json);
66
+ }
67
+ printWriteResult(res.dryRun ? res : { id: res.id }, `Rollback disparado — novo deployment: ${res.id}`, opts.json);
68
+ }
69
+ //# sourceMappingURL=deployments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/commands/deployments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type StepUpOptions } from '../lib/cli-write.js';
2
+ export declare function runDrExportsList(opts: {
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ export interface DrRestoreOptions extends StepUpOptions {
6
+ /** gcsPath do export — vem do output de `dr exports list`. */
7
+ gcsPath: string;
8
+ /** Projeto GCP de DESTINO (staging — nunca o LIVE). */
9
+ targetProject: string;
10
+ }
11
+ export declare function runDrRestore(opts: DrRestoreOptions): Promise<void>;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * `neetru dr exports list` + `neetru dr restore` — DR drill assistido
3
+ * (`PROJ_GRANDE_ATUALIZACAO §5.1` / `RUNBOOK_DR_DRILL.md §4`).
4
+ *
5
+ * Endpoints:
6
+ * GET /api/cli/v1/dr/exports (admin only)
7
+ * POST /api/cli/v1/dr/restore (admin + step-up MFA — destrutivo top-tier)
8
+ */
9
+ import ora from 'ora';
10
+ import { apiRequest } from '../lib/api-client.js';
11
+ import { requireToken, handleApiError, confirmDestructive, printWriteResult, resolveStepUp, } from '../lib/cli-write.js';
12
+ import { renderTable, fmtTimestamp } from '../lib/render.js';
13
+ import { log } from '../utils/logger.js';
14
+ export async function runDrExportsList(opts) {
15
+ const token = await requireToken(opts.json);
16
+ const spinner = opts.json
17
+ ? null
18
+ : ora({ text: 'Buscando exports de DR…', color: 'blue' }).start();
19
+ let res;
20
+ try {
21
+ res = await apiRequest('/api/cli/v1/dr/exports', { token });
22
+ spinner?.stop();
23
+ }
24
+ catch (error) {
25
+ spinner?.fail('Falha ao listar exports.');
26
+ handleApiError(error, opts.json);
27
+ }
28
+ if (opts.json) {
29
+ console.log(JSON.stringify(res));
30
+ return;
31
+ }
32
+ log.heading(`Exports DR (${res.count})`);
33
+ if (res.count === 0) {
34
+ log.dim('Nenhum export encontrado em gs://neetru-backups/firestore-exports/.');
35
+ return;
36
+ }
37
+ renderTable([
38
+ { header: 'STAMP', value: (e) => e.stamp, maxWidth: 30 },
39
+ {
40
+ header: 'TAMANHO',
41
+ value: (e) => e.sizeBytes > 0 ? `${(e.sizeBytes / 1024 / 1024).toFixed(1)} MB` : '—',
42
+ },
43
+ { header: 'ATUALIZADO', value: (e) => fmtTimestamp(e.updatedAt) },
44
+ { header: 'GCS', value: (e) => e.gcsPath, maxWidth: 50 },
45
+ ], res.exports);
46
+ console.log();
47
+ }
48
+ export async function runDrRestore(opts) {
49
+ if (!opts.gcsPath || !opts.targetProject) {
50
+ log.error('Uso: neetru dr restore --gcs-path <path> --target-project <project>');
51
+ process.exit(1);
52
+ }
53
+ const token = await requireToken(opts.json);
54
+ await confirmDestructive(`Restaurar Firestore de ${opts.gcsPath} para o projeto ${opts.targetProject}? ` +
55
+ `Esta operação é IRREVERSÍVEL no projeto destino. Use SEMPRE um projeto de staging.`, opts);
56
+ const { headers } = await resolveStepUp(opts);
57
+ const spinner = opts.json
58
+ ? null
59
+ : ora({ text: 'Disparando restore…', color: 'blue' }).start();
60
+ let res;
61
+ try {
62
+ res = await apiRequest(`/api/cli/v1/dr/restore${opts.dryRun ? '?dryRun=true' : ''}`, {
63
+ method: 'POST',
64
+ token,
65
+ headers,
66
+ body: { gcsPath: opts.gcsPath, targetProject: opts.targetProject },
67
+ });
68
+ spinner?.stop();
69
+ }
70
+ catch (error) {
71
+ spinner?.fail('Falha ao disparar restore.');
72
+ handleApiError(error, opts.json);
73
+ }
74
+ printWriteResult(res.dryRun
75
+ ? res
76
+ : { operationName: res.operationName, targetProject: res.targetProject }, `Restore disparado — operationName: ${res.operationName}. ` +
77
+ `Acompanhe via gcloud firestore operations describe.`, opts.json);
78
+ }
79
+ //# sourceMappingURL=dr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dr.js","sourceRoot":"","sources":["../../src/commands/dr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function runDnsZonesList(opts: {
2
+ json?: boolean;
3
+ }): Promise<void>;
4
+ export declare function runHostingList(opts: {
5
+ json?: boolean;
6
+ }): Promise<void>;
7
+ export declare function runBuildsList(opts: {
8
+ json?: boolean;
9
+ }): Promise<void>;
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Comandos read-only de infraestrutura: `neetru dns zones list`,
3
+ * `neetru hosting list`, `neetru builds list` (F5 scope matrix §4.2.0
4
+ * — bucket "✅ DEVE entrar", read-only).
5
+ *
6
+ * Todos batem em `/api/cli/v1/{dns,hosting,builds}/*` com `requireCliAuth`
7
+ * + gate de role.
8
+ */
9
+ import ora from 'ora';
10
+ import { apiRequest } from '../lib/api-client.js';
11
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
12
+ import { renderTable, fmtTimestamp } from '../lib/render.js';
13
+ import { log } from '../utils/logger.js';
14
+ export async function runDnsZonesList(opts) {
15
+ const token = await requireToken(opts.json);
16
+ const spinner = opts.json ? null : ora({ text: 'Buscando managed zones…', color: 'blue' }).start();
17
+ let res;
18
+ try {
19
+ res = await apiRequest('/api/cli/v1/dns/zones', { token });
20
+ spinner?.stop();
21
+ }
22
+ catch (error) {
23
+ spinner?.fail('Falha ao listar zones.');
24
+ handleApiError(error, opts.json);
25
+ }
26
+ if (opts.json) {
27
+ console.log(JSON.stringify(res));
28
+ return;
29
+ }
30
+ if (res.error) {
31
+ log.warn(`${res.error} (${res.errorCode ?? '—'})`);
32
+ return;
33
+ }
34
+ log.heading(`Cloud DNS zones (${res.zones.length}) · projeto ${res.projectId ?? '—'}`);
35
+ if (res.zones.length === 0) {
36
+ log.dim('Nenhuma managed zone encontrada.');
37
+ return;
38
+ }
39
+ renderTable([
40
+ { header: 'NOME', value: (z) => z.name, maxWidth: 24 },
41
+ { header: 'DNS NAME', value: (z) => z.dnsName, maxWidth: 32 },
42
+ { header: 'VISIBILITY', value: (z) => z.visibility },
43
+ { header: 'RECORDS', value: (z) => z.recordCount?.toString() ?? '—' },
44
+ { header: 'CRIADO', value: (z) => fmtTimestamp(z.createdAt) },
45
+ ], res.zones);
46
+ console.log();
47
+ }
48
+ export async function runHostingList(opts) {
49
+ const token = await requireToken(opts.json);
50
+ const spinner = opts.json ? null : ora({ text: 'Buscando customer domains…', color: 'blue' }).start();
51
+ let res;
52
+ try {
53
+ res = await apiRequest('/api/cli/v1/hosting', { token });
54
+ spinner?.stop();
55
+ }
56
+ catch (error) {
57
+ spinner?.fail('Falha ao listar domains.');
58
+ handleApiError(error, opts.json);
59
+ }
60
+ if (opts.json) {
61
+ console.log(JSON.stringify(res));
62
+ return;
63
+ }
64
+ log.heading(`Customer domains (${res.count})`);
65
+ if (res.count === 0) {
66
+ log.dim('Nenhum customer domain registrado.');
67
+ return;
68
+ }
69
+ renderTable([
70
+ { header: 'HOST', value: (d) => d.host ?? '—', maxWidth: 32 },
71
+ { header: 'TENANT', value: (d) => d.tenantId ?? '—', maxWidth: 22 },
72
+ { header: 'STATUS', value: (d) => d.status ?? '—' },
73
+ { header: 'CERT', value: (d) => d.certStatus ?? '—' },
74
+ { header: 'TARGET', value: (d) => d.targetService ?? '—', maxWidth: 24 },
75
+ ], res.domains);
76
+ console.log();
77
+ }
78
+ export async function runBuildsList(opts) {
79
+ const token = await requireToken(opts.json);
80
+ const spinner = opts.json ? null : ora({ text: 'Buscando Cloud Builds…', color: 'blue' }).start();
81
+ let res;
82
+ try {
83
+ res = await apiRequest('/api/cli/v1/builds', { token });
84
+ spinner?.stop();
85
+ }
86
+ catch (error) {
87
+ spinner?.fail('Falha ao listar builds.');
88
+ handleApiError(error, opts.json);
89
+ }
90
+ if (opts.json) {
91
+ console.log(JSON.stringify(res));
92
+ return;
93
+ }
94
+ if (res.error) {
95
+ log.warn(`${res.error} (${res.errorCode ?? '—'}) ${res.hint ?? ''}`);
96
+ if (res.builds.length === 0)
97
+ return;
98
+ }
99
+ log.heading(`Cloud Builds (${res.builds.length})`);
100
+ renderTable([
101
+ { header: 'ID', value: (b) => b.id, maxWidth: 36 },
102
+ { header: 'STATUS', value: (b) => b.status },
103
+ { header: 'REGIÃO', value: (b) => b.region ?? 'global' },
104
+ { header: 'SOURCE', value: (b) => b.source ?? '—', maxWidth: 28 },
105
+ { header: 'INICIADO', value: (b) => fmtTimestamp(b.createTime) },
106
+ {
107
+ header: 'DURAÇÃO',
108
+ value: (b) => (b.durationSeconds != null ? `${b.durationSeconds}s` : '—'),
109
+ },
110
+ ], res.builds);
111
+ console.log();
112
+ }
113
+ //# sourceMappingURL=infra-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra-read.js","sourceRoot":"","sources":["../../src/commands/infra-read.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,22 @@
1
1
  interface InitOptions {
2
2
  name: string;
3
3
  type: 'nextjs' | 'node-api';
4
+ /** Skip prompt + init em cwd direto (merge mode). */
5
+ here?: boolean;
6
+ /** Skip prompt + sobrescreve conflitos sem perguntar. */
7
+ force?: boolean;
8
+ /** Custom path target. */
9
+ path?: string;
10
+ /** Modo non-interactive — sai com erro se prompt for necessário. */
11
+ yes?: boolean;
4
12
  }
5
13
  /**
6
14
  * Scaffold de projeto SaaS Neetru.
7
15
  * Gera estrutura mínima com Core SDK wired: auth, tenant gate, billing hook.
16
+ *
17
+ * v2.1.1 (2026-05-16): adiciona prompt interativo de caminho + merge mode +
18
+ * preservação de arquivos existentes. Antes sempre criava subdiretório e
19
+ * falhava se nome existia.
8
20
  */
9
- export declare function runInit({ name, type }: InitOptions): Promise<void>;
21
+ export declare function runInit(opts: InitOptions): Promise<void>;
10
22
  export {};