@neetru/cli 1.0.1 → 2.1.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 (192) 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/agent-release.d.ts +13 -0
  7. package/dist/commands/agent-release.js +204 -0
  8. package/dist/commands/agent-release.js.map +1 -0
  9. package/dist/commands/agent-write.d.ts +12 -0
  10. package/dist/commands/agent-write.js +94 -0
  11. package/dist/commands/agent-write.js.map +1 -0
  12. package/dist/commands/ai.d.ts +4 -0
  13. package/dist/commands/ai.js +88 -0
  14. package/dist/commands/ai.js.map +1 -0
  15. package/dist/commands/api-catalog.d.ts +20 -0
  16. package/dist/commands/api-catalog.js +126 -0
  17. package/dist/commands/api-catalog.js.map +1 -0
  18. package/dist/commands/audit.d.ts +8 -0
  19. package/dist/commands/audit.js +69 -0
  20. package/dist/commands/audit.js.map +1 -0
  21. package/dist/commands/autocomplete.d.ts +7 -0
  22. package/dist/commands/autocomplete.js +107 -0
  23. package/dist/commands/autocomplete.js.map +1 -0
  24. package/dist/commands/billing.d.ts +6 -0
  25. package/dist/commands/billing.js +69 -0
  26. package/dist/commands/billing.js.map +1 -0
  27. package/dist/commands/build.d.ts +18 -0
  28. package/dist/commands/build.js +295 -0
  29. package/dist/commands/build.js.map +1 -0
  30. package/dist/commands/cloud-run.d.ts +11 -0
  31. package/dist/commands/cloud-run.js +87 -0
  32. package/dist/commands/cloud-run.js.map +1 -0
  33. package/dist/commands/config.d.ts +3 -0
  34. package/dist/commands/config.js +70 -0
  35. package/dist/commands/config.js.map +1 -0
  36. package/dist/commands/db.d.ts +14 -0
  37. package/dist/commands/db.js +187 -0
  38. package/dist/commands/db.js.map +1 -0
  39. package/dist/commands/deploy.d.ts +23 -3
  40. package/dist/commands/deploy.js +530 -177
  41. package/dist/commands/deploy.js.map +1 -1
  42. package/dist/commands/deployments.d.ts +11 -0
  43. package/dist/commands/deployments.js +69 -0
  44. package/dist/commands/deployments.js.map +1 -0
  45. package/dist/commands/doctor.d.ts +27 -0
  46. package/dist/commands/doctor.js +211 -0
  47. package/dist/commands/doctor.js.map +1 -0
  48. package/dist/commands/dr.d.ts +11 -0
  49. package/dist/commands/dr.js +79 -0
  50. package/dist/commands/dr.js.map +1 -0
  51. package/dist/commands/env.d.ts +15 -0
  52. package/dist/commands/env.js +56 -0
  53. package/dist/commands/env.js.map +1 -0
  54. package/dist/commands/fn.d.ts +6 -0
  55. package/dist/commands/fn.js +87 -0
  56. package/dist/commands/fn.js.map +1 -0
  57. package/dist/commands/infra-read.d.ts +9 -0
  58. package/dist/commands/infra-read.js +113 -0
  59. package/dist/commands/infra-read.js.map +1 -0
  60. package/dist/commands/init.d.ts +10 -3
  61. package/dist/commands/init.js +275 -142
  62. package/dist/commands/init.js.map +1 -1
  63. package/dist/commands/login.d.ts +6 -3
  64. package/dist/commands/login.js +222 -92
  65. package/dist/commands/login.js.map +1 -1
  66. package/dist/commands/logout.d.ts +1 -0
  67. package/dist/commands/logout.js +28 -0
  68. package/dist/commands/logout.js.map +1 -0
  69. package/dist/commands/logs.d.ts +14 -3
  70. package/dist/commands/logs.js +132 -106
  71. package/dist/commands/logs.js.map +1 -1
  72. package/dist/commands/mocks.d.ts +5 -0
  73. package/dist/commands/mocks.js +23 -0
  74. package/dist/commands/mocks.js.map +1 -0
  75. package/dist/commands/open.d.ts +4 -3
  76. package/dist/commands/open.js +53 -85
  77. package/dist/commands/open.js.map +1 -1
  78. package/dist/commands/products-db.d.ts +37 -0
  79. package/dist/commands/products-db.js +230 -0
  80. package/dist/commands/products-db.js.map +1 -0
  81. package/dist/commands/products.d.ts +12 -0
  82. package/dist/commands/products.js +97 -0
  83. package/dist/commands/products.js.map +1 -0
  84. package/dist/commands/promote.d.ts +9 -0
  85. package/dist/commands/promote.js +114 -0
  86. package/dist/commands/promote.js.map +1 -0
  87. package/dist/commands/publish.d.ts +14 -0
  88. package/dist/commands/publish.js +180 -0
  89. package/dist/commands/publish.js.map +1 -0
  90. package/dist/commands/servers.d.ts +23 -0
  91. package/dist/commands/servers.js +166 -0
  92. package/dist/commands/servers.js.map +1 -0
  93. package/dist/commands/status.d.ts +5 -3
  94. package/dist/commands/status.js +91 -93
  95. package/dist/commands/status.js.map +1 -1
  96. package/dist/commands/support.d.ts +25 -0
  97. package/dist/commands/support.js +184 -0
  98. package/dist/commands/support.js.map +1 -0
  99. package/dist/commands/surface-status.d.ts +5 -0
  100. package/dist/commands/surface-status.js +63 -0
  101. package/dist/commands/surface-status.js.map +1 -0
  102. package/dist/commands/tenants.d.ts +34 -0
  103. package/dist/commands/tenants.js +179 -0
  104. package/dist/commands/tenants.js.map +1 -0
  105. package/dist/commands/upgrade.d.ts +12 -0
  106. package/dist/commands/upgrade.js +77 -0
  107. package/dist/commands/upgrade.js.map +1 -0
  108. package/dist/commands/validate.d.ts +1 -3
  109. package/dist/commands/validate.js +83 -91
  110. package/dist/commands/validate.js.map +1 -1
  111. package/dist/commands/whoami.d.ts +5 -3
  112. package/dist/commands/whoami.js +76 -28
  113. package/dist/commands/whoami.js.map +1 -1
  114. package/dist/commands/workspaces.d.ts +15 -0
  115. package/dist/commands/workspaces.js +72 -0
  116. package/dist/commands/workspaces.js.map +1 -0
  117. package/dist/index.d.ts +0 -1
  118. package/dist/index.js +1094 -36
  119. package/dist/index.js.map +1 -1
  120. package/dist/lib/ai/context.d.ts +11 -0
  121. package/dist/lib/ai/context.js +112 -0
  122. package/dist/lib/ai/context.js.map +1 -0
  123. package/dist/lib/ai/orchestrator.d.ts +10 -0
  124. package/dist/lib/ai/orchestrator.js +92 -0
  125. package/dist/lib/ai/orchestrator.js.map +1 -0
  126. package/dist/lib/api-client.d.ts +39 -0
  127. package/dist/lib/api-client.js +185 -0
  128. package/dist/lib/api-client.js.map +1 -0
  129. package/dist/lib/auth.d.ts +15 -0
  130. package/dist/lib/auth.js +98 -0
  131. package/dist/lib/auth.js.map +1 -0
  132. package/dist/lib/cli-read.d.ts +13 -0
  133. package/dist/lib/cli-read.js +103 -0
  134. package/dist/lib/cli-read.js.map +1 -0
  135. package/dist/lib/cli-write.d.ts +47 -0
  136. package/dist/lib/cli-write.js +137 -0
  137. package/dist/lib/cli-write.js.map +1 -0
  138. package/dist/lib/config-schema.d.ts +165 -0
  139. package/dist/lib/config-schema.js +57 -0
  140. package/dist/lib/config-schema.js.map +1 -0
  141. package/dist/lib/config.d.ts +15 -0
  142. package/dist/lib/config.js +33 -0
  143. package/dist/lib/config.js.map +1 -0
  144. package/dist/lib/render.d.ts +16 -0
  145. package/dist/lib/render.js +74 -0
  146. package/dist/lib/render.js.map +1 -0
  147. package/dist/utils/logger.d.ts +13 -0
  148. package/dist/utils/logger.js +27 -0
  149. package/dist/utils/logger.js.map +1 -0
  150. package/package.json +35 -33
  151. package/templates/auth/callback.ts +22 -0
  152. package/templates/auth/sign-in.tsx +41 -0
  153. package/templates/billing/checkout.ts +22 -0
  154. package/templates/billing/page.tsx +43 -0
  155. package/templates/support/ticket-form.tsx +68 -0
  156. package/templates/usage/track.ts +30 -0
  157. package/templates/users/profile.tsx +43 -0
  158. package/LICENSE +0 -21
  159. package/dist/commands/add.d.ts.map +0 -1
  160. package/dist/commands/deploy.d.ts.map +0 -1
  161. package/dist/commands/generate-types.d.ts +0 -3
  162. package/dist/commands/generate-types.d.ts.map +0 -1
  163. package/dist/commands/generate-types.js +0 -150
  164. package/dist/commands/generate-types.js.map +0 -1
  165. package/dist/commands/init.d.ts.map +0 -1
  166. package/dist/commands/login.d.ts.map +0 -1
  167. package/dist/commands/logs.d.ts.map +0 -1
  168. package/dist/commands/open.d.ts.map +0 -1
  169. package/dist/commands/status.d.ts.map +0 -1
  170. package/dist/commands/validate.d.ts.map +0 -1
  171. package/dist/commands/whoami.d.ts.map +0 -1
  172. package/dist/config.d.ts +0 -14
  173. package/dist/config.d.ts.map +0 -1
  174. package/dist/config.js +0 -83
  175. package/dist/config.js.map +0 -1
  176. package/dist/index.d.ts.map +0 -1
  177. package/dist/scaffold/auth.d.ts +0 -3
  178. package/dist/scaffold/auth.d.ts.map +0 -1
  179. package/dist/scaffold/auth.js +0 -228
  180. package/dist/scaffold/auth.js.map +0 -1
  181. package/dist/scaffold/billing.d.ts +0 -3
  182. package/dist/scaffold/billing.d.ts.map +0 -1
  183. package/dist/scaffold/billing.js +0 -184
  184. package/dist/scaffold/billing.js.map +0 -1
  185. package/dist/scaffold/usage.d.ts +0 -3
  186. package/dist/scaffold/usage.d.ts.map +0 -1
  187. package/dist/scaffold/usage.js +0 -173
  188. package/dist/scaffold/usage.js.map +0 -1
  189. package/dist/scaffold/users.d.ts +0 -3
  190. package/dist/scaffold/users.d.ts.map +0 -1
  191. package/dist/scaffold/users.js +0 -135
  192. package/dist/scaffold/users.js.map +0 -1
@@ -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,20 @@
1
+ import { type ConfirmOptions, type StepUpOptions } from '../lib/cli-write.js';
2
+ export interface ApiCatalogWriteOptions {
3
+ name?: string;
4
+ description?: string;
5
+ baseUrl?: string;
6
+ version?: string;
7
+ authMethod?: string;
8
+ docsUrl?: string;
9
+ ownerTeam?: string;
10
+ contactEmail?: string;
11
+ scopes?: string;
12
+ status?: string;
13
+ json?: boolean;
14
+ }
15
+ export declare function runApiCatalogCreate(slug: string, opts: ApiCatalogWriteOptions): Promise<void>;
16
+ export declare function runApiCatalogUpdate(slug: string, opts: ApiCatalogWriteOptions): Promise<void>;
17
+ export declare function runApiCatalogArchive(slug: string, opts: ConfirmOptions & {
18
+ unarchive?: boolean;
19
+ }): Promise<void>;
20
+ export declare function runApiCatalogDelete(slug: string, opts: StepUpOptions): Promise<void>;
@@ -0,0 +1,126 @@
1
+ /**
2
+ * `neetru api-catalog create|update|archive|delete` — control plane do registry
3
+ * de APIs versionadas (`apis/{slug}`).
4
+ *
5
+ * Endpoints:
6
+ * POST /api/cli/v1/api-catalog (create)
7
+ * PUT /api/cli/v1/api-catalog/{slug} (update)
8
+ * POST /api/cli/v1/api-catalog/{slug}?action=archive (soft-delete)
9
+ * DELETE /api/cli/v1/api-catalog/{slug} (delete físico — destrutivo)
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
+ function buildPayload(slug, opts) {
16
+ return {
17
+ slug,
18
+ name: opts.name,
19
+ description: opts.description,
20
+ baseUrl: opts.baseUrl,
21
+ version: opts.version,
22
+ authMethod: opts.authMethod,
23
+ docsUrl: opts.docsUrl,
24
+ ownerTeam: opts.ownerTeam,
25
+ contactEmail: opts.contactEmail,
26
+ requiredScopes: opts.scopes
27
+ ? opts.scopes.split(',').map((s) => s.trim()).filter(Boolean)
28
+ : undefined,
29
+ status: opts.status,
30
+ };
31
+ }
32
+ export async function runApiCatalogCreate(slug, opts) {
33
+ if (!slug) {
34
+ log.error('Uso: neetru api-catalog create <slug> --name … --base-url … --version … --auth-method … --status …');
35
+ process.exit(1);
36
+ }
37
+ const token = await requireToken(opts.json);
38
+ const spinner = opts.json
39
+ ? null
40
+ : ora({ text: `Registrando API "${slug}"…`, color: 'blue' }).start();
41
+ let res;
42
+ try {
43
+ res = await apiRequest('/api/cli/v1/api-catalog', {
44
+ method: 'POST',
45
+ token,
46
+ body: buildPayload(slug, opts),
47
+ });
48
+ spinner?.stop();
49
+ }
50
+ catch (error) {
51
+ spinner?.fail('Falha ao registrar API.');
52
+ handleApiError(error, opts.json);
53
+ }
54
+ printWriteResult({ id: res.id }, `API registrada: ${res.id}`, opts.json);
55
+ }
56
+ export async function runApiCatalogUpdate(slug, opts) {
57
+ if (!slug) {
58
+ log.error('Uso: neetru api-catalog update <slug> --name … --base-url … --version … --auth-method … --status …');
59
+ process.exit(1);
60
+ }
61
+ const token = await requireToken(opts.json);
62
+ const spinner = opts.json
63
+ ? null
64
+ : ora({ text: `Atualizando API "${slug}"…`, color: 'blue' }).start();
65
+ let res;
66
+ try {
67
+ res = await apiRequest(`/api/cli/v1/api-catalog/${encodeURIComponent(slug)}`, {
68
+ method: 'PUT',
69
+ token,
70
+ body: buildPayload(slug, opts),
71
+ });
72
+ spinner?.stop();
73
+ }
74
+ catch (error) {
75
+ spinner?.fail('Falha ao atualizar API.');
76
+ handleApiError(error, opts.json);
77
+ }
78
+ printWriteResult({ id: res.id }, `API ${res.id} atualizada.`, opts.json);
79
+ }
80
+ export async function runApiCatalogArchive(slug, opts) {
81
+ if (!slug) {
82
+ log.error('Uso: neetru api-catalog archive <slug> [--unarchive]');
83
+ process.exit(1);
84
+ }
85
+ const token = await requireToken(opts.json);
86
+ const action = opts.unarchive ? 'unarchive' : 'archive';
87
+ if (action === 'archive') {
88
+ await confirmDestructive(`Arquivar a API "${slug}"? Some da listagem default (reversível com --unarchive).`, opts);
89
+ }
90
+ const spinner = opts.json
91
+ ? null
92
+ : ora({ text: `${action === 'archive' ? 'Arquivando' : 'Reativando'} API "${slug}"…`, color: 'blue' }).start();
93
+ let res;
94
+ try {
95
+ res = await apiRequest(`/api/cli/v1/api-catalog/${encodeURIComponent(slug)}?action=${action}`, { method: 'POST', token });
96
+ spinner?.stop();
97
+ }
98
+ catch (error) {
99
+ spinner?.fail(`Falha ao ${action === 'archive' ? 'arquivar' : 'reativar'} API.`);
100
+ handleApiError(error, opts.json);
101
+ }
102
+ printWriteResult({ id: res.id, archived: res.archived }, `API ${res.id} → ${res.archived ? 'arquivada' : 'ativa'}`, opts.json);
103
+ }
104
+ export async function runApiCatalogDelete(slug, opts) {
105
+ if (!slug) {
106
+ log.error('Uso: neetru api-catalog delete <slug>');
107
+ process.exit(1);
108
+ }
109
+ const token = await requireToken(opts.json);
110
+ await confirmDestructive(`Deletar fisicamente a API "${slug}"? Esta ação é IRREVERSÍVEL (use archive para soft-delete).`, opts);
111
+ const { headers } = await resolveStepUp(opts);
112
+ const spinner = opts.json
113
+ ? null
114
+ : ora({ text: `Deletando API "${slug}"…`, color: 'blue' }).start();
115
+ let res;
116
+ try {
117
+ res = await apiRequest(`/api/cli/v1/api-catalog/${encodeURIComponent(slug)}${opts.dryRun ? '?dryRun=true' : ''}`, { method: 'DELETE', token, headers });
118
+ spinner?.stop();
119
+ }
120
+ catch (error) {
121
+ spinner?.fail('Falha ao deletar API.');
122
+ handleApiError(error, opts.json);
123
+ }
124
+ printWriteResult(res.dryRun ? res : { id: res.id, deleted: res.deleted }, `API ${res.id} deletada.`, opts.json);
125
+ }
126
+ //# sourceMappingURL=api-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-catalog.js","sourceRoot":"","sources":["../../src/commands/api-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface AuditTailOptions {
2
+ limit?: string;
3
+ action?: string;
4
+ severity?: string;
5
+ actor?: string;
6
+ json?: boolean;
7
+ }
8
+ export declare function runAuditTail(opts: AuditTailOptions): Promise<void>;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * `neetru audit tail` — últimos N eventos da trilha de auditoria do Core.
3
+ *
4
+ * Endpoint: GET /api/cli/v1/audit/tail
5
+ * filtros: --limit, --action, --severity, --actor
6
+ *
7
+ * Saída: tabela (default, mais recente primeiro) ou `--json`.
8
+ */
9
+ import chalk from 'chalk';
10
+ import ora from 'ora';
11
+ import { apiRequest } from '../lib/api-client.js';
12
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
13
+ import { renderTable, fmtTimestamp } from '../lib/render.js';
14
+ import { log } from '../utils/logger.js';
15
+ function colorSeverity(s) {
16
+ if (!s || s === 'info')
17
+ return chalk.dim(s ?? 'info');
18
+ if (s === 'warning')
19
+ return chalk.yellow(s);
20
+ if (s === 'critical')
21
+ return chalk.red(s);
22
+ return chalk.cyan(s);
23
+ }
24
+ function colorResult(r) {
25
+ if (r === 'success')
26
+ return chalk.green(r);
27
+ if (r === 'failure')
28
+ return chalk.red(r);
29
+ return chalk.dim(r);
30
+ }
31
+ export async function runAuditTail(opts) {
32
+ const token = await requireToken(opts.json);
33
+ const params = new URLSearchParams();
34
+ if (opts.limit)
35
+ params.set('limit', opts.limit);
36
+ if (opts.action)
37
+ params.set('action', opts.action);
38
+ if (opts.severity)
39
+ params.set('severity', opts.severity);
40
+ if (opts.actor)
41
+ params.set('actor', opts.actor);
42
+ const qs = params.toString();
43
+ const spinner = opts.json ? null : ora({ text: 'Buscando audit logs…', color: 'blue' }).start();
44
+ let res;
45
+ try {
46
+ res = await apiRequest(`/api/cli/v1/audit/tail${qs ? `?${qs}` : ''}`, { token });
47
+ spinner?.stop();
48
+ }
49
+ catch (error) {
50
+ spinner?.fail('Falha ao buscar audit logs.');
51
+ handleApiError(error, opts.json);
52
+ }
53
+ if (opts.json) {
54
+ console.log(JSON.stringify(res));
55
+ return;
56
+ }
57
+ log.heading(`Audit tail (${res.count} eventos)`);
58
+ renderTable([
59
+ { header: 'TIMESTAMP', value: (e) => fmtTimestamp(e.ts) },
60
+ { header: 'AÇÃO', value: (e) => e.action, maxWidth: 32 },
61
+ { header: 'ATOR', value: (e) => e.actor.email, maxWidth: 28 },
62
+ { header: 'SRC', value: (e) => e.actor.source ?? '—' },
63
+ { header: 'ALVO', value: (e) => `${e.target.kind}/${e.target.id}`, maxWidth: 30 },
64
+ { header: 'RESULTADO', value: (e) => colorResult(e.result) },
65
+ { header: 'SEV', value: (e) => colorSeverity(e.severity) },
66
+ ], res.events);
67
+ console.log();
68
+ }
69
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.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,6 @@
1
+ export interface BillingSummaryOptions {
2
+ year?: string;
3
+ month?: string;
4
+ json?: boolean;
5
+ }
6
+ export declare function runBillingSummary(opts: BillingSummaryOptions): Promise<void>;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * `neetru billing summary` — sumário contábil do mês corrente.
3
+ *
4
+ * Endpoint: GET /api/cli/v1/billing/summary (opcional ?year & ?month)
5
+ * MRR estimado + agregados de invoices + snapshot de subscriptions +
6
+ * obrigações fiscais do mês.
7
+ *
8
+ * Saída: relatório humano (default) ou `--json`.
9
+ */
10
+ import chalk from 'chalk';
11
+ import ora from 'ora';
12
+ import { apiRequest } from '../lib/api-client.js';
13
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
14
+ import { renderTable } from '../lib/render.js';
15
+ import { log } from '../utils/logger.js';
16
+ function brl(n) {
17
+ return `R$ ${n.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
18
+ }
19
+ export async function runBillingSummary(opts) {
20
+ const token = await requireToken(opts.json);
21
+ const params = new URLSearchParams();
22
+ if (opts.year)
23
+ params.set('year', opts.year);
24
+ if (opts.month)
25
+ params.set('month', opts.month);
26
+ const qs = params.toString();
27
+ const spinner = opts.json ? null : ora({ text: 'Buscando sumário…', color: 'blue' }).start();
28
+ let res;
29
+ try {
30
+ res = await apiRequest(`/api/cli/v1/billing/summary${qs ? `?${qs}` : ''}`, { token });
31
+ spinner?.stop();
32
+ }
33
+ catch (error) {
34
+ spinner?.fail('Falha ao buscar sumário de billing.');
35
+ handleApiError(error, opts.json);
36
+ }
37
+ if (opts.json) {
38
+ console.log(JSON.stringify(res));
39
+ return;
40
+ }
41
+ const s = res.summary;
42
+ log.heading(`Billing — ${s.period.label}`);
43
+ const row = (k, v) => console.log(` ${chalk.dim(k.padEnd(20))} ${v}`);
44
+ row('MRR estimado', chalk.green.bold(brl(s.estimatedMRR)));
45
+ console.log();
46
+ console.log(` ${chalk.bold('Invoices')}`);
47
+ row(' Emitidas', String(s.invoices.issued));
48
+ row(' Pagas', chalk.green(String(s.invoices.paid)));
49
+ row(' Abertas', chalk.yellow(String(s.invoices.open)));
50
+ row(' Falhadas', chalk.red(String(s.invoices.failed)));
51
+ row(' Anuladas', String(s.invoices.void));
52
+ row(' Bruto', brl(s.invoices.grossBRL));
53
+ row(' Líquido', brl(s.invoices.netBRL));
54
+ console.log();
55
+ console.log(` ${chalk.bold('Subscriptions')}`);
56
+ row(' Ativas', chalk.green(String(s.subscriptions.active)));
57
+ row(' Em trial', String(s.subscriptions.trialing));
58
+ row(' Past due', chalk.yellow(String(s.subscriptions.pastDue)));
59
+ row(' Canceladas', chalk.red(String(s.subscriptions.cancelled)));
60
+ console.log();
61
+ console.log(` ${chalk.bold('Obrigações fiscais do mês')}`);
62
+ renderTable([
63
+ { header: 'OBRIGAÇÃO', value: (o) => o.label, maxWidth: 24 },
64
+ { header: 'DIA', value: (o) => String(o.dueDay) },
65
+ { header: 'DESCRIÇÃO', value: (o) => o.description, maxWidth: 56 },
66
+ ], s.fiscalObligations);
67
+ console.log();
68
+ }
69
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"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"}
@@ -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>;