@neetru/cli 2.28.7 → 2.28.8
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 +44 -0
- package/README.md +23 -0
- package/dist/commands/admin/oidc-login.js +6 -3
- package/dist/commands/admin/oidc-login.js.map +1 -1
- package/dist/commands/admin/sdk-credential.js +11 -6
- package/dist/commands/admin/sdk-credential.js.map +1 -1
- package/dist/commands/agent-release.js +14 -27
- package/dist/commands/agent-release.js.map +1 -1
- package/dist/commands/ai-models.js +9 -4
- package/dist/commands/ai-models.js.map +1 -1
- package/dist/commands/archive.js +9 -2
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/auth.js +17 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/autocomplete.d.ts +1 -1
- package/dist/commands/autocomplete.js +2 -0
- package/dist/commands/autocomplete.js.map +1 -1
- package/dist/commands/chat-menu.js +20 -6
- package/dist/commands/chat-menu.js.map +1 -1
- package/dist/commands/chat.d.ts +14 -0
- package/dist/commands/chat.js +32 -4
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config.js +7 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/db-move.d.ts +204 -0
- package/dist/commands/db-move.js +890 -0
- package/dist/commands/db-move.js.map +1 -0
- package/dist/commands/db.d.ts +14 -3
- package/dist/commands/db.js +102 -67
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.js +13 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev-up.d.ts +5 -0
- package/dist/commands/dev-up.js +29 -4
- package/dist/commands/dev-up.js.map +1 -1
- package/dist/commands/domains.js +48 -36
- package/dist/commands/domains.js.map +1 -1
- package/dist/commands/init.d.ts +0 -8
- package/dist/commands/init.js +14 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logs.js +18 -21
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mobile.d.ts +26 -0
- package/dist/commands/mobile.js +344 -0
- package/dist/commands/mobile.js.map +1 -0
- package/dist/commands/ops.d.ts +3 -0
- package/dist/commands/ops.js +21 -0
- package/dist/commands/ops.js.map +1 -1
- package/dist/commands/promote.js +13 -32
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/schema.d.ts +4 -0
- package/dist/commands/schema.js +25 -16
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/smoke.d.ts +123 -0
- package/dist/commands/smoke.js +529 -0
- package/dist/commands/smoke.js.map +1 -0
- package/dist/commands/vm-memory.d.ts +53 -0
- package/dist/commands/vm-memory.js +307 -0
- package/dist/commands/vm-memory.js.map +1 -0
- package/dist/commands/webhooks.d.ts +2 -0
- package/dist/commands/webhooks.js +7 -0
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/index.js +351 -15
- package/dist/index.js.map +1 -1
- package/dist/lib/mobile-local/index.d.ts +7 -0
- package/dist/lib/mobile-local/index.js +7 -0
- package/dist/lib/mobile-local/index.js.map +1 -0
- package/dist/lib/mobile-local/mobile-json.d.ts +57 -0
- package/dist/lib/mobile-local/mobile-json.js +169 -0
- package/dist/lib/mobile-local/mobile-json.js.map +1 -0
- package/dist/lib/product-config.d.ts +5 -0
- package/dist/lib/product-config.js +37 -0
- package/dist/lib/product-config.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@neetru/mobile-local` — contrato do registry local `.neetru/mobile.json`.
|
|
3
|
+
*
|
|
4
|
+
* Espelha `../db-local/db-json.ts`: registry per-repo que guarda os apps
|
|
5
|
+
* mobile (iOS/Android) registrados no Core via `neetru mobile init`. Mesmo
|
|
6
|
+
* formato — versionado, migração defensiva, escrita ATÔMICA via temp-file +
|
|
7
|
+
* rename no MESMO diretório.
|
|
8
|
+
*
|
|
9
|
+
* Sem dependências externas — só builtins do Node.
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { randomBytes } from 'node:crypto';
|
|
14
|
+
/** Registry v1 vazio — usado quando o arquivo ainda não existe. */
|
|
15
|
+
function emptyMobileJson() {
|
|
16
|
+
return { version: 1, apps: [] };
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// migrateMobileJson — qualquer entrada → v1 canônico
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
function isPlainObject(value) {
|
|
22
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
/** Coerção defensiva: extrai um array de fingerprints string do `raw`. */
|
|
25
|
+
function coerceFingerprints(raw) {
|
|
26
|
+
if (!Array.isArray(raw))
|
|
27
|
+
return undefined;
|
|
28
|
+
const out = raw.filter((v) => typeof v === 'string');
|
|
29
|
+
return out.length > 0 ? out : undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Coerce uma entrada de app arbitrária para `MobileJsonApp`.
|
|
33
|
+
* Retorna `null` quando a entrada não tem os campos mínimos válidos
|
|
34
|
+
* (descartável — não trava o registry inteiro por uma entrada corrompida).
|
|
35
|
+
*/
|
|
36
|
+
function coerceApp(raw) {
|
|
37
|
+
if (!isPlainObject(raw))
|
|
38
|
+
return null;
|
|
39
|
+
const { id, platform, redirectUri, oidcClientId } = raw;
|
|
40
|
+
if (typeof id !== 'string' || !id)
|
|
41
|
+
return null;
|
|
42
|
+
if (platform !== 'ios' && platform !== 'android')
|
|
43
|
+
return null;
|
|
44
|
+
if (typeof redirectUri !== 'string' || !redirectUri)
|
|
45
|
+
return null;
|
|
46
|
+
if (typeof oidcClientId !== 'string' || !oidcClientId)
|
|
47
|
+
return null;
|
|
48
|
+
const entry = {
|
|
49
|
+
id,
|
|
50
|
+
platform,
|
|
51
|
+
redirectUri,
|
|
52
|
+
oidcClientId,
|
|
53
|
+
status: typeof raw.status === 'string' && raw.status ? raw.status : 'active',
|
|
54
|
+
};
|
|
55
|
+
if (typeof raw.name === 'string')
|
|
56
|
+
entry.name = raw.name;
|
|
57
|
+
if (typeof raw.bundleId === 'string')
|
|
58
|
+
entry.bundleId = raw.bundleId;
|
|
59
|
+
if (typeof raw.teamId === 'string')
|
|
60
|
+
entry.teamId = raw.teamId;
|
|
61
|
+
if (typeof raw.packageName === 'string')
|
|
62
|
+
entry.packageName = raw.packageName;
|
|
63
|
+
const fingerprints = coerceFingerprints(raw.shaCertFingerprints);
|
|
64
|
+
if (fingerprints)
|
|
65
|
+
entry.shaCertFingerprints = fingerprints;
|
|
66
|
+
return entry;
|
|
67
|
+
}
|
|
68
|
+
/** Reduz um array arbitrário a entradas de app válidas. */
|
|
69
|
+
function coerceAppArray(raw) {
|
|
70
|
+
if (!Array.isArray(raw))
|
|
71
|
+
return [];
|
|
72
|
+
const out = [];
|
|
73
|
+
for (const entry of raw) {
|
|
74
|
+
const app = coerceApp(entry);
|
|
75
|
+
if (app)
|
|
76
|
+
out.push(app);
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Migra qualquer entrada para um `MobileJson` v1 estruturalmente válido.
|
|
82
|
+
*
|
|
83
|
+
* - v1 válido → normalizado (entradas malformadas reparadas ou descartadas).
|
|
84
|
+
* - objeto sem `version` → upgrade best-effort (trata como v1).
|
|
85
|
+
* - `null` / não-objeto / array / garbage → lança.
|
|
86
|
+
*
|
|
87
|
+
* NUNCA retorna algo que não seja um `MobileJson` v1 válido.
|
|
88
|
+
*/
|
|
89
|
+
export function migrateMobileJson(raw) {
|
|
90
|
+
if (!isPlainObject(raw)) {
|
|
91
|
+
throw new Error(`migrateMobileJson: conteúdo inválido — esperava um objeto, recebeu ` +
|
|
92
|
+
`${raw === null ? 'null' : Array.isArray(raw) ? 'array' : typeof raw}.`);
|
|
93
|
+
}
|
|
94
|
+
const version = raw.version;
|
|
95
|
+
if (version === 1 || version === undefined) {
|
|
96
|
+
return { version: 1, apps: coerceAppArray(raw.apps) };
|
|
97
|
+
}
|
|
98
|
+
throw new Error(`migrateMobileJson: versão de registry não suportada (${JSON.stringify(version)}). ` +
|
|
99
|
+
`Versões aceitas: 1 ou ausente.`);
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// readMobileJson / writeMobileJson
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
/**
|
|
105
|
+
* Lê + parseia + migra um `.neetru/mobile.json`.
|
|
106
|
+
*
|
|
107
|
+
* Arquivo ausente → registry v1 vazio (não é erro — é um registry novo).
|
|
108
|
+
* JSON inválido → lança um `Error` nomeando o path.
|
|
109
|
+
*/
|
|
110
|
+
export function readMobileJson(filePath) {
|
|
111
|
+
let raw;
|
|
112
|
+
try {
|
|
113
|
+
raw = fs.readFileSync(filePath, 'utf8');
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (err.code === 'ENOENT') {
|
|
117
|
+
return emptyMobileJson();
|
|
118
|
+
}
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
let parsed;
|
|
122
|
+
try {
|
|
123
|
+
parsed = JSON.parse(raw);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
throw new Error(`readMobileJson: JSON inválido em ${filePath} — ${err.message}`);
|
|
127
|
+
}
|
|
128
|
+
return migrateMobileJson(parsed);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Escreve um `MobileJson` de forma ATÔMICA.
|
|
132
|
+
*
|
|
133
|
+
* Estratégia: escreve num arquivo temporário no MESMO diretório do destino
|
|
134
|
+
* (rename só é atômico dentro do mesmo filesystem) e faz `renameSync` —
|
|
135
|
+
* que sobrescreve o arquivo existente tanto no Windows quanto no POSIX.
|
|
136
|
+
*
|
|
137
|
+
* Cria o diretório pai se ausente. Se algo falhar depois do temp ser criado,
|
|
138
|
+
* tenta remover o temp (best-effort) pra não deixar lixo `.tmp-*`.
|
|
139
|
+
*/
|
|
140
|
+
export function writeMobileJson(filePath, data) {
|
|
141
|
+
const dir = path.dirname(filePath);
|
|
142
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
143
|
+
const tmpPath = path.join(dir, `${path.basename(filePath)}.tmp-${process.pid}-${randomBytes(6).toString('hex')}`);
|
|
144
|
+
const payload = JSON.stringify(data, null, 2) + '\n';
|
|
145
|
+
try {
|
|
146
|
+
fs.writeFileSync(tmpPath, payload, 'utf8');
|
|
147
|
+
fs.renameSync(tmpPath, filePath);
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
// Best-effort: remove o temp pra não deixar lixo se algo falhou.
|
|
151
|
+
try {
|
|
152
|
+
fs.rmSync(tmpPath, { force: true });
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
/* ignora — limpeza best-effort */
|
|
156
|
+
}
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** Adiciona (ou substitui por `id`) uma entrada e retorna o `MobileJson` atualizado. */
|
|
161
|
+
export function upsertMobileApp(mobileJson, app) {
|
|
162
|
+
const withoutExisting = mobileJson.apps.filter((a) => a.id !== app.id);
|
|
163
|
+
return { version: 1, apps: [...withoutExisting, app] };
|
|
164
|
+
}
|
|
165
|
+
/** Remove uma entrada por `id` e retorna o `MobileJson` atualizado. */
|
|
166
|
+
export function removeMobileApp(mobileJson, id) {
|
|
167
|
+
return { version: 1, apps: mobileJson.apps.filter((a) => a.id !== id) };
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=mobile-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-json.js","sourceRoot":"","sources":["../../../src/lib/mobile-local/mobile-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `loadProductConfig` — lê `neetru.config.json` (ou o legado `.neetru.json`)
|
|
3
|
+
* do cwd e retorna a config do produto atual (pelo menos `slug`).
|
|
4
|
+
*
|
|
5
|
+
* Extraído (2026-09, feature `neetru mobile`) de `commands/db.ts` — o repo
|
|
6
|
+
* tinha 3 cópias quase-idênticas espalhadas (`db.ts:247`, `dev.ts:151`,
|
|
7
|
+
* `promote.ts:42`). Esta é a versão canônica (a mais estrita: valida
|
|
8
|
+
* `slug` como string não-vazia antes de retornar). Comandos novos que
|
|
9
|
+
* precisam do slug do produto atual devem importar DAQUI — não duplicar
|
|
10
|
+
* mais uma cópia.
|
|
11
|
+
*
|
|
12
|
+
* `db.ts` foi migrado para reusar este módulo; `dev.ts`/`promote.ts`
|
|
13
|
+
* mantêm suas cópias locais por ora (fora do escopo desta mudança).
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'node:fs/promises';
|
|
16
|
+
import * as fsSync from 'node:fs';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
const CONFIG_FILES = ['neetru.config.json', '.neetru.json'];
|
|
19
|
+
export async function loadProductConfig() {
|
|
20
|
+
for (const name of CONFIG_FILES) {
|
|
21
|
+
const filePath = path.resolve(process.cwd(), name);
|
|
22
|
+
if (!fsSync.existsSync(filePath))
|
|
23
|
+
continue;
|
|
24
|
+
try {
|
|
25
|
+
const raw = await fs.readFile(filePath, 'utf8');
|
|
26
|
+
const parsed = JSON.parse(raw);
|
|
27
|
+
if (typeof parsed.slug !== 'string' || !parsed.slug)
|
|
28
|
+
return null;
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=product-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-config.js","sourceRoot":"","sources":["../../src/lib/product-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,oBAAoB,EAAE,cAAc,CAAU,CAAC;AAOrE,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC3C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;YAC/C,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACjE,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED