@neetru/cli 2.13.0 → 2.14.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/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  Convenção: [Keep a Changelog](https://keepachangelog.com/) + [SemVer](https://semver.org/).
4
4
 
5
+ ## [2.14.0] — 2026-07-09 (`neetru code` — assistente local via AI Gateway)
6
+
7
+ > Novo subcomando, decisão B0 (ver `PLANO_NEETRU_AI_CODE_2026-07-02.md`): assistente de código local roteado pelo Neetru AI Gateway (Groq/NVIDIA — `llama-3.3-70b-versatile` default), não pelo Anthropic/OpenAI SDK direto. Fecha 3 HIGH + 1 MEDIUM de um review de segurança antes de mergear.
8
+
9
+ ### Adicionado
10
+
11
+ - **`neetru code [prompt...]`** — assistente local de código: modo one-shot (`neetru code "corrija esse bug"`) ou interativo. Autentica com a sessão de login da própria CLI, chama `POST /api/cli/v1/ai/chat` (Core), sem depender do `@neetru/sdk` (mesmo padrão do resto da CLI — fala direto com o Core via seus endpoints próprios).
12
+ - Protocolo textual próprio (`code-agent-protocol.ts`): o modelo emite `NEETRU_TOOL {...}` pra pedir contexto local (`read_file`/`list_files`/`search`) e `NEETRU_PATCH ... NEETRU_END` pra propor diff unificado, aplicado via `git apply` após confirmação (`--yes`/`--plan`/`--no-apply`).
13
+ - Hardening de segurança (`code-agent-files.ts`): contenção de path contra escape via symlink (realpath re-resolvido), blocklist de arquivos com aparência de segredo (`.env`, `.pem`, `id_rsa`, `credentials.json`, etc.), redação de segredo linha-a-linha mesmo em arquivos permitidos, extrator de patch com marcador estrito (sem fallback pra diffs soltos — evita diff injetado via prompt ser auto-aplicado com `--yes`).
14
+ - Flags: `--model`, `--cwd`, `-f/--file` (repetível), `--max-turns`, `--max-tokens`, `--temperature`, `--plan`/`--no-apply`, `--yes`.
15
+
16
+ ## [2.13.1] — 2026-07-09 (`neetru deploy --version` finalmente funciona)
17
+
18
+ > Achado ao redeployar um produto direto de um `--artifact-url` já existente (sem `neetru build` local) — sem manifest de build, o `--version` do usuário nunca chegava a valer nada.
19
+
20
+ ### Corrigido
21
+
22
+ - **`--version` colidia com `-V`/`--version` global (GAP-M1-7)** — `program.version(CLI_VERSION)` registra o flag global no root; o Commander intercepta `--version` de forma eager em QUALQUER nível de parsing, então `neetru build|deploy|workspaces advance|deployments create --version X` sempre imprimia a versão da CLI e saía (exit 0), ignorando silenciosamente o `--version <valor>` próprio desses 4 subcomandos. Fix: `.version(CLI_VERSION, '-V')` — só a forma curta fica global. Trade-off: `neetru --version` (forma longa isolada) para de funcionar; `neetru -V` continua.
23
+ - **`--version` ausente caía num placeholder `'0.0.0'` silencioso (GAP-M1-8)** — os 4 call-sites de deploy (workspace x2, cloud-run, vm) assumiam `'0.0.0'` quando não havia manifest de build local E `--version` não foi informado, sem erro. Isso mascarou o bug acima e pode poluir o histórico de deployments/environments do Core com uma versão sem sentido. `resolveDeployVersion()` agora falha alto (exit 1) com mensagem clara em vez de inventar um placeholder.
24
+
5
25
  ## [2.12.16] — 2026-06-16 (deploy: para de mandar segredos por env — Core rejeita fail-closed)
6
26
 
7
27
  > Consome o hardening do Core que rejeita segredos em `envVars` (HTTP 400 via `assertNoSecretEnvVars`). Sem breaking change pra config NÃO-secreta.
@@ -6,7 +6,7 @@ export type Shell = 'bash' | 'zsh' | 'pwsh';
6
6
  * IMPORTANTE: incluir TODOS os `program.command('X')` de `src/index.ts`.
7
7
  * O regression test `top-level-commands-coverage.test.ts` exige >=95%.
8
8
  */
9
- export declare const TOP_LEVEL_COMMANDS: readonly ["add", "admin", "agent", "ai", "api-catalog", "ar", "archive", "artifact-registry", "audit", "auth", "autocomplete", "billing", "bootstrap", "bug", "build", "builds", "cloud-run", "config", "customers", "db", "db-hosts", "deploy", "deployments", "dev", "dns", "docs", "doctor", "dr", "env", "hosting", "init", "login", "logout", "logs", "menu", "mocks", "new", "open", "ops", "products", "promote", "publish", "schema", "servers", "status", "support", "tenants", "ui", "upgrade", "validate", "vm", "whoami", "workspaces"];
9
+ export declare const TOP_LEVEL_COMMANDS: readonly ["add", "admin", "agent", "ai", "api-catalog", "ar", "archive", "artifact-registry", "audit", "auth", "autocomplete", "billing", "bootstrap", "bug", "build", "builds", "cloud-run", "code", "config", "customers", "db", "db-hosts", "deploy", "deployments", "dev", "dns", "docs", "doctor", "dr", "env", "hosting", "init", "login", "logout", "logs", "menu", "mocks", "new", "open", "ops", "products", "promote", "publish", "schema", "servers", "status", "support", "tenants", "ui", "upgrade", "validate", "vm", "whoami", "workspaces"];
10
10
  export interface AutocompleteOptions {
11
11
  shell?: string;
12
12
  }
@@ -45,6 +45,7 @@ export const TOP_LEVEL_COMMANDS = [
45
45
  'build',
46
46
  'builds',
47
47
  'cloud-run',
48
+ 'code',
48
49
  'config',
49
50
  'customers',
50
51
  'db',
@@ -84,49 +85,49 @@ export const TOP_LEVEL_COMMANDS = [
84
85
  ];
85
86
  function bashScript() {
86
87
  const cmds = TOP_LEVEL_COMMANDS.join(' ');
87
- return `# neetru CLI bash completion (v2.10.2)
88
- _neetru_complete() {
89
- local cur prev
90
- COMPREPLY=()
91
- cur="\${COMP_WORDS[COMP_CWORD]}"
92
- prev="\${COMP_WORDS[COMP_CWORD-1]}"
93
- if [ \${COMP_CWORD} -eq 1 ]; then
94
- COMPREPLY=( $(compgen -W "${cmds}" -- "\${cur}") )
95
- return 0
96
- fi
97
- }
98
- complete -F _neetru_complete neetru
88
+ return `# neetru CLI bash completion (v2.10.2)
89
+ _neetru_complete() {
90
+ local cur prev
91
+ COMPREPLY=()
92
+ cur="\${COMP_WORDS[COMP_CWORD]}"
93
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
94
+ if [ \${COMP_CWORD} -eq 1 ]; then
95
+ COMPREPLY=( $(compgen -W "${cmds}" -- "\${cur}") )
96
+ return 0
97
+ fi
98
+ }
99
+ complete -F _neetru_complete neetru
99
100
  `;
100
101
  }
101
102
  function zshScript() {
102
103
  // Formato compsys do zsh.
103
104
  const cmds = TOP_LEVEL_COMMANDS.map((c) => ` '${c}'`).join('\n');
104
- return `#compdef neetru
105
- # neetru CLI zsh completion (v2.10.2)
106
- _neetru() {
107
- local -a commands
108
- commands=(
109
- ${cmds}
110
- )
111
- if (( CURRENT == 2 )); then
112
- _describe 'command' commands
113
- fi
114
- }
115
- _neetru "$@"
105
+ return `#compdef neetru
106
+ # neetru CLI zsh completion (v2.10.2)
107
+ _neetru() {
108
+ local -a commands
109
+ commands=(
110
+ ${cmds}
111
+ )
112
+ if (( CURRENT == 2 )); then
113
+ _describe 'command' commands
114
+ fi
115
+ }
116
+ _neetru "$@"
116
117
  `;
117
118
  }
118
119
  function pwshScript() {
119
120
  const cmds = TOP_LEVEL_COMMANDS.map((c) => ` '${c}'`).join(',\n');
120
- return `# neetru CLI PowerShell completion (v2.10.2)
121
- Register-ArgumentCompleter -Native -CommandName neetru -ScriptBlock {
122
- param($wordToComplete, $commandAst, $cursorPosition)
123
- $commands = @(
124
- ${cmds}
125
- )
126
- $commands | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {
127
- [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
128
- }
129
- }
121
+ return `# neetru CLI PowerShell completion (v2.10.2)
122
+ Register-ArgumentCompleter -Native -CommandName neetru -ScriptBlock {
123
+ param($wordToComplete, $commandAst, $cursorPosition)
124
+ $commands = @(
125
+ ${cmds}
126
+ )
127
+ $commands | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {
128
+ [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
129
+ }
130
+ }
130
131
  `;
131
132
  }
132
133
  export function generateAutocompleteScript(shell) {
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/commands/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIjD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,KAAK;IACL,OAAO;IACP,OAAO;IACP,IAAI;IACJ,aAAa;IACb,IAAI,EAAE,6BAA6B;IACnC,SAAS;IACT,mBAAmB;IACnB,OAAO;IACP,MAAM;IACN,cAAc;IACd,SAAS;IACT,WAAW;IACX,KAAK;IACL,OAAO;IACP,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,WAAW;IACX,IAAI;IACJ,UAAU;IACV,QAAQ;IACR,aAAa;IACb,KAAK;IACL,KAAK;IACL,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,KAAK;IACL,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM,EAAE,cAAc;IACtB,OAAO;IACP,KAAK;IACL,MAAM;IACN,KAAK,EAAE,8FAA8F;IACrG,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ,EAAE,mDAAmD;IAC7D,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,IAAI;IACJ,SAAS;IACT,UAAU;IACV,IAAI;IACJ,QAAQ;IACR,YAAY;CACJ,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,QAAQ,CAAC,CAAC,CAAC,CAAC;QACZ,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"}
1
+ {"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/commands/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIjD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,KAAK;IACL,OAAO;IACP,OAAO;IACP,IAAI;IACJ,aAAa;IACb,IAAI,EAAE,6BAA6B;IACnC,SAAS;IACT,mBAAmB;IACnB,OAAO;IACP,MAAM;IACN,cAAc;IACd,SAAS;IACT,WAAW;IACX,KAAK;IACL,OAAO;IACP,QAAQ;IACR,WAAW;IACX,MAAM;IACN,QAAQ;IACR,WAAW;IACX,IAAI;IACJ,UAAU;IACV,QAAQ;IACR,aAAa;IACb,KAAK;IACL,KAAK;IACL,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,KAAK;IACL,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM,EAAE,cAAc;IACtB,OAAO;IACP,KAAK;IACL,MAAM;IACN,KAAK,EAAE,8FAA8F;IACrG,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ,EAAE,mDAAmD;IAC7D,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,IAAI;IACJ,SAAS;IACT,UAAU;IACV,IAAI;IACJ,QAAQ;IACR,YAAY;CACJ,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,QAAQ,CAAC,CAAC,CAAC,CAAC;QACZ,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,48 @@
1
+ export type CodeRole = 'system' | 'user' | 'assistant';
2
+ export interface CodeMessage {
3
+ role: CodeRole;
4
+ content: string;
5
+ }
6
+ export interface CodeCommandOptions {
7
+ cwd?: string;
8
+ file?: string[];
9
+ model?: string;
10
+ maxTurns?: string | number;
11
+ maxTokens?: string | number;
12
+ temperature?: string | number;
13
+ plan?: boolean;
14
+ apply?: boolean;
15
+ yes?: boolean;
16
+ }
17
+ export interface CodeSettings {
18
+ cwd: string;
19
+ files: string[];
20
+ model: string;
21
+ modelWarning?: string;
22
+ maxTurns: number;
23
+ maxTokens: number;
24
+ temperature: number;
25
+ apply: boolean;
26
+ yes: boolean;
27
+ timeoutMs: number;
28
+ }
29
+ type ConfirmFn = (question: string) => Promise<boolean>;
30
+ export declare function resolveSettings(opts: CodeCommandOptions): CodeSettings;
31
+ /**
32
+ * `history` e mutado e reaproveitado entre chamadas: e o que da ao modo
33
+ * interativo memoria de conversa entre turnos do REPL (como Claude Code/Codex),
34
+ * em vez de cada linha digitada virar uma requisicao amnesica. O one-shot
35
+ * (`neetru code "tarefa"`) chama sem `history` — cada `runAgentTask` comeca do
36
+ * zero, igual sempre foi.
37
+ */
38
+ export declare function runAgentTask(task: string, settings: CodeSettings, confirm: ConfirmFn, history?: CodeMessage[]): Promise<void>;
39
+ /**
40
+ * Entrada a partir do menu interativo do CLI (`neetru` sem args / `neetru ui`).
41
+ * Usa settings default (cwd do processo) e gerencia o raw-mode do stdin como
42
+ * o loop de canal do Chat (`runChannelLoop` em chat-menu.ts) — sai do raw mode
43
+ * pro readline do REPL funcionar, restaura no finally pro menu principal
44
+ * retomar o controle do teclado.
45
+ */
46
+ export declare function runCodeMenu(): Promise<void>;
47
+ export declare function runCodeCommand(promptParts: string[] | undefined, opts?: CodeCommandOptions): Promise<void>;
48
+ export {};
@@ -0,0 +1,433 @@
1
+ import chalk from 'chalk';
2
+ import path from 'node:path';
3
+ import fs from 'node:fs';
4
+ import { spawnSync } from 'node:child_process';
5
+ import { createInterface } from 'node:readline/promises';
6
+ import { apiRequest } from '../lib/api-client.js';
7
+ import { config } from '../lib/config.js';
8
+ import { getActiveTokenSync } from '../lib/token-resolver.js';
9
+ import { log } from '../utils/logger.js';
10
+ import { setSafeExitCode } from '../utils/safe-exit.js';
11
+ import { parseToolRequest, extractPatch } from '../lib/code-agent-protocol.js';
12
+ import { applyUnifiedPatch, listFiles, readFileContext, renderColoredDiff, runCodeTool, } from '../lib/code-agent-files.js';
13
+ import { DEFAULT_CODE_MAX_TOKENS, DEFAULT_CODE_MAX_TURNS, DEFAULT_CODE_TEMPERATURE, parseBoundedNumber, resolveCodeModel, } from '../lib/code-agent-settings.js';
14
+ const AI_GATEWAY_CHAT_PATH = '/api/cli/v1/ai/chat';
15
+ const UI_MIN_WIDTH = 72;
16
+ const UI_MAX_WIDTH = 110;
17
+ const SYSTEM_PROMPT = `
18
+ Voce e o Neetru Code, um assistente local de codificacao da Neetru.
19
+ Voce conversa com modelos do AI Gateway do Neetru Core, normalmente Groq/NVIDIA.
20
+ Nao use Anthropic/Claude como caminho assumido.
21
+
22
+ Voce nao tem tool calling nativo. Use exatamente estes protocolos textuais:
23
+
24
+ NEETRU_TOOL {"tool":"read_file","path":"caminho/relativo.ext"}
25
+ NEETRU_TOOL {"tool":"list_files","pattern":"texto opcional"}
26
+ NEETRU_TOOL {"tool":"search","query":"texto literal"}
27
+
28
+ Regras:
29
+ - Peca arquivos antes de alterar codigo quando faltar contexto.
30
+ - Nunca invente conteudo de arquivo.
31
+ - Peca uma tool por resposta, no maximo.
32
+ - Quando estiver pronto para alterar, responda somente com um diff aplicavel por git:
33
+
34
+ NEETRU_PATCH
35
+ diff --git a/path b/path
36
+ ...
37
+ NEETRU_END
38
+
39
+ - Nao coloque explicacao dentro do bloco NEETRU_PATCH.
40
+ - Se a tarefa nao exigir alteracao, responda em texto curto.
41
+ `.trim();
42
+ function stripAnsi(text) {
43
+ return text.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
44
+ }
45
+ function visibleLength(text) {
46
+ return Array.from(stripAnsi(text)).length;
47
+ }
48
+ function padVisible(text, width) {
49
+ return `${text}${' '.repeat(Math.max(0, width - visibleLength(text)))}`;
50
+ }
51
+ function terminalWidth() {
52
+ const raw = process.stdout.columns ?? 88;
53
+ return Math.max(UI_MIN_WIDTH, Math.min(UI_MAX_WIDTH, raw));
54
+ }
55
+ function truncateMiddle(text, max) {
56
+ if (visibleLength(text) <= max)
57
+ return text;
58
+ if (max <= 5)
59
+ return text.slice(0, max);
60
+ const clean = stripAnsi(text);
61
+ const left = Math.ceil((max - 3) / 2);
62
+ const right = Math.floor((max - 3) / 2);
63
+ return `${clean.slice(0, left)}...${clean.slice(clean.length - right)}`;
64
+ }
65
+ function wrapPlain(text, width) {
66
+ const clean = stripAnsi(text);
67
+ if (clean.length <= width)
68
+ return [clean];
69
+ const out = [];
70
+ let rest = clean;
71
+ while (rest.length > width) {
72
+ const slice = rest.slice(0, width + 1);
73
+ const breakAt = Math.max(slice.lastIndexOf(' '), slice.lastIndexOf('/'), slice.lastIndexOf('\\'));
74
+ const idx = breakAt > Math.floor(width * 0.45) ? breakAt : width;
75
+ out.push(rest.slice(0, idx).trimEnd());
76
+ rest = rest.slice(idx).trimStart();
77
+ }
78
+ if (rest)
79
+ out.push(rest);
80
+ return out;
81
+ }
82
+ function printBox(title, rows = []) {
83
+ const width = terminalWidth();
84
+ const inner = width - 2;
85
+ const label = title ? ` ${title} ` : '';
86
+ const top = `+${label}${'-'.repeat(Math.max(0, inner - visibleLength(label)))}+`;
87
+ console.log(chalk.dim(top));
88
+ for (const row of rows) {
89
+ const wrapped = wrapPlain(row, inner - 2);
90
+ for (const line of wrapped) {
91
+ console.log(chalk.dim('| ') + padVisible(truncateMiddle(line, inner - 2), inner - 2) + chalk.dim(' |'));
92
+ }
93
+ }
94
+ console.log(chalk.dim(`+${'-'.repeat(inner)}+`));
95
+ }
96
+ function printDivider(label) {
97
+ const width = terminalWidth();
98
+ if (!label) {
99
+ console.log(chalk.dim('-'.repeat(width)));
100
+ return;
101
+ }
102
+ const title = ` ${label} `;
103
+ console.log(chalk.dim(`${title}${'-'.repeat(Math.max(0, width - visibleLength(title)))}`));
104
+ }
105
+ function printEvent(kind, title, detail) {
106
+ const colors = {
107
+ wait: chalk.cyan,
108
+ tool: chalk.blue,
109
+ ok: chalk.green,
110
+ warn: chalk.yellow,
111
+ error: chalk.red,
112
+ };
113
+ const tag = colors[kind](kind.toUpperCase().padEnd(5));
114
+ const suffix = detail ? chalk.dim(` ${detail}`) : '';
115
+ console.log(`${tag} ${chalk.bold(title)}${suffix}`);
116
+ }
117
+ function toolDetail(tool) {
118
+ if (!tool)
119
+ return '';
120
+ if (tool.tool === 'read_file' && typeof tool.path === 'string')
121
+ return tool.path;
122
+ if (tool.tool === 'list_files' && typeof tool.pattern === 'string' && tool.pattern)
123
+ return tool.pattern;
124
+ if (tool.tool === 'search' && typeof tool.query === 'string')
125
+ return tool.query;
126
+ return '';
127
+ }
128
+ function summarizeToolResult(result) {
129
+ const lines = result.split(/\r?\n/).filter(Boolean).length;
130
+ const chars = result.length;
131
+ return `${lines} linha(s), ${chars} char(s)`;
132
+ }
133
+ function printAssistantText(content) {
134
+ printDivider('assistant');
135
+ process.stdout.write(`${content.trim()}\n`);
136
+ printDivider();
137
+ }
138
+ function printPatchPreview(patch) {
139
+ const files = Array.from(patch.matchAll(/^diff --git a\/(.+?) b\//gm)).map((m) => m[1]);
140
+ printBox('patch proposto', [
141
+ files.length ? `arquivos: ${files.join(', ')}` : 'arquivos: nao detectado',
142
+ 'aplicacao: git apply depois de confirmacao',
143
+ ]);
144
+ process.stdout.write(renderColoredDiff(patch));
145
+ }
146
+ function asOptionalString(value) {
147
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
148
+ }
149
+ function normalizeFiles(files) {
150
+ if (!files)
151
+ return [];
152
+ if (Array.isArray(files))
153
+ return files.filter((file) => typeof file === 'string' && !!file.trim());
154
+ if (typeof files === 'string' && files.trim())
155
+ return [files.trim()];
156
+ return [];
157
+ }
158
+ export function resolveSettings(opts) {
159
+ const cwd = path.resolve(opts.cwd ?? process.cwd());
160
+ const stat = fs.statSync(cwd);
161
+ if (!stat.isDirectory())
162
+ throw new Error(`cwd nao e diretorio: ${cwd}`);
163
+ const model = resolveCodeModel({
164
+ cliModel: asOptionalString(opts.model),
165
+ envModel: process.env.NEETRU_CODE_MODEL,
166
+ configuredGatewayModel: config.get('gatewayModel'),
167
+ });
168
+ return {
169
+ cwd,
170
+ files: normalizeFiles(opts.file),
171
+ model: model.model,
172
+ modelWarning: model.warning,
173
+ maxTurns: parseBoundedNumber(opts.maxTurns, DEFAULT_CODE_MAX_TURNS, {
174
+ min: 1,
175
+ max: 30,
176
+ integer: true,
177
+ }),
178
+ maxTokens: parseBoundedNumber(opts.maxTokens, DEFAULT_CODE_MAX_TOKENS, {
179
+ min: 256,
180
+ max: 32_768,
181
+ integer: true,
182
+ }),
183
+ temperature: parseBoundedNumber(opts.temperature, DEFAULT_CODE_TEMPERATURE, {
184
+ min: 0,
185
+ max: 2,
186
+ }),
187
+ apply: opts.apply !== false && opts.plan !== true,
188
+ yes: opts.yes === true,
189
+ timeoutMs: 120_000,
190
+ };
191
+ }
192
+ function renderHeader(settings, mode = 'oneshot') {
193
+ console.log();
194
+ printBox('Neetru Code', [
195
+ `AI Gateway ${AI_GATEWAY_CHAT_PATH}`,
196
+ `Model ${settings.model}`,
197
+ `Workspace ${truncateMiddle(settings.cwd, terminalWidth() - 18)}`,
198
+ `Mode ${mode} | patch ${settings.apply ? 'confirm' : 'plan-only'} | turns ${settings.maxTurns} | tokens ${settings.maxTokens}`,
199
+ ]);
200
+ if (settings.modelWarning)
201
+ log.warn(settings.modelWarning);
202
+ console.log();
203
+ }
204
+ function renderInteractiveHelp() {
205
+ printBox('controles', [
206
+ '/files listar arquivos do workspace',
207
+ '/model mostrar modelo atual',
208
+ '/clear limpar tela e esquecer o historico da conversa',
209
+ '/help mostrar estes controles',
210
+ '/exit sair',
211
+ ]);
212
+ console.log(chalk.dim('Digite uma tarefa em linguagem natural para a IA inspecionar e propor patch.'));
213
+ console.log();
214
+ }
215
+ function buildInitialPrompt(task, settings) {
216
+ const fileBlocks = [];
217
+ for (const file of settings.files) {
218
+ fileBlocks.push(readFileContext(settings.cwd, file));
219
+ }
220
+ return [
221
+ `Tarefa do usuario:\n${task}`,
222
+ `Cwd: ${settings.cwd}`,
223
+ fileBlocks.length
224
+ ? `Contexto inicial de arquivos:\n\n${fileBlocks.join('\n\n')}`
225
+ : 'Nenhum arquivo foi anexado inicialmente. Use NEETRU_TOOL para pedir contexto local.',
226
+ ].join('\n\n');
227
+ }
228
+ async function callGateway(settings, messages) {
229
+ const response = await apiRequest(AI_GATEWAY_CHAT_PATH, {
230
+ method: 'POST',
231
+ body: {
232
+ model: settings.model,
233
+ messages,
234
+ stream: false,
235
+ maxTokens: settings.maxTokens,
236
+ temperature: settings.temperature,
237
+ },
238
+ timeoutMs: settings.timeoutMs,
239
+ });
240
+ const content = response.choices?.[0]?.message?.content;
241
+ if (typeof content !== 'string') {
242
+ throw new Error('AI Gateway retornou resposta sem choices[0].message.content.');
243
+ }
244
+ return content;
245
+ }
246
+ async function defaultConfirm(question) {
247
+ if (!process.stdin.isTTY)
248
+ return false;
249
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
250
+ try {
251
+ const answer = await rl.question(question);
252
+ return /^(y|yes|s|sim)$/i.test(answer.trim());
253
+ }
254
+ finally {
255
+ rl.close();
256
+ }
257
+ }
258
+ /**
259
+ * `history` e mutado e reaproveitado entre chamadas: e o que da ao modo
260
+ * interativo memoria de conversa entre turnos do REPL (como Claude Code/Codex),
261
+ * em vez de cada linha digitada virar uma requisicao amnesica. O one-shot
262
+ * (`neetru code "tarefa"`) chama sem `history` — cada `runAgentTask` comeca do
263
+ * zero, igual sempre foi.
264
+ */
265
+ export async function runAgentTask(task, settings, confirm, history = []) {
266
+ if (!getActiveTokenSync()) {
267
+ throw new Error('Sessao Neetru ausente ou expirada. Rode `neetru login`.');
268
+ }
269
+ const messages = history;
270
+ const isFirstTurn = messages.length === 0;
271
+ if (isFirstTurn)
272
+ messages.push({ role: 'system', content: SYSTEM_PROMPT });
273
+ messages.push({
274
+ role: 'user',
275
+ content: isFirstTurn ? buildInitialPrompt(task, settings) : task,
276
+ });
277
+ for (let turn = 1; turn <= settings.maxTurns; turn++) {
278
+ printEvent('wait', 'AI Gateway', `turno ${turn}/${settings.maxTurns}`);
279
+ const content = await callGateway(settings, messages);
280
+ messages.push({ role: 'assistant', content });
281
+ const tool = parseToolRequest(content);
282
+ if (tool) {
283
+ printEvent('tool', tool.tool, toolDetail(tool));
284
+ const result = runCodeTool(settings.cwd, tool);
285
+ printEvent('ok', 'contexto local', summarizeToolResult(result));
286
+ messages.push({
287
+ role: 'user',
288
+ content: `Resultado da tool ${tool.tool}:\n\n${result}`,
289
+ });
290
+ continue;
291
+ }
292
+ const patch = extractPatch(content);
293
+ if (patch) {
294
+ console.log();
295
+ printPatchPreview(patch);
296
+ if (!settings.apply) {
297
+ printEvent('warn', 'Patch nao aplicado', '--plan/--no-apply');
298
+ return;
299
+ }
300
+ const approved = settings.yes || (await confirm('\nAplicar este patch? [y/N] '));
301
+ if (!approved) {
302
+ printEvent('warn', 'Patch nao aplicado');
303
+ return;
304
+ }
305
+ applyUnifiedPatch(settings.cwd, patch);
306
+ printEvent('ok', 'Patch aplicado', 'git apply');
307
+ return;
308
+ }
309
+ console.log();
310
+ printAssistantText(content);
311
+ return;
312
+ }
313
+ throw new Error(`Limite de turnos atingido (${settings.maxTurns}) sem resposta final.`);
314
+ }
315
+ function printFileSample(settings) {
316
+ const files = listFiles(settings.cwd).slice(0, 60);
317
+ if (files.length === 0) {
318
+ printEvent('warn', 'Nenhum arquivo encontrado');
319
+ return;
320
+ }
321
+ printBox('arquivos', [
322
+ ...files,
323
+ ...(files.length === 60 ? ['... lista truncada em 60 arquivos.'] : []),
324
+ ]);
325
+ }
326
+ async function runInteractive(settings) {
327
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
328
+ throw new Error('Modo interativo exige terminal TTY. Use: neetru code "tarefa".');
329
+ }
330
+ renderHeader(settings, 'interactive');
331
+ renderInteractiveHelp();
332
+ let history = [];
333
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
334
+ try {
335
+ for (;;) {
336
+ const line = (await rl.question(chalk.cyan('> '))).trim();
337
+ if (!line)
338
+ continue;
339
+ const lower = line.toLowerCase();
340
+ if (lower === '/exit' || lower === '/sair' || lower === 'exit' || lower === 'quit')
341
+ return;
342
+ if (lower === '/clear') {
343
+ history = [];
344
+ process.stdout.write('\x1B[2J\x1B[H');
345
+ renderHeader(settings, 'interactive');
346
+ renderInteractiveHelp();
347
+ continue;
348
+ }
349
+ if (lower === '/files') {
350
+ printFileSample(settings);
351
+ continue;
352
+ }
353
+ if (lower === '/model') {
354
+ printBox('modelo', [settings.model]);
355
+ continue;
356
+ }
357
+ if (lower === '/help' || lower === '/ajuda') {
358
+ renderInteractiveHelp();
359
+ continue;
360
+ }
361
+ try {
362
+ await runAgentTask(line, settings, async (question) => {
363
+ const answer = await rl.question(question);
364
+ return /^(y|yes|s|sim)$/i.test(answer.trim());
365
+ }, history);
366
+ }
367
+ catch (error) {
368
+ printEvent('error', 'Falha', error instanceof Error ? error.message : String(error));
369
+ }
370
+ }
371
+ }
372
+ finally {
373
+ rl.close();
374
+ }
375
+ }
376
+ function runDoctor(settings) {
377
+ const token = getActiveTokenSync();
378
+ const apiUrl = config.get('neetruApiUrl') ?? 'https://api.neetru.com';
379
+ const git = spawnSync('git', ['--version'], { cwd: settings.cwd, encoding: 'utf8' });
380
+ renderHeader(settings, 'doctor');
381
+ console.log(chalk.bold('Doctor'));
382
+ console.log(` token Neetru: ${token ? chalk.green('ok') : chalk.red('ausente')}`);
383
+ console.log(` Core API: ${chalk.dim(apiUrl)}`);
384
+ console.log(` git: ${git.status === 0 ? chalk.green('ok') : chalk.red('falhou')}`);
385
+ console.log(` modo patch: ${settings.apply ? 'aplica com confirmacao' : 'somente plano'}`);
386
+ console.log();
387
+ if (!token || git.status !== 0)
388
+ setSafeExitCode(1);
389
+ }
390
+ /**
391
+ * Entrada a partir do menu interativo do CLI (`neetru` sem args / `neetru ui`).
392
+ * Usa settings default (cwd do processo) e gerencia o raw-mode do stdin como
393
+ * o loop de canal do Chat (`runChannelLoop` em chat-menu.ts) — sai do raw mode
394
+ * pro readline do REPL funcionar, restaura no finally pro menu principal
395
+ * retomar o controle do teclado.
396
+ */
397
+ export async function runCodeMenu() {
398
+ const wasRaw = process.stdin.isRaw === true;
399
+ try {
400
+ if (typeof process.stdin.setRawMode === 'function') {
401
+ process.stdin.setRawMode(false);
402
+ }
403
+ await runInteractive(resolveSettings({}));
404
+ }
405
+ finally {
406
+ if (typeof process.stdin.setRawMode === 'function') {
407
+ process.stdin.setRawMode(wasRaw);
408
+ }
409
+ process.stdin.resume();
410
+ }
411
+ }
412
+ export async function runCodeCommand(promptParts, opts = {}) {
413
+ try {
414
+ const settings = resolveSettings(opts);
415
+ const parts = promptParts ?? [];
416
+ if (parts.length === 1 && parts[0].toLowerCase() === 'doctor') {
417
+ runDoctor(settings);
418
+ return;
419
+ }
420
+ const task = parts.join(' ').trim();
421
+ if (!task) {
422
+ await runInteractive(settings);
423
+ return;
424
+ }
425
+ renderHeader(settings, 'oneshot');
426
+ await runAgentTask(task, settings, defaultConfirm);
427
+ }
428
+ catch (error) {
429
+ log.error(error instanceof Error ? error.message : String(error));
430
+ setSafeExitCode(1);
431
+ }
432
+ }
433
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/commands/code.ts"],"names":[],"mappings":"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"}