@neetru/cli 2.29.0 → 2.32.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 (259) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/README.md +63 -17
  3. package/dist/cli-kit/choices.d.ts +33 -0
  4. package/dist/cli-kit/choices.js +32 -0
  5. package/dist/cli-kit/command-context.d.ts +98 -0
  6. package/dist/cli-kit/command-context.js +108 -0
  7. package/dist/cli-kit/errors.d.ts +79 -0
  8. package/dist/cli-kit/errors.js +94 -0
  9. package/dist/cli-kit/index.d.ts +8 -0
  10. package/dist/cli-kit/index.js +8 -0
  11. package/dist/cli-kit/suggest.d.ts +74 -0
  12. package/dist/cli-kit/suggest.js +207 -0
  13. package/dist/commands/admin/oidc-login.js +1 -1
  14. package/dist/commands/admin/sdk-credential.js +1 -1
  15. package/dist/commands/autocomplete.d.ts +1 -1
  16. package/dist/commands/autocomplete.js +1 -0
  17. package/dist/commands/bug.d.ts +59 -0
  18. package/dist/commands/bug.js +114 -2
  19. package/dist/commands/build.d.ts +24 -1
  20. package/dist/commands/build.js +195 -73
  21. package/dist/commands/chat.d.ts +94 -1
  22. package/dist/commands/chat.js +258 -26
  23. package/dist/commands/customers.js +1 -1
  24. package/dist/commands/db-move.js +3 -3
  25. package/dist/commands/db.js +17 -24
  26. package/dist/commands/deploy.d.ts +136 -2
  27. package/dist/commands/deploy.js +547 -69
  28. package/dist/commands/deployments.js +11 -6
  29. package/dist/commands/dev-context.js +15 -5
  30. package/dist/commands/dev-up.d.ts +7 -5
  31. package/dist/commands/dev-up.js +24 -23
  32. package/dist/commands/docs-produto.d.ts +90 -0
  33. package/dist/commands/docs-produto.js +384 -0
  34. package/dist/commands/doctor.js +36 -1
  35. package/dist/commands/domains.js +85 -4
  36. package/dist/commands/env.d.ts +9 -3
  37. package/dist/commands/env.js +23 -3
  38. package/dist/commands/infra-read.js +2 -2
  39. package/dist/commands/init.d.ts +2 -0
  40. package/dist/commands/init.js +14 -1
  41. package/dist/commands/login.js +35 -8
  42. package/dist/commands/logs.js +12 -4
  43. package/dist/commands/mobile.js +33 -9
  44. package/dist/commands/new.d.ts +31 -1
  45. package/dist/commands/new.js +94 -4
  46. package/dist/commands/open.js +16 -6
  47. package/dist/commands/ops.js +1 -1
  48. package/dist/commands/products-db.d.ts +1 -0
  49. package/dist/commands/products-db.js +41 -8
  50. package/dist/commands/products.d.ts +17 -3
  51. package/dist/commands/products.js +84 -16
  52. package/dist/commands/promote.js +30 -5
  53. package/dist/commands/secrets.d.ts +91 -0
  54. package/dist/commands/secrets.js +471 -0
  55. package/dist/commands/servers.js +6 -4
  56. package/dist/commands/status.js +2 -2
  57. package/dist/commands/support.js +5 -3
  58. package/dist/commands/tenants.js +28 -16
  59. package/dist/commands/upgrade.d.ts +9 -0
  60. package/dist/commands/upgrade.js +50 -1
  61. package/dist/commands/vm-memory.js +1 -0
  62. package/dist/commands/webhooks.d.ts +2 -0
  63. package/dist/commands/webhooks.js +9 -3
  64. package/dist/commands/workspaces.js +42 -11
  65. package/dist/index.js +142 -20
  66. package/dist/lib/api-client.d.ts +22 -1
  67. package/dist/lib/api-client.js +79 -8
  68. package/dist/lib/api-error.d.ts +14 -0
  69. package/dist/lib/api-error.js +107 -46
  70. package/dist/lib/build-targets.d.ts +127 -0
  71. package/dist/lib/build-targets.js +348 -0
  72. package/dist/lib/cli-error.d.ts +13 -0
  73. package/dist/lib/cli-error.js +24 -0
  74. package/dist/lib/cli-write.d.ts +43 -9
  75. package/dist/lib/cli-write.js +154 -45
  76. package/dist/lib/compose-generator.d.ts +13 -9
  77. package/dist/lib/compose-generator.js +28 -60
  78. package/dist/lib/config-schema.d.ts +36 -2
  79. package/dist/lib/config-schema.js +11 -0
  80. package/dist/lib/db-local/db-json.d.ts +1 -1
  81. package/dist/lib/db-local/db-json.js +13 -5
  82. package/dist/lib/db-local/env.d.ts +15 -3
  83. package/dist/lib/db-local/env.js +37 -10
  84. package/dist/lib/db-pipeline/build-deps.d.ts +5 -1
  85. package/dist/lib/db-pipeline/build-deps.js +23 -3
  86. package/dist/lib/db-pipeline/types.d.ts +6 -2
  87. package/dist/lib/db-pipeline/types.js +0 -18
  88. package/dist/lib/deploy-target-contract.d.ts +152 -0
  89. package/dist/lib/deploy-target-contract.js +411 -0
  90. package/dist/lib/env-file-do-build.d.ts +19 -0
  91. package/dist/lib/env-file-do-build.js +44 -0
  92. package/dist/lib/envs.d.ts +108 -0
  93. package/dist/lib/envs.js +127 -0
  94. package/dist/lib/fs-seguro.d.ts +63 -0
  95. package/dist/lib/fs-seguro.js +108 -0
  96. package/dist/lib/mobile-local/mobile-json.js +10 -4
  97. package/dist/lib/pickers.d.ts +44 -7
  98. package/dist/lib/pickers.js +60 -4
  99. package/dist/lib/product-docs/check.d.ts +62 -0
  100. package/dist/lib/product-docs/check.js +489 -0
  101. package/dist/lib/product-docs/config.d.ts +66 -0
  102. package/dist/lib/product-docs/config.js +234 -0
  103. package/dist/lib/product-docs/dates.d.ts +17 -0
  104. package/dist/lib/product-docs/dates.js +41 -0
  105. package/dist/lib/product-docs/frontmatter.d.ts +43 -0
  106. package/dist/lib/product-docs/frontmatter.js +302 -0
  107. package/dist/lib/product-docs/git.d.ts +16 -0
  108. package/dist/lib/product-docs/git.js +92 -0
  109. package/dist/lib/product-docs/markdown.d.ts +27 -0
  110. package/dist/lib/product-docs/markdown.js +98 -0
  111. package/dist/lib/product-docs/ops.d.ts +133 -0
  112. package/dist/lib/product-docs/ops.js +975 -0
  113. package/dist/lib/product-docs/structure.d.ts +61 -0
  114. package/dist/lib/product-docs/structure.js +239 -0
  115. package/dist/lib/product-docs/sync.d.ts +107 -0
  116. package/dist/lib/product-docs/sync.js +322 -0
  117. package/dist/lib/product-docs/taxonomy.d.ts +46 -0
  118. package/dist/lib/product-docs/taxonomy.js +163 -0
  119. package/dist/lib/product-docs/templates.d.ts +53 -0
  120. package/dist/lib/product-docs/templates.js +245 -0
  121. package/dist/lib/public-secret-scan.d.ts +117 -0
  122. package/dist/lib/public-secret-scan.js +771 -0
  123. package/dist/lib/render.d.ts +16 -0
  124. package/dist/lib/render.js +34 -4
  125. package/dist/lib/segredo-produto.d.ts +124 -0
  126. package/dist/lib/segredo-produto.js +336 -0
  127. package/dist/lib/texto-utf8.d.ts +96 -0
  128. package/dist/lib/texto-utf8.js +196 -0
  129. package/package.json +2 -1
  130. package/dist/cli-kit/format.js.map +0 -1
  131. package/dist/cli-kit/glyphs.js.map +0 -1
  132. package/dist/cli-kit/index.js.map +0 -1
  133. package/dist/cli-kit/palette.js.map +0 -1
  134. package/dist/commands/add.js.map +0 -1
  135. package/dist/commands/admin/iam-check.js.map +0 -1
  136. package/dist/commands/admin/oidc-login.js.map +0 -1
  137. package/dist/commands/admin/sdk-credential.js.map +0 -1
  138. package/dist/commands/agent-release.js.map +0 -1
  139. package/dist/commands/agent-write.js.map +0 -1
  140. package/dist/commands/ai-models.js.map +0 -1
  141. package/dist/commands/ai.js.map +0 -1
  142. package/dist/commands/api-catalog.js.map +0 -1
  143. package/dist/commands/archive.js.map +0 -1
  144. package/dist/commands/artifact-registry.js.map +0 -1
  145. package/dist/commands/audit.js.map +0 -1
  146. package/dist/commands/auth.js.map +0 -1
  147. package/dist/commands/autocomplete.js.map +0 -1
  148. package/dist/commands/billing.js.map +0 -1
  149. package/dist/commands/bootstrap.js.map +0 -1
  150. package/dist/commands/bug.js.map +0 -1
  151. package/dist/commands/build.js.map +0 -1
  152. package/dist/commands/chat-menu.js.map +0 -1
  153. package/dist/commands/chat.js.map +0 -1
  154. package/dist/commands/cloud-run.js.map +0 -1
  155. package/dist/commands/code.js.map +0 -1
  156. package/dist/commands/config.js.map +0 -1
  157. package/dist/commands/customers.js.map +0 -1
  158. package/dist/commands/db-move.js.map +0 -1
  159. package/dist/commands/db.js.map +0 -1
  160. package/dist/commands/deploy.js.map +0 -1
  161. package/dist/commands/deployments.js.map +0 -1
  162. package/dist/commands/dev-context.js.map +0 -1
  163. package/dist/commands/dev-up.js.map +0 -1
  164. package/dist/commands/dev.js.map +0 -1
  165. package/dist/commands/docs.js.map +0 -1
  166. package/dist/commands/doctor.js.map +0 -1
  167. package/dist/commands/domains.js.map +0 -1
  168. package/dist/commands/dr.js.map +0 -1
  169. package/dist/commands/env.js.map +0 -1
  170. package/dist/commands/hosting-write.js.map +0 -1
  171. package/dist/commands/infra-read.js.map +0 -1
  172. package/dist/commands/init.js.map +0 -1
  173. package/dist/commands/login.js.map +0 -1
  174. package/dist/commands/logout.js.map +0 -1
  175. package/dist/commands/logs.js.map +0 -1
  176. package/dist/commands/mobile.js.map +0 -1
  177. package/dist/commands/mocks.js.map +0 -1
  178. package/dist/commands/new.js.map +0 -1
  179. package/dist/commands/open.js.map +0 -1
  180. package/dist/commands/ops.js.map +0 -1
  181. package/dist/commands/products-db.js.map +0 -1
  182. package/dist/commands/products.js.map +0 -1
  183. package/dist/commands/promote.js.map +0 -1
  184. package/dist/commands/publish.js.map +0 -1
  185. package/dist/commands/schema.js.map +0 -1
  186. package/dist/commands/servers.js.map +0 -1
  187. package/dist/commands/smoke.js.map +0 -1
  188. package/dist/commands/status.js.map +0 -1
  189. package/dist/commands/support.js.map +0 -1
  190. package/dist/commands/surface-status.js.map +0 -1
  191. package/dist/commands/tenants.js.map +0 -1
  192. package/dist/commands/ui.js.map +0 -1
  193. package/dist/commands/upgrade.js.map +0 -1
  194. package/dist/commands/validate.js.map +0 -1
  195. package/dist/commands/vm-memory.js.map +0 -1
  196. package/dist/commands/vm.js.map +0 -1
  197. package/dist/commands/webhooks.js.map +0 -1
  198. package/dist/commands/whoami.js.map +0 -1
  199. package/dist/commands/workspaces.js.map +0 -1
  200. package/dist/index.js.map +0 -1
  201. package/dist/lib/agent-artifact-url.js.map +0 -1
  202. package/dist/lib/agent-commands.js.map +0 -1
  203. package/dist/lib/ai/auth-discovery.js.map +0 -1
  204. package/dist/lib/ai/context.js.map +0 -1
  205. package/dist/lib/ai/orchestrator.js.map +0 -1
  206. package/dist/lib/api-client.js.map +0 -1
  207. package/dist/lib/api-error.js.map +0 -1
  208. package/dist/lib/auth.js.map +0 -1
  209. package/dist/lib/cli-read.js.map +0 -1
  210. package/dist/lib/cli-write.js.map +0 -1
  211. package/dist/lib/code-agent-budget.js.map +0 -1
  212. package/dist/lib/code-agent-files.js.map +0 -1
  213. package/dist/lib/code-agent-gateway.js.map +0 -1
  214. package/dist/lib/code-agent-git-tools.js.map +0 -1
  215. package/dist/lib/code-agent-protocol.js.map +0 -1
  216. package/dist/lib/code-agent-session.js.map +0 -1
  217. package/dist/lib/code-agent-settings.js.map +0 -1
  218. package/dist/lib/code-agent-skills.js.map +0 -1
  219. package/dist/lib/code-agent-subagents.js.map +0 -1
  220. package/dist/lib/code-agent-tools.js.map +0 -1
  221. package/dist/lib/code-agent-tui.js.map +0 -1
  222. package/dist/lib/code-agent-types.js.map +0 -1
  223. package/dist/lib/code-agent-ui.js.map +0 -1
  224. package/dist/lib/code-agent-web-tools.js.map +0 -1
  225. package/dist/lib/code-agent-write-tools.js.map +0 -1
  226. package/dist/lib/compose-generator.js.map +0 -1
  227. package/dist/lib/config-schema.js.map +0 -1
  228. package/dist/lib/config.js.map +0 -1
  229. package/dist/lib/db-local/db-json.js.map +0 -1
  230. package/dist/lib/db-local/env.js.map +0 -1
  231. package/dist/lib/db-local/fingerprint.js.map +0 -1
  232. package/dist/lib/db-local/index.js.map +0 -1
  233. package/dist/lib/db-pipeline/build-deps.js.map +0 -1
  234. package/dist/lib/db-pipeline/errors.js.map +0 -1
  235. package/dist/lib/db-pipeline/index.js.map +0 -1
  236. package/dist/lib/db-pipeline/pipeline.js.map +0 -1
  237. package/dist/lib/db-pipeline/rehearse.js.map +0 -1
  238. package/dist/lib/db-pipeline/types.js.map +0 -1
  239. package/dist/lib/dev-local-context.js.map +0 -1
  240. package/dist/lib/iam-preflight.js.map +0 -1
  241. package/dist/lib/mobile-local/index.js.map +0 -1
  242. package/dist/lib/mobile-local/mobile-json.js.map +0 -1
  243. package/dist/lib/pickers.js.map +0 -1
  244. package/dist/lib/product-config.js.map +0 -1
  245. package/dist/lib/render.js.map +0 -1
  246. package/dist/lib/schema-cache.js.map +0 -1
  247. package/dist/lib/sse.js.map +0 -1
  248. package/dist/lib/telemetry.js.map +0 -1
  249. package/dist/lib/token-resolver.js.map +0 -1
  250. package/dist/lib/url-allowlist.js.map +0 -1
  251. package/dist/lib/version-check.js.map +0 -1
  252. package/dist/utils/logger.js.map +0 -1
  253. package/dist/utils/logo.js.map +0 -1
  254. package/dist/utils/safe-exit.js.map +0 -1
  255. package/dist/utils/spinner-registry.js.map +0 -1
  256. package/dist/version.js.map +0 -1
  257. package/templates/dev/Dockerfile.agent +0 -39
  258. package/templates/dev/agent-entrypoint.sh +0 -41
  259. package/templates/dev/docker-compose.dev.yml +0 -63
@@ -1,3 +1,61 @@
1
+ interface BugRow {
2
+ id: string;
3
+ title?: string;
4
+ status?: string;
5
+ severity?: string;
6
+ category?: string;
7
+ assignedTo?: string;
8
+ productId?: string;
9
+ reportedAt?: unknown;
10
+ updatedAt?: unknown;
11
+ reportedBy?: {
12
+ actorType?: string;
13
+ actorId?: string;
14
+ email?: string;
15
+ };
16
+ description?: string;
17
+ reproductionSteps?: string;
18
+ expectedBehavior?: string;
19
+ actualBehavior?: string;
20
+ resolution?: {
21
+ summary?: string;
22
+ commitSha?: string;
23
+ resolvedBy?: string;
24
+ resolvedAt?: unknown;
25
+ };
26
+ comments?: Array<{
27
+ author: string;
28
+ body: string;
29
+ at?: unknown;
30
+ }>;
31
+ environment?: {
32
+ cliVersion?: string;
33
+ sdkVersion?: string;
34
+ nodeVersion?: string;
35
+ os?: string;
36
+ };
37
+ }
38
+ /**
39
+ * Limpa o que o usuário colou: espaços, reticências da tabela antiga, caixa
40
+ * alta, e aceita o hex sem o `bug_` na frente (`a4f84c1b` → `bug_a4f84c1b`).
41
+ */
42
+ export declare function normalizarEntradaDeId(entrada: string): string;
43
+ export type ResolucaoDeIdDeBug = {
44
+ ok: true;
45
+ id: string;
46
+ } | {
47
+ ok: false;
48
+ motivo: 'curto_demais' | 'nao_encontrado' | 'ambiguo';
49
+ candidatos: BugRow[];
50
+ };
51
+ /** Pura: decide o id a partir da entrada e da lista. Testável sem rede. */
52
+ export declare function escolherBugPorPrefixo(entrada: string, rows: BugRow[]): ResolucaoDeIdDeBug;
53
+ /**
54
+ * Resolve o id que o usuário digitou pro id completo. Id completo não custa
55
+ * chamada extra; prefixo custa UMA listagem. Falha sai com mensagem que diz o
56
+ * que fazer, em vez do "não encontrado" que mentia.
57
+ */
58
+ export declare function resolverIdDoBug(entrada: string, token: string, json?: boolean): Promise<string>;
1
59
  export interface BugReportOptions {
2
60
  title?: string;
3
61
  body?: string;
@@ -85,3 +143,4 @@ export interface BugCommentOptions {
85
143
  * neetru bug comment bug_abc123 --body "Testei em Node 22 — reproduzível."
86
144
  */
87
145
  export declare function runBugComment(id: string, opts: BugCommentOptions): Promise<void>;
146
+ export {};
@@ -21,6 +21,108 @@ import { printWriteResult } from '../lib/cli-write.js';
21
21
  import { renderTable, fmtTimestamp } from '../lib/render.js';
22
22
  import { log } from '../utils/logger.js';
23
23
  import { safeExit } from '../utils/safe-exit.js';
24
+ // ─── Id do bug: inteiro na tela, prefixo como atalho ─────────────────────────
25
+ //
26
+ // bug_a4f84c1b (2026-10-12): o id que o Core gera tem 36 caracteres
27
+ // (`bug_` + uuid sem hífen) e a tabela cortava em 24 com `…`. O usuário copiava
28
+ // o que via, e `bug show` respondia "não encontrado" — negando a EXISTÊNCIA de
29
+ // um bug que existe. O próprio Dev Core caiu nisso consultando bug_a8375858.
30
+ //
31
+ // A tabela mostra o id INTEIRO: é o único handle que funciona sempre. A primeira
32
+ // versão deste conserto mostrava um id curto (`bug_` + 8 hex), e a revisão
33
+ // independente reproduziu em produção o defeito de novo: numa listagem filtrada
34
+ // (`--status resolved`), 38 de 200 linhas estavam fora da janela que a resolução
35
+ // de prefixo enxerga — a tabela imprimia de novo um handle que não resolvia.
36
+ //
37
+ // O prefixo continua aceito como ATALHO, pra quem digita ou cola o que o time
38
+ // escreve no chat (`bug_a4f84c1b`). Ambíguo lista candidatos; não achado NUNCA
39
+ // afirma que o bug não existe — só que não estava no que a listagem devolveu.
40
+ /** Formato do id gerado pelo Core (`bug_${randomUUID().replace(/-/g, '')}`). */
41
+ const ID_COMPLETO = /^bug_[0-9a-f]{32}$/;
42
+ /** Mínimo de hex depois de `bug_` pra aceitar como prefixo. */
43
+ const PREFIXO_MINIMO = 4;
44
+ /** Teto do `?limit` da listagem no Core (`cli/v1/bugs/route.ts`). */
45
+ const LIMITE_DA_LISTAGEM = 200;
46
+ /**
47
+ * Limpa o que o usuário colou: espaços, reticências da tabela antiga, caixa
48
+ * alta, e aceita o hex sem o `bug_` na frente (`a4f84c1b` → `bug_a4f84c1b`).
49
+ */
50
+ export function normalizarEntradaDeId(entrada) {
51
+ let s = entrada.trim().toLowerCase();
52
+ s = s.replace(/(…|\.\.\.)$/, '');
53
+ if (!s.startsWith('bug_') && /^[0-9a-f]+$/.test(s))
54
+ s = `bug_${s}`;
55
+ return s;
56
+ }
57
+ /** Pura: decide o id a partir da entrada e da lista. Testável sem rede. */
58
+ export function escolherBugPorPrefixo(entrada, rows) {
59
+ const alvo = normalizarEntradaDeId(entrada);
60
+ if (ID_COMPLETO.test(alvo))
61
+ return { ok: true, id: alvo };
62
+ if (alvo.length < 'bug_'.length + PREFIXO_MINIMO) {
63
+ return { ok: false, motivo: 'curto_demais', candidatos: [] };
64
+ }
65
+ const candidatos = rows.filter((r) => typeof r.id === 'string' && r.id.startsWith(alvo));
66
+ if (candidatos.length === 1)
67
+ return { ok: true, id: candidatos[0].id };
68
+ return {
69
+ ok: false,
70
+ motivo: candidatos.length === 0 ? 'nao_encontrado' : 'ambiguo',
71
+ candidatos,
72
+ };
73
+ }
74
+ /**
75
+ * Resolve o id que o usuário digitou pro id completo. Id completo não custa
76
+ * chamada extra; prefixo custa UMA listagem. Falha sai com mensagem que diz o
77
+ * que fazer, em vez do "não encontrado" que mentia.
78
+ */
79
+ export async function resolverIdDoBug(entrada, token, json) {
80
+ const direto = normalizarEntradaDeId(entrada);
81
+ if (ID_COMPLETO.test(direto))
82
+ return direto;
83
+ let rows = [];
84
+ try {
85
+ const res = await apiRequest(`/api/cli/v1/bugs?limit=${LIMITE_DA_LISTAGEM}`, { token });
86
+ rows = Array.isArray(res?.reports) ? res.reports : [];
87
+ }
88
+ catch (error) {
89
+ handleApiError(error, json);
90
+ }
91
+ const r = escolherBugPorPrefixo(entrada, rows);
92
+ if (r.ok)
93
+ return r.id;
94
+ let msg;
95
+ if (r.motivo === 'curto_demais') {
96
+ msg =
97
+ `Id "${entrada}" curto demais. Use ao menos bug_ + ${PREFIXO_MINIMO} caracteres ` +
98
+ '(ex.: bug_a4f8) ou o id completo de `neetru bug list --json`.';
99
+ }
100
+ else if (r.motivo === 'ambiguo') {
101
+ const lista = r.candidatos
102
+ .slice(0, 10)
103
+ .map((b) => ` ${b.id} ${b.title ?? ''}`.trimEnd())
104
+ .join('\n');
105
+ msg = `Prefixo "${entrada}" casa com ${r.candidatos.length} bugs — use mais caracteres:\n${lista}`;
106
+ }
107
+ else {
108
+ // NUNCA afirmar que o bug não existe: a listagem tem teto (200) e, pra quem
109
+ // não é admin, ainda é filtrada por produto no Core. O que dá pra afirmar é
110
+ // só o que foi visto.
111
+ msg =
112
+ `Não achei bug começando com "${direto}" entre os ${rows.length} que a ` +
113
+ 'listagem devolveu (os mais recentes que você pode ver). Use o id completo — ' +
114
+ 'a coluna ID de `neetru bug list` mostra inteiro.';
115
+ }
116
+ if (json) {
117
+ // Mesmo formato do resto da CLI (`cli-write.ts`): `error` é o CÓDIGO, em texto.
118
+ console.log(JSON.stringify({ ok: false, error: `bug_id_${r.motivo}`, message: msg }));
119
+ }
120
+ else {
121
+ log.error(msg);
122
+ }
123
+ safeExit(1);
124
+ return '';
125
+ }
24
126
  // ─── Formatação ──────────────────────────────────────────────────────────────
25
127
  function colorStatus(s) {
26
128
  if (!s)
@@ -187,12 +289,14 @@ export async function runBugList(opts) {
187
289
  return;
188
290
  }
189
291
  renderTable([
190
- { header: 'ID', value: (b) => b.id, maxWidth: 24 },
292
+ { header: 'ID', value: (b) => b.id, identificador: true },
191
293
  { header: 'TÍTULO', value: (b) => b.title ?? '—', maxWidth: 40 },
192
294
  { header: 'STATUS', value: (b) => colorStatus(b.status) },
193
295
  { header: 'SEV', value: (b) => colorSeverity(b.severity) },
194
296
  { header: 'CATEGORIA', value: (b) => b.category ?? '—', maxWidth: 10 },
195
- { header: 'RESPONSÁVEL', value: (b) => b.assignedTo ?? chalk.dim('—'), maxWidth: 24 },
297
+ // uid de 28 caracteres que `--assigned-to` aceita de volta: cortado em 24
298
+ // virava um uid que não existe (revisão do #75).
299
+ { header: 'RESPONSÁVEL', value: (b) => b.assignedTo ?? chalk.dim('—'), identificador: true },
196
300
  { header: 'REPORTADO', value: (b) => fmtTimestamp(b.reportedAt), maxWidth: 14 },
197
301
  ], res.reports);
198
302
  console.log();
@@ -209,6 +313,7 @@ export async function runBugShow(id, opts) {
209
313
  safeExit(1);
210
314
  }
211
315
  const token = await requireToken(opts.json);
316
+ id = await resolverIdDoBug(id, token, opts.json);
212
317
  const spinner = opts.json ? null : ora({ text: `Buscando bug ${id}…`, color: 'blue' }).start();
213
318
  let res;
214
319
  try {
@@ -286,6 +391,7 @@ export async function runBugClaim(id, opts) {
286
391
  safeExit(1);
287
392
  }
288
393
  const token = await requireToken(opts.json);
394
+ id = await resolverIdDoBug(id, token, opts.json);
289
395
  const spinner = opts.json ? null : ora({ text: `Assumindo bug ${id}…`, color: 'blue' }).start();
290
396
  let res;
291
397
  try {
@@ -352,6 +458,11 @@ export async function runBugResolve(id, opts) {
352
458
  safeExit(1);
353
459
  }
354
460
  const token = await requireToken(opts.json);
461
+ id = await resolverIdDoBug(id, token, opts.json);
462
+ // `--duplicate-of` também é id de bug: sem resolver, o Core gravaria a
463
+ // duplicata apontando pra um id que não existe.
464
+ if (duplicateOf)
465
+ duplicateOf = await resolverIdDoBug(duplicateOf, token, opts.json);
355
466
  const spinner = opts.json ? null : ora({ text: `Encerrando bug ${id}…`, color: 'blue' }).start();
356
467
  let res;
357
468
  try {
@@ -401,6 +512,7 @@ export async function runBugComment(id, opts) {
401
512
  safeExit(1);
402
513
  }
403
514
  const token = await requireToken(opts.json);
515
+ id = await resolverIdDoBug(id, token, opts.json);
404
516
  const spinner = opts.json ? null : ora({ text: `Comentando bug ${id}…`, color: 'blue' }).start();
405
517
  let res;
406
518
  try {
@@ -1,5 +1,17 @@
1
+ import { type RuntimeEnvironmentId } from '../lib/envs.js';
1
2
  export interface BuildOptions {
2
3
  product?: string;
4
+ /**
5
+ * bug_678ddc98: diretório do APP a construir, relativo a onde o comando foi
6
+ * invocado. Em monorepo (pnpm workspaces + Turborepo) o app não fica na raiz
7
+ * do repo — antes disso só dava pra buildar com `cd apps/web`, o que levava
8
+ * junto o `.neetru-build` e a resolução de lockfile pro lugar errado.
9
+ *
10
+ * O artefato continua saindo onde o comando foi invocado (a raiz do repo, em
11
+ * geral) pra que o `neetru deploy` seguinte, que procura
12
+ * `<cwd>/.neetru-build/manifest.json`, encontre o que acabou de ser gerado.
13
+ */
14
+ app?: string;
3
15
  /**
4
16
  * Stack a usar no build. 'nextjs' é alias de conveniência da CLI — normalizado
5
17
  * pra 'node' internamente (bug_ebac4e6c: antes causava "Stack desconhecida: nextjs").
@@ -34,7 +46,7 @@ export interface BuildOptions {
34
46
  * spawn-env (que dotenv/Next.js NUNCA sobrescreve a partir de arquivo)
35
47
  * — neutraliza o arquivo ambiente sem tocar em nada no disco do dev.
36
48
  */
37
- targetEnv?: 'dev' | 'workspace' | 'prod';
49
+ targetEnv?: RuntimeEnvironmentId;
38
50
  /**
39
51
  * SETOR 5.1 (PLANO_MESTRE_QUALIDADE_ECOSSISTEMA_2026-08-03): saída
40
52
  * machine-readable. Suprime banner/spinner/logs humanos do stdout, roteia a
@@ -62,6 +74,17 @@ export interface BuildManifest {
62
74
  sha256: string;
63
75
  sizeBytes: number;
64
76
  entrypoint?: string;
77
+ /**
78
+ * Prefixo do app dentro do standalone, quando o Next.js ANINHOU o app num
79
+ * monorepo (`apps/web`). `''`/ausente = app na raiz do tarball, layout que o
80
+ * agente sabe inferir sozinho.
81
+ *
82
+ * Existe pra o `deploy` conseguir distinguir "entrypoint que o agente NÃO tem
83
+ * como adivinhar" de "entrypoint que ele adivinha melhor que a gente" — ver
84
+ * `entrypointParaDeploy` em `deploy.ts`. Sem este campo o deploy teria que
85
+ * inferir o aninhamento do formato da string, inferência sobre inferência.
86
+ */
87
+ appPrefix?: string;
65
88
  builtAt: string;
66
89
  }
67
90
  /**