@neetru/cli 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +109 -152
  3. package/dist/commands/add.d.ts +8 -3
  4. package/dist/commands/add.js +70 -143
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/ai.d.ts +4 -0
  7. package/dist/commands/ai.js +88 -0
  8. package/dist/commands/ai.js.map +1 -0
  9. package/dist/commands/autocomplete.d.ts +7 -0
  10. package/dist/commands/autocomplete.js +107 -0
  11. package/dist/commands/autocomplete.js.map +1 -0
  12. package/dist/commands/build.d.ts +18 -0
  13. package/dist/commands/build.js +288 -0
  14. package/dist/commands/build.js.map +1 -0
  15. package/dist/commands/config.d.ts +3 -0
  16. package/dist/commands/config.js +70 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/db.d.ts +14 -0
  19. package/dist/commands/db.js +187 -0
  20. package/dist/commands/db.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +16 -3
  22. package/dist/commands/deploy.js +400 -180
  23. package/dist/commands/deploy.js.map +1 -1
  24. package/dist/commands/doctor.d.ts +27 -0
  25. package/dist/commands/doctor.js +211 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/env.d.ts +15 -0
  28. package/dist/commands/env.js +56 -0
  29. package/dist/commands/env.js.map +1 -0
  30. package/dist/commands/fn.d.ts +6 -0
  31. package/dist/commands/fn.js +87 -0
  32. package/dist/commands/fn.js.map +1 -0
  33. package/dist/commands/init.d.ts +10 -3
  34. package/dist/commands/init.js +212 -143
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/login.d.ts +6 -3
  37. package/dist/commands/login.js +222 -92
  38. package/dist/commands/login.js.map +1 -1
  39. package/dist/commands/logout.d.ts +1 -0
  40. package/dist/commands/logout.js +28 -0
  41. package/dist/commands/logout.js.map +1 -0
  42. package/dist/commands/logs.d.ts +14 -3
  43. package/dist/commands/logs.js +132 -106
  44. package/dist/commands/logs.js.map +1 -1
  45. package/dist/commands/mocks.d.ts +5 -0
  46. package/dist/commands/mocks.js +23 -0
  47. package/dist/commands/mocks.js.map +1 -0
  48. package/dist/commands/open.d.ts +4 -3
  49. package/dist/commands/open.js +53 -85
  50. package/dist/commands/open.js.map +1 -1
  51. package/dist/commands/promote.d.ts +9 -0
  52. package/dist/commands/promote.js +114 -0
  53. package/dist/commands/promote.js.map +1 -0
  54. package/dist/commands/publish.d.ts +14 -0
  55. package/dist/commands/publish.js +180 -0
  56. package/dist/commands/publish.js.map +1 -0
  57. package/dist/commands/status.d.ts +5 -3
  58. package/dist/commands/status.js +91 -93
  59. package/dist/commands/status.js.map +1 -1
  60. package/dist/commands/upgrade.d.ts +12 -0
  61. package/dist/commands/upgrade.js +77 -0
  62. package/dist/commands/upgrade.js.map +1 -0
  63. package/dist/commands/validate.d.ts +1 -3
  64. package/dist/commands/validate.js +83 -91
  65. package/dist/commands/validate.js.map +1 -1
  66. package/dist/commands/whoami.d.ts +5 -3
  67. package/dist/commands/whoami.js +76 -28
  68. package/dist/commands/whoami.js.map +1 -1
  69. package/dist/index.d.ts +0 -1
  70. package/dist/index.js +337 -36
  71. package/dist/index.js.map +1 -1
  72. package/dist/lib/ai/context.d.ts +11 -0
  73. package/dist/lib/ai/context.js +112 -0
  74. package/dist/lib/ai/context.js.map +1 -0
  75. package/dist/lib/ai/orchestrator.d.ts +10 -0
  76. package/dist/lib/ai/orchestrator.js +92 -0
  77. package/dist/lib/ai/orchestrator.js.map +1 -0
  78. package/dist/lib/api-client.d.ts +21 -0
  79. package/dist/lib/api-client.js +65 -0
  80. package/dist/lib/api-client.js.map +1 -0
  81. package/dist/lib/auth.d.ts +15 -0
  82. package/dist/lib/auth.js +98 -0
  83. package/dist/lib/auth.js.map +1 -0
  84. package/dist/lib/config-schema.d.ts +165 -0
  85. package/dist/lib/config-schema.js +57 -0
  86. package/dist/lib/config-schema.js.map +1 -0
  87. package/dist/lib/config.d.ts +15 -0
  88. package/dist/lib/config.js +33 -0
  89. package/dist/lib/config.js.map +1 -0
  90. package/dist/utils/logger.d.ts +13 -0
  91. package/dist/utils/logger.js +27 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/package.json +35 -33
  94. package/templates/auth/callback.ts +22 -0
  95. package/templates/auth/sign-in.tsx +41 -0
  96. package/templates/billing/checkout.ts +22 -0
  97. package/templates/billing/page.tsx +43 -0
  98. package/templates/support/ticket-form.tsx +68 -0
  99. package/templates/usage/track.ts +30 -0
  100. package/templates/users/profile.tsx +43 -0
  101. package/LICENSE +0 -21
  102. package/dist/commands/add.d.ts.map +0 -1
  103. package/dist/commands/deploy.d.ts.map +0 -1
  104. package/dist/commands/generate-types.d.ts +0 -3
  105. package/dist/commands/generate-types.d.ts.map +0 -1
  106. package/dist/commands/generate-types.js +0 -150
  107. package/dist/commands/generate-types.js.map +0 -1
  108. package/dist/commands/init.d.ts.map +0 -1
  109. package/dist/commands/login.d.ts.map +0 -1
  110. package/dist/commands/logs.d.ts.map +0 -1
  111. package/dist/commands/open.d.ts.map +0 -1
  112. package/dist/commands/status.d.ts.map +0 -1
  113. package/dist/commands/validate.d.ts.map +0 -1
  114. package/dist/commands/whoami.d.ts.map +0 -1
  115. package/dist/config.d.ts +0 -14
  116. package/dist/config.d.ts.map +0 -1
  117. package/dist/config.js +0 -83
  118. package/dist/config.js.map +0 -1
  119. package/dist/index.d.ts.map +0 -1
  120. package/dist/scaffold/auth.d.ts +0 -3
  121. package/dist/scaffold/auth.d.ts.map +0 -1
  122. package/dist/scaffold/auth.js +0 -228
  123. package/dist/scaffold/auth.js.map +0 -1
  124. package/dist/scaffold/billing.d.ts +0 -3
  125. package/dist/scaffold/billing.d.ts.map +0 -1
  126. package/dist/scaffold/billing.js +0 -184
  127. package/dist/scaffold/billing.js.map +0 -1
  128. package/dist/scaffold/usage.d.ts +0 -3
  129. package/dist/scaffold/usage.d.ts.map +0 -1
  130. package/dist/scaffold/usage.js +0 -173
  131. package/dist/scaffold/usage.js.map +0 -1
  132. package/dist/scaffold/users.d.ts +0 -3
  133. package/dist/scaffold/users.d.ts.map +0 -1
  134. package/dist/scaffold/users.js +0 -135
  135. package/dist/scaffold/users.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ export interface PublishOptions {
2
+ draft?: boolean;
3
+ unpublish?: boolean;
4
+ name?: string;
5
+ tagline?: string;
6
+ description?: string;
7
+ iconKey?: string;
8
+ status?: string;
9
+ order?: string;
10
+ ctaHref?: string;
11
+ ctaLabel?: string;
12
+ slug?: string;
13
+ }
14
+ export declare function runPublish(opts: PublishOptions): Promise<void>;
@@ -0,0 +1,180 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { config } from '../lib/config.js';
6
+ import { apiRequest, CliApiError, CliNetworkError } from '../lib/api-client.js';
7
+ import { catalogUnpublishPayloadSchema, catalogUpsertPayloadSchema, neetruConfigSchema, } from '../lib/config-schema.js';
8
+ import { log } from '../utils/logger.js';
9
+ const CONFIG_FILENAMES = ['neetru.config.json', '.neetru.json'];
10
+ async function loadConfig(cwd) {
11
+ for (const filename of CONFIG_FILENAMES) {
12
+ const full = path.join(cwd, filename);
13
+ try {
14
+ const raw = await fs.readFile(full, 'utf8');
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(raw);
18
+ }
19
+ catch {
20
+ log.error(`${filename} não é JSON válido.`);
21
+ process.exit(1);
22
+ }
23
+ const result = neetruConfigSchema.safeParse(parsed);
24
+ if (!result.success) {
25
+ log.error(`Schema inválido em ${filename}:`);
26
+ for (const issue of result.error.issues) {
27
+ log.dim(` · ${issue.path.join('.') || '(root)'}: ${issue.message}`);
28
+ }
29
+ process.exit(1);
30
+ }
31
+ return { config: result.data, filename };
32
+ }
33
+ catch (err) {
34
+ if (err.code !== 'ENOENT')
35
+ throw err;
36
+ }
37
+ }
38
+ return null;
39
+ }
40
+ function applyOverrides(cfg, opts, draft) {
41
+ const publish = cfg.publish ?? {
42
+ tagline: '',
43
+ description: '',
44
+ iconKey: 'spark',
45
+ status: 'soon',
46
+ };
47
+ const slug = opts.slug ?? cfg.slug;
48
+ const name = opts.name ?? cfg.name;
49
+ const tagline = opts.tagline ?? publish.tagline;
50
+ const description = opts.description ?? publish.description;
51
+ const iconKey = (opts.iconKey ?? publish.iconKey);
52
+ const status = (opts.status ?? publish.status);
53
+ const ctaHref = opts.ctaHref ?? publish.ctaHref;
54
+ const ctaLabel = opts.ctaLabel ?? publish.ctaLabel;
55
+ const order = opts.order !== undefined
56
+ ? Number.parseInt(opts.order, 10)
57
+ : publish.order ?? 100;
58
+ if (Number.isNaN(order)) {
59
+ log.error('--order precisa ser um inteiro.');
60
+ process.exit(1);
61
+ }
62
+ const candidate = {
63
+ slug,
64
+ name,
65
+ tagline,
66
+ description,
67
+ iconKey,
68
+ status,
69
+ order,
70
+ published: !draft,
71
+ ctaHref,
72
+ ctaLabel,
73
+ };
74
+ const result = catalogUpsertPayloadSchema.safeParse(candidate);
75
+ if (!result.success) {
76
+ log.error('Payload inválido após aplicar overrides:');
77
+ for (const issue of result.error.issues) {
78
+ log.dim(` · ${issue.path.join('.') || '(root)'}: ${issue.message}`);
79
+ }
80
+ process.exit(1);
81
+ }
82
+ return { payload: result.data };
83
+ }
84
+ function ensureToken() {
85
+ const token = config.get('neetruApiKey');
86
+ if (!token) {
87
+ log.error('Nenhuma chave configurada. Execute: neetru login');
88
+ process.exit(2);
89
+ }
90
+ return token;
91
+ }
92
+ function handleApiError(error) {
93
+ if (error instanceof CliApiError) {
94
+ if (error.status === 401) {
95
+ log.error('Token inválido ou revogado. Execute: neetru login');
96
+ process.exit(2);
97
+ }
98
+ if (error.status === 403) {
99
+ log.error(`Permissão negada: ${error.message}`);
100
+ process.exit(3);
101
+ }
102
+ if (error.status >= 400 && error.status < 500) {
103
+ log.error(`Validação rejeitada (${error.status}): ${error.message}`);
104
+ process.exit(1);
105
+ }
106
+ log.error(`Erro do servidor (${error.status}): ${error.message}`);
107
+ process.exit(4);
108
+ }
109
+ if (error instanceof CliNetworkError) {
110
+ log.error(error.message);
111
+ process.exit(4);
112
+ }
113
+ log.error(error.message);
114
+ process.exit(4);
115
+ }
116
+ export async function runPublish(opts) {
117
+ log.banner();
118
+ ensureToken();
119
+ const cwd = process.cwd();
120
+ const loaded = await loadConfig(cwd);
121
+ if (!loaded) {
122
+ log.error(`Não encontrei neetru.config.json em ${cwd}`);
123
+ log.dim(' Crie um com: neetru init <name>');
124
+ process.exit(1);
125
+ }
126
+ const { config: cfg, filename } = loaded;
127
+ if (filename === '.neetru.json') {
128
+ log.warn('.neetru.json é deprecated — renomeie para neetru.config.json.');
129
+ }
130
+ if (opts.unpublish) {
131
+ const slug = opts.slug ?? cfg.slug;
132
+ const payload = catalogUnpublishPayloadSchema.safeParse({ slug });
133
+ if (!payload.success) {
134
+ log.error('slug inválido para unpublish.');
135
+ process.exit(1);
136
+ }
137
+ const spinner = ora({ text: `Despublicando ${slug}...`, color: 'blue' }).start();
138
+ try {
139
+ const res = await apiRequest('/api/cli/v1/catalog/unpublish', {
140
+ method: 'POST',
141
+ body: payload.data,
142
+ });
143
+ spinner.succeed(`Produto despublicado: ${chalk.bold(res.slug)}`);
144
+ log.dim(' Não aparece mais na landing pública.');
145
+ process.exit(0);
146
+ }
147
+ catch (error) {
148
+ spinner.fail('Falha ao despublicar.');
149
+ handleApiError(error);
150
+ }
151
+ }
152
+ if (!cfg.publish && !(opts.tagline && opts.description && opts.iconKey && opts.status)) {
153
+ log.error('Bloco "publish" ausente em neetru.config.json e flags incompletas. Adicione publish: { tagline, description, iconKey, status } ou passe via flags.');
154
+ process.exit(1);
155
+ }
156
+ const draft = !!opts.draft;
157
+ const { payload } = applyOverrides(cfg, opts, draft);
158
+ const spinner = ora({
159
+ text: draft ? `Salvando ${payload.slug} como draft...` : `Publicando ${payload.slug}...`,
160
+ color: 'blue',
161
+ }).start();
162
+ try {
163
+ const res = await apiRequest('/api/cli/v1/catalog/upsert', {
164
+ method: 'POST',
165
+ body: payload,
166
+ });
167
+ spinner.succeed(res.published
168
+ ? `Publicado: ${chalk.bold(res.slug)} (status: ${res.status})`
169
+ : `Salvo como draft: ${chalk.bold(res.slug)} (status: ${res.status})`);
170
+ if (res.published) {
171
+ log.dim(` https://neetru.com#produto-${res.slug}`);
172
+ }
173
+ process.exit(0);
174
+ }
175
+ catch (error) {
176
+ spinner.fail('Falha ao publicar.');
177
+ handleApiError(error);
178
+ }
179
+ }
180
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
- import { Command } from 'commander';
2
- export declare function statusCommand(): Command;
3
- //# sourceMappingURL=status.d.ts.map
1
+ export interface StatusOptions {
2
+ clientId?: string;
3
+ json?: boolean;
4
+ }
5
+ export declare function runStatus(opts: StatusOptions): Promise<void>;
@@ -1,99 +1,97 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.statusCommand = statusCommand;
7
- const commander_1 = require("commander");
8
- const chalk_1 = __importDefault(require("chalk"));
9
- const ora_1 = __importDefault(require("ora"));
10
- const config_1 = require("../config");
11
- function statusCommand() {
12
- const cmd = new commander_1.Command('status');
13
- cmd
14
- .description('Mostra o status atual do workspace Neetru')
15
- .option('--json', 'Output em JSON ao invés de tabela')
16
- .action(async (options) => {
17
- let config;
18
- try {
19
- config = (0, config_1.requireConfig)();
20
- }
21
- catch (e) {
22
- console.error(chalk_1.default.red(e.message));
23
- process.exit(1);
24
- }
25
- const global = (0, config_1.readGlobalConfig)();
26
- const apiKey = global.clientSecret ?? process.env.NEETRU_CLI_API_KEY;
27
- if (!apiKey) {
28
- console.error(chalk_1.default.red('Não autenticado. Execute neetru login primeiro.'));
29
- process.exit(1);
30
- }
31
- const spinner = (0, ora_1.default)('Buscando status...').start();
32
- let status;
33
- try {
34
- const res = await fetch(`${config.coreUrl}/api/v1/cli/workspace/status?clientId=${encodeURIComponent(config.clientId)}`, {
35
- headers: { Authorization: `Bearer ${apiKey}` },
36
- signal: AbortSignal.timeout(8000),
37
- });
38
- if (!res.ok) {
39
- spinner.fail(`HTTP ${res.status}`);
40
- if (res.status === 401)
41
- console.log(chalk_1.default.dim(' → Sessão expirada. Execute neetru login novamente.'));
42
- if (res.status === 404)
43
- console.log(chalk_1.default.dim(' Workspace não encontrado. Verifique seu clientId.'));
1
+ /**
2
+ * `neetru status` status atual do workspace.
3
+ *
4
+ * Workspace = ambiente de prototipação no Core (antes do deploy real em VM/Cloud Run).
5
+ * Endpoint: `GET /api/v1/cli/workspace/status?clientId=<oauthClientId>`.
6
+ *
7
+ * Owner passa `--client-id <id>` (oauthClientId visível em UI Core /workspaces/{id}).
8
+ * No futuro, este valor pode vir de `neetru.config.json` se o projeto tiver workspace associado.
9
+ */
10
+ import chalk from 'chalk';
11
+ import ora from 'ora';
12
+ import { apiRequest, CliApiError, CliNetworkError } from '../lib/api-client.js';
13
+ import { config } from '../lib/config.js';
14
+ import { log } from '../utils/logger.js';
15
+ function colorStatus(s) {
16
+ if (!s)
17
+ return chalk.dim('—');
18
+ if (['ativo', 'success', 'SUCCESS', 'active', 'operacional'].includes(s))
19
+ return chalk.green(s);
20
+ if (['failed', 'FAILURE', 'suspenso', 'expirado', 'desativado'].includes(s))
21
+ return chalk.red(s);
22
+ if (['pending', 'running', 'WORKING', 'em provisionamento'].includes(s))
23
+ return chalk.yellow(s);
24
+ return chalk.cyan(s);
25
+ }
26
+ export async function runStatus(opts) {
27
+ if (!opts.clientId) {
28
+ log.error('--client-id <oauthClientId> obrigatório.');
29
+ log.dim(' Encontre o oauthClientId em UI Core /workspaces/{id}.');
30
+ process.exit(1);
31
+ }
32
+ if (!config.get('neetruApiKey')) {
33
+ log.error('Não autenticado. Execute: neetru login');
34
+ process.exit(2);
35
+ }
36
+ const spinner = opts.json ? null : ora({ text: 'Buscando status…', color: 'blue' }).start();
37
+ let status;
38
+ try {
39
+ status = await apiRequest(`/api/v1/cli/workspace/status?clientId=${encodeURIComponent(opts.clientId)}`);
40
+ spinner?.stop();
41
+ }
42
+ catch (error) {
43
+ spinner?.fail('Falha ao buscar status.');
44
+ if (error instanceof CliApiError) {
45
+ if (error.status === 401) {
46
+ log.error('Sessão expirada. Execute: neetru login');
47
+ process.exit(2);
48
+ }
49
+ if (error.status === 404) {
50
+ log.error('Workspace não encontrado para este clientId.');
44
51
  process.exit(1);
45
52
  }
46
- status = await res.json();
47
- spinner.succeed('Status obtido');
48
- }
49
- catch (e) {
50
- spinner.fail(`Erro: ${e.message}`);
51
- process.exit(1);
52
- }
53
- if (options.json) {
54
- console.log(JSON.stringify(status, null, 2));
55
- return;
56
- }
57
- const statusColor = (s) => {
58
- if (!s)
59
- return chalk_1.default.dim('—');
60
- if (['ativo', 'success', 'SUCCESS', 'active'].includes(s))
61
- return chalk_1.default.green(s);
62
- if (['failed', 'FAILURE', 'suspenso', 'expirado'].includes(s))
63
- return chalk_1.default.red(s);
64
- if (['pending', 'running', 'WORKING', 'em provisionamento'].includes(s))
65
- return chalk_1.default.yellow(s);
66
- return chalk_1.default.cyan(s);
67
- };
68
- console.log('\n' + chalk_1.default.bold('Workspace Status'));
69
- console.log(chalk_1.default.dim('─'.repeat(50)));
70
- console.log(` ${chalk_1.default.dim('Workspace ID:')} ${chalk_1.default.cyan(status.workspaceId)}`);
71
- console.log(` ${chalk_1.default.dim('Status:')} ${statusColor(status.status)}`);
72
- if (status.primaryDomain) {
73
- console.log(` ${chalk_1.default.dim('Domain:')} ${chalk_1.default.cyan(status.primaryDomain)}`);
74
- }
75
- else if (status.temporaryDomain) {
76
- console.log(` ${chalk_1.default.dim('Dev Domain:')} ${chalk_1.default.cyan(status.temporaryDomain)}`);
77
- }
78
- if (status.resourceTier) {
79
- console.log(` ${chalk_1.default.dim('Tier:')} ${status.resourceTier}`);
53
+ log.error(`Erro do servidor (${error.status}): ${error.message}`);
54
+ process.exit(4);
80
55
  }
81
- console.log('');
82
- console.log(chalk_1.default.bold(' Last Build'));
83
- console.log(` ${chalk_1.default.dim(' ID:')} ${status.lastBuildId ? chalk_1.default.cyan(status.lastBuildId.slice(0, 12)) : chalk_1.default.dim('—')}`);
84
- console.log(` ${chalk_1.default.dim(' Status:')} ${statusColor(status.lastBuildStatus)}`);
85
- console.log('');
86
- console.log(chalk_1.default.bold(' Last Deployment'));
87
- console.log(` ${chalk_1.default.dim(' ID:')} ${status.lastDeploymentId ? chalk_1.default.cyan(status.lastDeploymentId.slice(0, 12)) : chalk_1.default.dim('—')}`);
88
- console.log(` ${chalk_1.default.dim(' Status:')} ${statusColor(status.lastDeploymentStatus)}`);
89
- if (status.expiresAt) {
90
- const expiresIn = Math.ceil((new Date(status.expiresAt).getTime() - Date.now()) / (1000 * 60 * 60 * 24));
91
- const color = expiresIn < 7 ? chalk_1.default.yellow : chalk_1.default.dim;
92
- console.log('');
93
- console.log(` ${color(`Expira em ${expiresIn} dias`)}`);
56
+ if (error instanceof CliNetworkError) {
57
+ log.error(error.message);
58
+ process.exit(4);
94
59
  }
95
- console.log('');
96
- });
97
- return cmd;
60
+ log.error(error.message);
61
+ process.exit(4);
62
+ }
63
+ if (opts.json) {
64
+ console.log(JSON.stringify(status, null, 2));
65
+ return;
66
+ }
67
+ console.log();
68
+ console.log(chalk.bold('Workspace Status'));
69
+ console.log(chalk.dim('─'.repeat(50)));
70
+ console.log(` ${chalk.dim('Workspace ID:')} ${chalk.cyan(status.workspaceId)}`);
71
+ console.log(` ${chalk.dim('Status:')} ${colorStatus(status.status)}`);
72
+ if (status.primaryDomain) {
73
+ console.log(` ${chalk.dim('Primary domain:')} ${chalk.cyan(status.primaryDomain)}`);
74
+ }
75
+ else if (status.temporaryDomain) {
76
+ console.log(` ${chalk.dim('Dev domain:')} ${chalk.cyan(status.temporaryDomain)}`);
77
+ }
78
+ if (status.resourceTier) {
79
+ console.log(` ${chalk.dim('Tier:')} ${status.resourceTier}`);
80
+ }
81
+ console.log();
82
+ console.log(chalk.bold(' Last Build'));
83
+ console.log(` ${chalk.dim(' ID:')} ${status.lastBuildId ? chalk.cyan(status.lastBuildId.slice(0, 12)) : chalk.dim('—')}`);
84
+ console.log(` ${chalk.dim(' Status:')} ${colorStatus(status.lastBuildStatus)}`);
85
+ console.log();
86
+ console.log(chalk.bold(' Last Deployment'));
87
+ console.log(` ${chalk.dim(' ID:')} ${status.lastDeploymentId ? chalk.cyan(status.lastDeploymentId.slice(0, 12)) : chalk.dim('—')}`);
88
+ console.log(` ${chalk.dim(' Status:')} ${colorStatus(status.lastDeploymentStatus)}`);
89
+ if (status.expiresAt) {
90
+ const expiresIn = Math.ceil((new Date(status.expiresAt).getTime() - Date.now()) / (1000 * 60 * 60 * 24));
91
+ const colored = expiresIn < 7 ? chalk.yellow : chalk.dim;
92
+ console.log();
93
+ console.log(` ${colored(`Expira em ${expiresIn} dias`)}`);
94
+ }
95
+ console.log();
98
96
  }
99
97
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface UpgradeOptions {
2
+ json?: boolean;
3
+ }
4
+ export interface UpgradeReport {
5
+ ok: boolean;
6
+ current: string;
7
+ latest: string | null;
8
+ upgradeAvailable: boolean;
9
+ message: string;
10
+ }
11
+ export declare function fetchLatest(fetchImpl?: typeof fetch): Promise<string | null>;
12
+ export declare function runUpgrade(opts?: UpgradeOptions): Promise<void>;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * `neetru upgrade` — verifica latest no npm e (opcionalmente) instala.
3
+ *
4
+ * Sprint 12 v2.0:
5
+ * - Faz fetch em `registry.npmjs.org/@neetru/cli`.
6
+ * - Compara dist-tags.latest com versão atual.
7
+ * - Se igual, exit 0.
8
+ * - Se diferente, exibe instrução de upgrade (npm install -g @neetru/cli@latest).
9
+ * - Em erro de rede, exit 0 com warning.
10
+ *
11
+ * NÃO executamos `npm install` automaticamente — preferimos que o usuário
12
+ * confirme. Auto-install pode quebrar pipelines CI/CD que pinaram versão.
13
+ */
14
+ import chalk from 'chalk';
15
+ const CLI_VERSION = '2.0.0';
16
+ const NPM_REGISTRY = 'https://registry.npmjs.org/@neetru/cli';
17
+ export async function fetchLatest(fetchImpl = fetch) {
18
+ const ctrl = new AbortController();
19
+ const timer = setTimeout(() => ctrl.abort(), 5000);
20
+ try {
21
+ const resp = await fetchImpl(NPM_REGISTRY, { signal: ctrl.signal });
22
+ if (!resp.ok)
23
+ return null;
24
+ const data = (await resp.json());
25
+ return data?.['dist-tags']?.latest ?? null;
26
+ }
27
+ finally {
28
+ clearTimeout(timer);
29
+ }
30
+ }
31
+ export async function runUpgrade(opts = {}) {
32
+ let latest = null;
33
+ let networkError = false;
34
+ try {
35
+ latest = await fetchLatest();
36
+ }
37
+ catch {
38
+ networkError = true;
39
+ }
40
+ const upgradeAvailable = latest !== null && latest !== CLI_VERSION;
41
+ let message;
42
+ if (networkError || latest === null) {
43
+ message = 'Não foi possível verificar latest (offline?). Tente mais tarde.';
44
+ }
45
+ else if (upgradeAvailable) {
46
+ message = `Versão ${latest} disponível. Atualize com: npm install -g @neetru/cli@latest`;
47
+ }
48
+ else {
49
+ message = `Você já está na latest (${CLI_VERSION}).`;
50
+ }
51
+ const report = {
52
+ ok: !networkError,
53
+ current: CLI_VERSION,
54
+ latest,
55
+ upgradeAvailable,
56
+ message,
57
+ };
58
+ if (opts.json) {
59
+ console.log(JSON.stringify(report, null, 2));
60
+ process.exit(0);
61
+ }
62
+ console.log(chalk.bold('\nNeetru CLI Upgrade\n'));
63
+ console.log(` atual: ${chalk.cyan(CLI_VERSION)}`);
64
+ console.log(` latest: ${latest ? chalk.cyan(latest) : chalk.dim('?')}`);
65
+ console.log();
66
+ if (upgradeAvailable) {
67
+ console.log(chalk.yellow(message));
68
+ }
69
+ else if (networkError) {
70
+ console.log(chalk.dim(message));
71
+ }
72
+ else {
73
+ console.log(chalk.green(message));
74
+ }
75
+ process.exit(0);
76
+ }
77
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1 @@
1
- import { Command } from 'commander';
2
- export declare function validateCommand(): Command;
3
- //# sourceMappingURL=validate.d.ts.map
1
+ export declare function runValidate(): Promise<void>;