@aiuby-ia/cli 0.3.0 → 0.4.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/README.md CHANGED
@@ -2,24 +2,26 @@
2
2
 
3
3
  Linha de comando e templates de partida do **AIUBY Compute**.
4
4
 
5
- > **Estado: prévia (0.3.0).** A CLI autentica, copia templates, cadastra aplicações e
5
+ > **Estado: prévia (0.4.0).** A CLI autentica, copia templates, cadastra aplicações e
6
6
  > revisões a partir do `aiuby.toml`, lê o catálogo de hardware e mostra o plano de
7
7
  > implantação. **Implantar funciona só em organizações com a prévia do runtime habilitada
8
8
  > pela AIUBY**: CPU no Google Cloud, até 1 vCPU e 1 GB, 1 réplica, endereço público e prazo
9
- > (a aplicação para sozinha). Nas demais, o pedido é recusado com os motivos. Logs, escala,
10
- > volumes, segredos e GPU ainda não existem.
9
+ > (a aplicação para sozinha), com `aiuby logs` para ver a saída. Nas demais, o pedido é
10
+ > recusado com os motivos. Escala, volumes, segredos e GPU ainda não existem.
11
11
 
12
12
  ## Instalação
13
13
 
14
- Precisa de Node.js 20 ou mais novo. O pacote é distribuído pelo site da AIUBY:
14
+ Precisa de Node.js 20 ou mais novo.
15
15
 
16
16
  ```bash
17
- npm install -g https://aiuby.com/cli/aiuby-cli-latest.tgz
17
+ npm install -g @aiuby-ia/cli
18
18
  aiuby --version
19
19
  ```
20
20
 
21
- Para fixar uma versão, troque `latest` pelo número (por exemplo `aiuby-cli-0.3.0.tgz`).
22
- Para atualizar, rode o mesmo comando de novo. Para remover: `npm uninstall -g @aiuby-ia/cli`.
21
+ Sem acesso ao registro do npm, o mesmo pacote está no site da AIUBY:
22
+ `npm install -g https://aiuby.com/cli/aiuby-cli-latest.tgz`.
23
+
24
+ Para atualizar, rode o comando de instalação de novo. Para remover: `npm uninstall -g @aiuby-ia/cli`.
23
25
 
24
26
  ## Primeiros passos
25
27
 
@@ -51,6 +53,7 @@ aiuby apps create # cadastra; não implanta
51
53
  aiuby apps update # depois de mudar o aiuby.toml: nova revisão
52
54
  aiuby deploy --dry-run minha-api
53
55
  aiuby deploy minha-api # só com a prévia do runtime; pede o escopo "Implantar no Compute"
56
+ aiuby logs minha-api
54
57
  aiuby stop minha-api
55
58
  ```
56
59
 
package/dist/aiuby.mjs CHANGED
@@ -20482,6 +20482,9 @@ var APP_SLUG = /^[a-z][a-z0-9-]{1,38}[a-z0-9]$/;
20482
20482
  var MAX_REPLICAS = 100;
20483
20483
  var CONTROL_CHARS = /[\u0000-\u001f\u007f-\u009f]/;
20484
20484
  var noControl = (v) => !CONTROL_CHARS.test(v);
20485
+ var ENV_NAME = /^[A-Z_][A-Z0-9_]{0,63}$/;
20486
+ var RESERVED_ENV = /* @__PURE__ */ new Set(["PORT", "K_SERVICE", "K_REVISION", "K_CONFIGURATION"]);
20487
+ var MAX_ENV_VARS = 50;
20485
20488
  var IMAGE_REF = /^(?!.*\/\/)[A-Za-z0-9][A-Za-z0-9._\-/:@]*$/;
20486
20489
  var HardwareRequest = external_exports.object({
20487
20490
  /** `any`: o planejador escolhe entre os provedores habilitados. */
@@ -20497,6 +20500,11 @@ var AppConfig = external_exports.object({
20497
20500
  image: external_exports.string().min(1).max(300).regex(IMAGE_REF, "image precisa ser uma refer\xEAncia de imagem de container, sem espa\xE7os").nullable().default(null),
20498
20501
  entrypoint: external_exports.string().min(1).max(300).refine(noControl, "entrypoint n\xE3o aceita caracteres de controle").nullable().default(null),
20499
20502
  port: external_exports.number().int().min(1).max(65535).default(8080),
20503
+ /**
20504
+ * Variáveis de ambiente da aplicação. Ficam na configuração, visíveis a quem vê a
20505
+ * aplicação: servem para ajuste, NÃO para segredo (senha, chave, token).
20506
+ */
20507
+ env: external_exports.record(external_exports.string().regex(ENV_NAME, "nome de vari\xE1vel: mai\xFAsculas, d\xEDgitos e sublinhado").refine((name) => !RESERVED_ENV.has(name), "nome reservado pela plataforma"), external_exports.string().max(2e3).refine(noControl, "valor n\xE3o aceita caracteres de controle")).refine((env) => Object.keys(env).length <= MAX_ENV_VARS, `no m\xE1ximo ${MAX_ENV_VARS} vari\xE1veis`).default({}),
20500
20508
  hardware: HardwareRequest,
20501
20509
  scaling: external_exports.object({
20502
20510
  minReplicas: external_exports.number().int().min(0).max(MAX_REPLICAS).default(0),
@@ -20672,6 +20680,18 @@ async function stop(io, args) {
20672
20680
  await apiPost(requireLogin(), `/api/platform/compute/apps/${encodeURIComponent(slug)}/deployments/stop`, void 0, io.fetcher).catch(scopeHint(DEPLOY_HINT));
20673
20681
  emit(io, { ok: true, slug }, () => io.out(`${slug} parada: o servi\xE7o foi apagado e o endere\xE7o n\xE3o responde mais.`));
20674
20682
  }
20683
+ async function logs(io, args) {
20684
+ const slug = args.find((a, i) => !a.startsWith("--") && args[i - 1] !== "--limit");
20685
+ if (!slug) throw new CliError("Uso: aiuby logs [--limit N] <identificador>", EXIT.usage);
20686
+ const flag = args.indexOf("--limit");
20687
+ const limit = flag >= 0 ? Number(args[flag + 1]) : 100;
20688
+ if (!Number.isInteger(limit) || limit < 1 || limit > 200) throw new CliError("--limit precisa ser um n\xFAmero de 1 a 200.", EXIT.usage);
20689
+ const data = await apiGet(requireLogin(), `/api/platform/compute/apps/${encodeURIComponent(slug)}/logs?limit=${limit}`, io.fetcher);
20690
+ emit(io, data, () => {
20691
+ if (data.lines.length === 0) return io.out(`Nenhuma linha de log desde a implanta\xE7\xE3o (revis\xE3o r${data.deployment.revision}).`);
20692
+ for (const line of [...data.lines].reverse()) io.out(`${line.time.replace("T", " ").slice(0, 19)} ${line.severity.padEnd(7)} ${line.text}`);
20693
+ });
20694
+ }
20675
20695
  async function capacityList(io, args) {
20676
20696
  const flag = args.indexOf("--provider");
20677
20697
  const provider = flag >= 0 ? args[flag + 1] : void 0;
@@ -20791,7 +20811,7 @@ var notYet = (command) => async () => {
20791
20811
  };
20792
20812
 
20793
20813
  // src/main.ts
20794
- var VERSION = "0.3.0";
20814
+ var VERSION = "0.4.0";
20795
20815
  var HELP = `aiuby ${VERSION} \u2014 linha de comando do AIUBY Compute
20796
20816
 
20797
20817
  Uso: aiuby <comando> [op\xE7\xF5es]
@@ -20811,10 +20831,11 @@ Dispon\xEDveis hoje:
20811
20831
  deploy --dry-run <identificador> Mostra o plano, sem criar nada
20812
20832
  deploy [--no-wait] <identificador> Implanta a revis\xE3o atual (s\xF3 em organiza\xE7\xE3o com a pr\xE9via do runtime)
20813
20833
  stop <identificador> Para a implanta\xE7\xE3o e apaga o servi\xE7o
20834
+ logs [--limit N] <identificador> \xDAltimas linhas de log da implanta\xE7\xE3o mais recente
20814
20835
  doctor Confere ambiente, credencial e API
20815
20836
 
20816
20837
  Ainda n\xE3o dispon\xEDveis:
20817
- run, logs, scale, rollback, volumes, secrets, domains
20838
+ run, scale, rollback, volumes, secrets, domains
20818
20839
 
20819
20840
  Op\xE7\xF5es gerais:
20820
20841
  --json Sa\xEDda em JSON
@@ -20823,7 +20844,7 @@ Op\xE7\xF5es gerais:
20823
20844
 
20824
20845
  Ambiente: AIUBY_TOKEN, AIUBY_API_URL, AIUBY_CONFIG_DIR
20825
20846
  C\xF3digos de sa\xEDda: 0 ok \xB7 1 erro \xB7 2 uso incorreto \xB7 3 n\xE3o autenticado \xB7 4 recusado \xB7 5 configura\xE7\xE3o inv\xE1lida`;
20826
- var PLANNED = ["run", "logs", "scale", "rollback", "volumes", "secrets", "domains"];
20847
+ var PLANNED = ["run", "scale", "rollback", "volumes", "secrets", "domains"];
20827
20848
  var ROUTES = {
20828
20849
  login,
20829
20850
  logout,
@@ -20838,6 +20859,7 @@ var ROUTES = {
20838
20859
  "config validate": configValidate,
20839
20860
  deploy,
20840
20861
  stop,
20862
+ logs,
20841
20863
  doctor
20842
20864
  };
20843
20865
  async function run(argv, io) {
package/docs/api.md CHANGED
@@ -74,10 +74,15 @@ Cadastra a aplicação com a primeira revisão. Nada é implantado. Responde `20
74
74
  ```json
75
75
  { "name": "Minha API", "slug": "minha-api",
76
76
  "config": { "runtime": "container", "image": "REGISTRO/minha-api:1", "port": 8080,
77
+ "env": { "LOG_LEVEL": "info" },
77
78
  "hardware": { "provider": "any", "cpu": 1, "memoryMb": 512 },
78
79
  "scaling": { "minReplicas": 0, "maxReplicas": 2 } } }
79
80
  ```
80
81
 
82
+ `config.env` são variáveis de ambiente (até 50; nomes em maiúsculas, dígitos e sublinhado;
83
+ `PORT` e os nomes `K_*` são da plataforma). Elas ficam visíveis a quem vê a aplicação: não
84
+ use para senha, chave ou token.
85
+
81
86
  Regras: `slug` com 3 a 40 caracteres (minúsculas, dígitos e hífen, começando por letra),
82
87
  único no workspace; `runtime` `container` exige `image`; campos desconhecidos são recusados.
83
88
  Limites: 50 aplicações por workspace, 200 revisões por aplicação.
@@ -102,6 +107,17 @@ Leitura. A implantação mais recente, já conferida com a conta de nuvem, ou `n
102
107
 
103
108
  `status`: `deploying`, `running`, `failed` ou `stopped`.
104
109
 
110
+ ### `GET /apps/{ref}/logs`
111
+
112
+ Leitura. Últimas linhas de log da implantação mais recente, da mais nova para a mais antiga
113
+ (`?limit=`, padrão 100, até 200). Vale também para implantação que falhou ou já parou. Só em
114
+ organização com a prévia do runtime; sem implantação, responde `409`. Limite: 20 leituras por minuto.
115
+
116
+ ```json
117
+ { "lines": [ { "time": "2026-11-12T10:05:00Z", "severity": "INFO", "text": "servidor no ar" } ],
118
+ "deployment": { "status": "running", "revision": 2 } }
119
+ ```
120
+
105
121
  ### `POST /apps/{ref}/deployments`
106
122
 
107
123
  Sessão de quem gerencia o workspace, ou chave com `compute:deploy`. Implanta a revisão atual.
package/docs/cli.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # Referência da CLI `aiuby`
2
2
 
3
- Versão 0.3.0. A CLI fala só com a API da AIUBY: nunca pede nem usa credenciais da AWS ou
3
+ Versão 0.4.0. A CLI fala só com a API da AIUBY: nunca pede nem usa credenciais da AWS ou
4
4
  do Google Cloud.
5
5
 
6
- Instalação: `npm install -g https://aiuby.com/cli/aiuby-cli-latest.tgz` (Node.js 20 ou mais novo).
6
+ Instalação: `npm install -g @aiuby-ia/cli` (Node.js 20 ou mais novo).
7
7
 
8
8
  ## Autenticação
9
9
 
@@ -53,6 +53,7 @@ runtime habilitada pela AIUBY. Fora dela, a API recusa com os motivos (código d
53
53
  | --- | --- |
54
54
  | `aiuby deploy [--no-wait] <identificador>` | Implanta a revisão atual no Google Cloud e acompanha até ficar em execução (até 3 minutos). Mostra o endereço público e o prazo. Reimplantar troca a revisão no mesmo endereço |
55
55
  | `aiuby stop <identificador>` | Para a implantação: o serviço é apagado e o endereço deixa de responder |
56
+ | `aiuby logs [--limit N] <identificador>` | Últimas linhas de log da implantação mais recente (padrão 100, até 200). Vale também para uma que falhou ou já parou |
56
57
 
57
58
  Limites da prévia: só CPU, até 1 vCPU e 1 GB, 1 réplica (escala a zero quando ociosa),
58
59
  endereço público sem autenticação, prazo de algumas horas. Sem cobrança nesta fase.
@@ -67,7 +68,7 @@ endereço público sem autenticação, prazo de algumas horas. Sem cobrança nes
67
68
 
68
69
  ## Ainda não disponíveis
69
70
 
70
- `run`, `logs`, `scale`, `rollback`, `volumes`, `secrets`
71
+ `run`, `scale`, `rollback`, `volumes`, `secrets`
71
72
  e `domains` respondem que ainda não estão disponíveis e saem com código 4. Nenhum deles chama a API.
72
73
 
73
74
  ## Opções gerais
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiuby-ia/cli",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Linha de comando do AIUBY Compute",
5
5
  "type": "module",
6
6
  "bin": {