@neetru/cli 2.13.1 → 2.15.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 +27 -0
- package/dist/commands/ai.js +8 -8
- package/dist/commands/autocomplete.d.ts +1 -1
- package/dist/commands/autocomplete.js +1 -0
- package/dist/commands/autocomplete.js.map +1 -1
- package/dist/commands/code.d.ts +27 -0
- package/dist/commands/code.js +469 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/fn.d.ts +6 -0
- package/dist/commands/fn.js +88 -0
- package/dist/commands/fn.js.map +1 -0
- package/dist/commands/init.js +147 -147
- package/dist/commands/marketplace.d.ts +36 -0
- package/dist/commands/marketplace.js +585 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/ui.d.ts +1 -1
- package/dist/commands/ui.js +9 -0
- package/dist/commands/ui.js.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/context.js +91 -91
- package/dist/lib/ai/orchestrator.js +7 -43
- package/dist/lib/ai/orchestrator.js.map +1 -1
- package/dist/lib/api-client.d.ts +1 -0
- package/dist/lib/api-client.js +4 -3
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/code-agent-files.d.ts +47 -0
- package/dist/lib/code-agent-files.js +468 -0
- package/dist/lib/code-agent-files.js.map +1 -0
- package/dist/lib/code-agent-gateway.d.ts +27 -0
- package/dist/lib/code-agent-gateway.js +115 -0
- package/dist/lib/code-agent-gateway.js.map +1 -0
- package/dist/lib/code-agent-protocol.d.ts +24 -0
- package/dist/lib/code-agent-protocol.js +56 -0
- package/dist/lib/code-agent-protocol.js.map +1 -0
- package/dist/lib/code-agent-session.d.ts +54 -0
- package/dist/lib/code-agent-session.js +147 -0
- package/dist/lib/code-agent-session.js.map +1 -0
- package/dist/lib/code-agent-settings.d.ts +20 -0
- package/dist/lib/code-agent-settings.js +38 -0
- package/dist/lib/code-agent-settings.js.map +1 -0
- package/dist/lib/code-agent-tools.d.ts +17 -0
- package/dist/lib/code-agent-tools.js +52 -0
- package/dist/lib/code-agent-tools.js.map +1 -0
- package/dist/lib/code-agent-types.d.ts +34 -0
- package/dist/lib/code-agent-types.js +7 -0
- package/dist/lib/code-agent-types.js.map +1 -0
- package/dist/lib/code-agent-ui.d.ts +30 -0
- package/dist/lib/code-agent-ui.js +258 -0
- package/dist/lib/code-agent-ui.js.map +1 -0
- package/dist/lib/sse.d.ts +14 -0
- package/dist/lib/sse.js +43 -0
- package/dist/lib/sse.js.map +1 -0
- package/package.json +1 -1
- package/templates/auth/callback.ts +22 -22
- package/templates/auth/sign-in.tsx +41 -41
- package/templates/billing/checkout.ts +22 -22
- package/templates/billing/page.tsx +43 -43
- package/templates/support/ticket-form.tsx +68 -68
- package/templates/usage/track.ts +30 -30
- package/templates/users/profile.tsx +43 -43
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
Convenção: [Keep a Changelog](https://keepachangelog.com/) + [SemVer](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [2.15.0] — 2026-07-10 (`neetru code` — Fases 2 a 5: núcleo separado, ferramentas, memória, streaming)
|
|
6
|
+
|
|
7
|
+
> Continuação direta do 2.14.0 (mesmo subcomando, mesma decisão B0). Sem breaking change nos flags/comandos existentes — tudo aditivo. Detalhe completo em `NEETRU_CODE_ARCHITECTURE.md`.
|
|
8
|
+
|
|
9
|
+
### Adicionado
|
|
10
|
+
|
|
11
|
+
- **Núcleo separado da interface** (Fase 2) — `code-agent-session.ts` ganhou `CodeAgentStateMachine` (idle→thinking→tool_requested→tool_running→patch_ready→awaiting_confirm→applied/failed/aborted, com validação de transição); renderização extraída pra `code-agent-ui.ts`; chamada ao AI Gateway isolada em `code-agent-gateway.ts`; registro de ferramentas centralizado em `code-agent-tools.ts` (`buildSystemPrompt()` monta o prompt a partir do registro — não precisa mais editar prompt à mão a cada ferramenta nova).
|
|
12
|
+
- **4 ferramentas produtivas novas** (Fase 3): `run_tests` (roda só o script `test` já configurado — allowlist fechada, não aceita comando livre do modelo), `read_many_files` (até 20 arquivos por chamada), `search_regex` (busca linha-a-linha com limites anti-ReDoS), `project_symbols` (outline leve de `export function/class/const/interface/type/enum`).
|
|
13
|
+
- **Memória e retomada** (Fase 4): `/save` grava a sessão em `.neetru/code/sessions`; `/resume` lista sessões salvas numeradas (mais recente primeiro, com preview da 1ª mensagem) e recarrega a conversa escolhida; log local de patch aplicado em `.neetru/code/patches.log`.
|
|
14
|
+
- **Streaming de resposta** (Fase 5): `streamGatewayChat` consome SSE do AI Gateway (mesmo endpoint/formato que `neetru ai --debug:model gateway` já usa) — mostra contador de chars recebidos ao vivo no terminal em vez de ficar parado durante respostas longas; cai automaticamente pra chamada sem streaming em qualquer falha (a corretude do turno nunca depende do streaming funcionar). Parser SSE (`readSseLines`) extraído pra `src/lib/sse.ts` — compartilhado com `src/lib/ai/orchestrator.ts`, sem duplicar a lógica de buffer/decode entre os dois subcomandos.
|
|
15
|
+
- **`/pick`** (Fase 5): lista arquivos do projeto numerados e anexa a escolha do usuário ao contexto da conversa.
|
|
16
|
+
|
|
17
|
+
### Notas
|
|
18
|
+
|
|
19
|
+
- Painel TUI completo (viewport fixo pra conversa/status/diff) fica de fora deste release — exige trocar o modelo de entrada (`readline`) por controle de terminal em modo raw, escopo estrutural próprio.
|
|
20
|
+
|
|
21
|
+
## [2.14.0] — 2026-07-09 (`neetru code` — assistente local via AI Gateway)
|
|
22
|
+
|
|
23
|
+
> 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.
|
|
24
|
+
|
|
25
|
+
### Adicionado
|
|
26
|
+
|
|
27
|
+
- **`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).
|
|
28
|
+
- 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`).
|
|
29
|
+
- 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`).
|
|
30
|
+
- Flags: `--model`, `--cwd`, `-f/--file` (repetível), `--max-turns`, `--max-tokens`, `--temperature`, `--plan`/`--no-apply`, `--yes`.
|
|
31
|
+
|
|
5
32
|
## [2.13.1] — 2026-07-09 (`neetru deploy --version` finalmente funciona)
|
|
6
33
|
|
|
7
34
|
> 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.
|
package/dist/commands/ai.js
CHANGED
|
@@ -11,14 +11,14 @@ const PROMPT_PREFIX = chalk.hex('#1E90FF').bold(' › ');
|
|
|
11
11
|
const ASSISTANT_PREFIX = chalk.dim(' ◆ ');
|
|
12
12
|
// Help público — sem /modelo (orchestrator escolhe). /debug:model é o
|
|
13
13
|
// override avançado pra quem quer forçar.
|
|
14
|
-
const HELP_TEXT = `
|
|
15
|
-
Comandos:
|
|
16
|
-
/sair /exit encerrar sessão
|
|
17
|
-
/limpar /clear limpar histórico de contexto
|
|
18
|
-
/agentes <pergunta> consultar 2+ modelos em paralelo e comparar
|
|
19
|
-
/auth rodar wizard de configuração (claude/codex/gemini)
|
|
20
|
-
/help mostrar este texto
|
|
21
|
-
/debug:model <nome> forçar modelo (claude|openai|gemini|groq|nvidia|gateway|auto)
|
|
14
|
+
const HELP_TEXT = `
|
|
15
|
+
Comandos:
|
|
16
|
+
/sair /exit encerrar sessão
|
|
17
|
+
/limpar /clear limpar histórico de contexto
|
|
18
|
+
/agentes <pergunta> consultar 2+ modelos em paralelo e comparar
|
|
19
|
+
/auth rodar wizard de configuração (claude/codex/gemini)
|
|
20
|
+
/help mostrar este texto
|
|
21
|
+
/debug:model <nome> forçar modelo (claude|openai|gemini|groq|nvidia|gateway|auto)
|
|
22
22
|
`.trim();
|
|
23
23
|
const DEBUG_MODELS = ['claude', 'openai', 'gemini', 'groq', 'nvidia', 'gateway', 'auto'];
|
|
24
24
|
/**
|
|
@@ -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
|
}
|
|
@@ -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,27 @@
|
|
|
1
|
+
import { type CodeAgentState } from '../lib/code-agent-session.js';
|
|
2
|
+
import type { CodeMessage, CodeCommandOptions, CodeSettings, ConfirmFn } from '../lib/code-agent-types.js';
|
|
3
|
+
export type { CodeMessage, CodeCommandOptions, CodeSettings } from '../lib/code-agent-types.js';
|
|
4
|
+
export declare function resolveSettings(opts: CodeCommandOptions): CodeSettings;
|
|
5
|
+
/**
|
|
6
|
+
* `history` e mutado e reaproveitado entre chamadas: e o que da ao modo
|
|
7
|
+
* interativo memoria de conversa entre turnos do REPL (como Claude Code/Codex),
|
|
8
|
+
* em vez de cada linha digitada virar uma requisicao amnesica. O one-shot
|
|
9
|
+
* (`neetru code "tarefa"`) chama sem `history` — cada `runAgentTask` comeca do
|
|
10
|
+
* zero, igual sempre foi.
|
|
11
|
+
*
|
|
12
|
+
* `onState` (opcional): observa a maquina de estados da sessao (Fase 2,
|
|
13
|
+
* NEETRU_CODE_ARCHITECTURE.md) — usado por testes pra verificar a sequencia
|
|
14
|
+
* idle -> thinking -> tool_requested -> tool_running -> ... sem mockar o
|
|
15
|
+
* AI Gateway inteiro. Cada chamada de runAgentTask e um ciclo completo
|
|
16
|
+
* (comeca e termina em idle/applied/failed/aborted).
|
|
17
|
+
*/
|
|
18
|
+
export declare function runAgentTask(task: string, settings: CodeSettings, confirm: ConfirmFn, history?: CodeMessage[], onState?: (state: CodeAgentState) => void): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Entrada a partir do menu interativo do CLI (`neetru` sem args / `neetru ui`).
|
|
21
|
+
* Usa settings default (cwd do processo) e gerencia o raw-mode do stdin como
|
|
22
|
+
* o loop de canal do Chat (`runChannelLoop` em chat-menu.ts) — sai do raw mode
|
|
23
|
+
* pro readline do REPL funcionar, restaura no finally pro menu principal
|
|
24
|
+
* retomar o controle do teclado.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runCodeMenu(): Promise<void>;
|
|
27
|
+
export declare function runCodeCommand(promptParts: string[] | undefined, opts?: CodeCommandOptions): Promise<void>;
|
|
@@ -0,0 +1,469 @@
|
|
|
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 { config } from '../lib/config.js';
|
|
7
|
+
import { getActiveTokenSync } from '../lib/token-resolver.js';
|
|
8
|
+
import { log } from '../utils/logger.js';
|
|
9
|
+
import { setSafeExitCode } from '../utils/safe-exit.js';
|
|
10
|
+
import { parseToolRequest, extractPatch } from '../lib/code-agent-protocol.js';
|
|
11
|
+
import { applyUnifiedPatch, getGitDiff, getProjectOverview, listFiles, readFileContext, renderColoredDiff, runCodeTool, } from '../lib/code-agent-files.js';
|
|
12
|
+
import { compactCodeHistory, saveCodeSession, listCodeSessions, loadCodeSession, logAppliedPatch, CodeAgentStateMachine, } from '../lib/code-agent-session.js';
|
|
13
|
+
import { DEFAULT_CODE_MAX_TOKENS, DEFAULT_CODE_MAX_TURNS, DEFAULT_CODE_TEMPERATURE, parseBoundedNumber, resolveCodeModel, } from '../lib/code-agent-settings.js';
|
|
14
|
+
import { callGateway, streamGatewayChat, AI_GATEWAY_CHAT_PATH } from '../lib/code-agent-gateway.js';
|
|
15
|
+
import { buildSystemPrompt } from '../lib/code-agent-tools.js';
|
|
16
|
+
import { printBox, printEvent, printAssistantText, printPatchPreview, patchSummaryRows, renderHeader, renderInteractiveHelp, renderSessionStatus, renderPrompt, printFileSample, printFilePicker, printSessionList, summarizeToolResult, toolDetail, } from '../lib/code-agent-ui.js';
|
|
17
|
+
const SYSTEM_PROMPT = buildSystemPrompt();
|
|
18
|
+
function asOptionalString(value) {
|
|
19
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
20
|
+
}
|
|
21
|
+
function normalizeFiles(files) {
|
|
22
|
+
if (!files)
|
|
23
|
+
return [];
|
|
24
|
+
if (Array.isArray(files))
|
|
25
|
+
return files.filter((file) => typeof file === 'string' && !!file.trim());
|
|
26
|
+
if (typeof files === 'string' && files.trim())
|
|
27
|
+
return [files.trim()];
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
export function resolveSettings(opts) {
|
|
31
|
+
const cwd = path.resolve(opts.cwd ?? process.cwd());
|
|
32
|
+
const stat = fs.statSync(cwd);
|
|
33
|
+
if (!stat.isDirectory())
|
|
34
|
+
throw new Error(`cwd nao e diretorio: ${cwd}`);
|
|
35
|
+
const model = resolveCodeModel({
|
|
36
|
+
cliModel: asOptionalString(opts.model),
|
|
37
|
+
envModel: process.env.NEETRU_CODE_MODEL,
|
|
38
|
+
configuredGatewayModel: config.get('gatewayModel'),
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
cwd,
|
|
42
|
+
files: normalizeFiles(opts.file),
|
|
43
|
+
model: model.model,
|
|
44
|
+
modelWarning: model.warning,
|
|
45
|
+
maxTurns: parseBoundedNumber(opts.maxTurns, DEFAULT_CODE_MAX_TURNS, {
|
|
46
|
+
min: 1,
|
|
47
|
+
max: 30,
|
|
48
|
+
integer: true,
|
|
49
|
+
}),
|
|
50
|
+
maxTokens: parseBoundedNumber(opts.maxTokens, DEFAULT_CODE_MAX_TOKENS, {
|
|
51
|
+
min: 256,
|
|
52
|
+
max: 32_768,
|
|
53
|
+
integer: true,
|
|
54
|
+
}),
|
|
55
|
+
temperature: parseBoundedNumber(opts.temperature, DEFAULT_CODE_TEMPERATURE, {
|
|
56
|
+
min: 0,
|
|
57
|
+
max: 2,
|
|
58
|
+
}),
|
|
59
|
+
apply: opts.apply !== false && opts.plan !== true,
|
|
60
|
+
yes: opts.yes === true,
|
|
61
|
+
timeoutMs: 120_000,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async function runReviewCommand(settings, confirm, history) {
|
|
65
|
+
const previousApply = settings.apply;
|
|
66
|
+
const previousYes = settings.yes;
|
|
67
|
+
settings.apply = false;
|
|
68
|
+
settings.yes = false;
|
|
69
|
+
try {
|
|
70
|
+
await runAgentTask([
|
|
71
|
+
'Revise as mudancas atuais do projeto.',
|
|
72
|
+
'Use NEETRU_TOOL {"tool":"git_status"} e NEETRU_TOOL {"tool":"git_diff"} se precisar de contexto.',
|
|
73
|
+
'Nao proponha patch automaticamente. Liste achados por severidade, com arquivo/linha quando possivel.',
|
|
74
|
+
].join('\n'), settings, confirm, history);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
settings.apply = previousApply;
|
|
78
|
+
settings.yes = previousYes;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function buildInitialPrompt(task, settings) {
|
|
82
|
+
const fileBlocks = [];
|
|
83
|
+
for (const file of settings.files) {
|
|
84
|
+
fileBlocks.push(readFileContext(settings.cwd, file));
|
|
85
|
+
}
|
|
86
|
+
return [
|
|
87
|
+
`Tarefa do usuario:\n${task}`,
|
|
88
|
+
`Cwd: ${settings.cwd}`,
|
|
89
|
+
fileBlocks.length
|
|
90
|
+
? `Contexto inicial de arquivos:\n\n${fileBlocks.join('\n\n')}`
|
|
91
|
+
: 'Nenhum arquivo foi anexado inicialmente. Use NEETRU_TOOL para pedir contexto local.',
|
|
92
|
+
].join('\n\n');
|
|
93
|
+
}
|
|
94
|
+
async function defaultConfirm(question) {
|
|
95
|
+
if (!process.stdin.isTTY)
|
|
96
|
+
return false;
|
|
97
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
98
|
+
try {
|
|
99
|
+
const answer = await rl.question(question);
|
|
100
|
+
return /^(y|yes|s|sim)$/i.test(answer.trim());
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
rl.close();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Chama o AI Gateway com streaming (Fase 5) mostrando progresso ao vivo
|
|
108
|
+
* (contador de chars recebidos na mesma linha, via `\r`) em vez de ficar
|
|
109
|
+
* estatico durante respostas longas. So atualiza a linha em TTY real — em
|
|
110
|
+
* saida nao-interativa (pipe/CI/teste) isso so poluiria o log.
|
|
111
|
+
*
|
|
112
|
+
* Fallback: qualquer falha no streaming (rede, formato inesperado) refaz a
|
|
113
|
+
* chamada sem streaming — a corretude do turno nunca depende do streaming
|
|
114
|
+
* funcionar, so a experiencia visual.
|
|
115
|
+
*/
|
|
116
|
+
async function callGatewayWithProgress(settings, messages) {
|
|
117
|
+
const live = Boolean(process.stdout.isTTY);
|
|
118
|
+
let received = 0;
|
|
119
|
+
try {
|
|
120
|
+
const content = await streamGatewayChat(settings, messages, (_delta, total) => {
|
|
121
|
+
received = total;
|
|
122
|
+
if (live) {
|
|
123
|
+
process.stdout.write(`\r${chalk.dim(` ... recebendo resposta (${received} char(s))`)}`);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
if (live && received > 0) {
|
|
127
|
+
process.stdout.write('\r' + ' '.repeat(40) + '\r');
|
|
128
|
+
}
|
|
129
|
+
return content;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (live && received > 0) {
|
|
133
|
+
process.stdout.write('\r' + ' '.repeat(40) + '\r');
|
|
134
|
+
}
|
|
135
|
+
printEvent('warn', 'Streaming falhou, tentando sem streaming', error instanceof Error ? error.message : String(error));
|
|
136
|
+
return callGateway(settings, messages);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* `history` e mutado e reaproveitado entre chamadas: e o que da ao modo
|
|
141
|
+
* interativo memoria de conversa entre turnos do REPL (como Claude Code/Codex),
|
|
142
|
+
* em vez de cada linha digitada virar uma requisicao amnesica. O one-shot
|
|
143
|
+
* (`neetru code "tarefa"`) chama sem `history` — cada `runAgentTask` comeca do
|
|
144
|
+
* zero, igual sempre foi.
|
|
145
|
+
*
|
|
146
|
+
* `onState` (opcional): observa a maquina de estados da sessao (Fase 2,
|
|
147
|
+
* NEETRU_CODE_ARCHITECTURE.md) — usado por testes pra verificar a sequencia
|
|
148
|
+
* idle -> thinking -> tool_requested -> tool_running -> ... sem mockar o
|
|
149
|
+
* AI Gateway inteiro. Cada chamada de runAgentTask e um ciclo completo
|
|
150
|
+
* (comeca e termina em idle/applied/failed/aborted).
|
|
151
|
+
*/
|
|
152
|
+
export async function runAgentTask(task, settings, confirm, history = [], onState) {
|
|
153
|
+
if (!getActiveTokenSync()) {
|
|
154
|
+
throw new Error('Sessao Neetru ausente ou expirada. Rode `neetru login`.');
|
|
155
|
+
}
|
|
156
|
+
const machine = new CodeAgentStateMachine();
|
|
157
|
+
const goto = (next) => {
|
|
158
|
+
machine.transition(next);
|
|
159
|
+
onState?.(next);
|
|
160
|
+
};
|
|
161
|
+
const messages = history;
|
|
162
|
+
const isFirstTurn = messages.length === 0;
|
|
163
|
+
if (isFirstTurn)
|
|
164
|
+
messages.push({ role: 'system', content: SYSTEM_PROMPT });
|
|
165
|
+
messages.push({
|
|
166
|
+
role: 'user',
|
|
167
|
+
content: isFirstTurn ? buildInitialPrompt(task, settings) : task,
|
|
168
|
+
});
|
|
169
|
+
try {
|
|
170
|
+
for (let turn = 1; turn <= settings.maxTurns; turn++) {
|
|
171
|
+
goto('thinking');
|
|
172
|
+
printEvent('wait', 'AI Gateway', `turno ${turn}/${settings.maxTurns}`);
|
|
173
|
+
const content = await callGatewayWithProgress(settings, messages);
|
|
174
|
+
messages.push({ role: 'assistant', content });
|
|
175
|
+
const tool = parseToolRequest(content);
|
|
176
|
+
if (tool) {
|
|
177
|
+
goto('tool_requested');
|
|
178
|
+
printEvent('tool', tool.tool, toolDetail(tool));
|
|
179
|
+
goto('tool_running');
|
|
180
|
+
const result = runCodeTool(settings.cwd, tool);
|
|
181
|
+
printEvent('ok', 'contexto local', summarizeToolResult(result));
|
|
182
|
+
messages.push({
|
|
183
|
+
role: 'user',
|
|
184
|
+
content: `Resultado da tool ${tool.tool}:\n\n${result}`,
|
|
185
|
+
});
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const patch = extractPatch(content);
|
|
189
|
+
if (patch) {
|
|
190
|
+
goto('patch_ready');
|
|
191
|
+
console.log();
|
|
192
|
+
printPatchPreview(patch);
|
|
193
|
+
if (!settings.apply) {
|
|
194
|
+
printEvent('warn', 'Patch nao aplicado', '--plan/--no-apply');
|
|
195
|
+
goto('aborted');
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const approved = settings.yes || (await (async () => {
|
|
199
|
+
goto('awaiting_confirm');
|
|
200
|
+
return confirm('\nAplicar este patch? [y/N] ');
|
|
201
|
+
})());
|
|
202
|
+
if (!approved) {
|
|
203
|
+
printEvent('warn', 'Patch nao aplicado');
|
|
204
|
+
goto('aborted');
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
applyUnifiedPatch(settings.cwd, patch);
|
|
208
|
+
logAppliedPatch(settings.cwd, patchSummaryRows(patch)[0] ?? 'arquivos: nao detectado');
|
|
209
|
+
printEvent('ok', 'Patch aplicado', 'git apply');
|
|
210
|
+
goto('applied');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
console.log();
|
|
214
|
+
printAssistantText(content);
|
|
215
|
+
goto('idle');
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
goto('failed');
|
|
219
|
+
throw new Error(`Limite de turnos atingido (${settings.maxTurns}) sem resposta final.`);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
if (machine.state !== 'failed' && machine.state !== 'aborted' && machine.state !== 'applied') {
|
|
223
|
+
goto('failed');
|
|
224
|
+
}
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function printFileSampleForSettings(settings) {
|
|
229
|
+
const all = listFiles(settings.cwd);
|
|
230
|
+
printFileSample(all.slice(0, 60), all.length);
|
|
231
|
+
}
|
|
232
|
+
async function runInteractive(settings) {
|
|
233
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
234
|
+
throw new Error('Modo interativo exige terminal TTY. Use: neetru code "tarefa".');
|
|
235
|
+
}
|
|
236
|
+
renderHeader(settings, 'interactive');
|
|
237
|
+
renderInteractiveHelp();
|
|
238
|
+
if (settings.modelWarning)
|
|
239
|
+
log.warn(settings.modelWarning);
|
|
240
|
+
let history = [];
|
|
241
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
242
|
+
try {
|
|
243
|
+
for (;;) {
|
|
244
|
+
const line = (await rl.question(renderPrompt(settings))).trim();
|
|
245
|
+
if (!line)
|
|
246
|
+
continue;
|
|
247
|
+
const lower = line.toLowerCase();
|
|
248
|
+
if (lower === '/exit' || lower === '/sair' || lower === 'exit' || lower === 'quit')
|
|
249
|
+
return;
|
|
250
|
+
if (lower === '/clear') {
|
|
251
|
+
history = [];
|
|
252
|
+
process.stdout.write('\x1B[2J\x1B[H');
|
|
253
|
+
renderHeader(settings, 'interactive');
|
|
254
|
+
renderInteractiveHelp();
|
|
255
|
+
printEvent('ok', 'Conversa limpa');
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (lower === '/files') {
|
|
259
|
+
printFileSampleForSettings(settings);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (lower === '/pick') {
|
|
263
|
+
const all = listFiles(settings.cwd);
|
|
264
|
+
const shown = all.slice(0, 60);
|
|
265
|
+
printFilePicker(shown, all.length);
|
|
266
|
+
if (shown.length === 0)
|
|
267
|
+
continue;
|
|
268
|
+
const answer = await rl.question('Numero(s) separado(s) por virgula (Enter cancela): ');
|
|
269
|
+
const raw = answer.trim();
|
|
270
|
+
if (!raw) {
|
|
271
|
+
printEvent('warn', 'Cancelado');
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const picked = [];
|
|
275
|
+
for (const part of raw.split(',')) {
|
|
276
|
+
const idx = Number.parseInt(part.trim(), 10);
|
|
277
|
+
if (Number.isInteger(idx) && idx >= 1 && idx <= shown.length) {
|
|
278
|
+
picked.push(shown[idx - 1]);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (picked.length === 0) {
|
|
282
|
+
printEvent('warn', 'Nenhum arquivo valido selecionado');
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
const blocks = picked.map((file) => readFileContext(settings.cwd, file));
|
|
286
|
+
history.push({
|
|
287
|
+
role: 'user',
|
|
288
|
+
content: `Arquivos anexados manualmente via /pick:\n\n${blocks.join('\n\n')}`,
|
|
289
|
+
});
|
|
290
|
+
printEvent('ok', 'Arquivo(s) anexado(s) ao contexto', picked.join(', '));
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if (lower === '/overview' || lower === '/visao') {
|
|
294
|
+
printBox('visao do projeto', getProjectOverview(settings.cwd).split(/\r?\n/));
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
if (lower === '/diff') {
|
|
298
|
+
const diff = getGitDiff(settings.cwd);
|
|
299
|
+
if (diff === '(sem diff)') {
|
|
300
|
+
printEvent('ok', 'Sem diff local');
|
|
301
|
+
}
|
|
302
|
+
else if (diff.startsWith('ERRO:')) {
|
|
303
|
+
printEvent('error', 'git diff', diff);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
printBox('diff atual', ['git diff -- .']);
|
|
307
|
+
process.stdout.write(renderColoredDiff(diff));
|
|
308
|
+
if (!diff.endsWith('\n'))
|
|
309
|
+
process.stdout.write('\n');
|
|
310
|
+
}
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (lower === '/review') {
|
|
314
|
+
await runReviewCommand(settings, async (question) => {
|
|
315
|
+
const answer = await rl.question(question);
|
|
316
|
+
return /^(y|yes|s|sim)$/i.test(answer.trim());
|
|
317
|
+
}, history);
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
if (lower === '/save') {
|
|
321
|
+
const saved = saveCodeSession(settings, history);
|
|
322
|
+
printEvent('ok', 'Sessao salva', saved);
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (lower === '/resume') {
|
|
326
|
+
const sessions = listCodeSessions(settings.cwd);
|
|
327
|
+
printSessionList(sessions);
|
|
328
|
+
if (sessions.length === 0)
|
|
329
|
+
continue;
|
|
330
|
+
if (history.length > 0) {
|
|
331
|
+
const overwrite = await rl.question('\nConversa atual sera substituida. Continuar? [y/N] ');
|
|
332
|
+
if (!/^(y|yes|s|sim)$/i.test(overwrite.trim())) {
|
|
333
|
+
printEvent('warn', 'Cancelado');
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const answer = await rl.question('Numero da sessao (Enter cancela): ');
|
|
338
|
+
const idx = Number.parseInt(answer.trim(), 10);
|
|
339
|
+
if (!Number.isInteger(idx) || idx < 1 || idx > sessions.length) {
|
|
340
|
+
printEvent('warn', 'Cancelado');
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
const picked = sessions[idx - 1];
|
|
344
|
+
try {
|
|
345
|
+
history = loadCodeSession(settings.cwd, picked.file);
|
|
346
|
+
printEvent('ok', 'Sessao retomada', `${picked.file} (${history.length} mensagem(ns))`);
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
printEvent('error', 'Falha ao retomar sessao', error instanceof Error ? error.message : String(error));
|
|
350
|
+
}
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
if (lower === '/compact') {
|
|
354
|
+
const removed = compactCodeHistory(history);
|
|
355
|
+
printEvent('ok', 'Historico compactado', `${removed} mensagem(ns) removida(s)`);
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
if (lower === '/status' || lower === '/context') {
|
|
359
|
+
renderSessionStatus(settings, history);
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
if (lower === '/model') {
|
|
363
|
+
printBox('modelo', [settings.model]);
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
if (lower === '/plan') {
|
|
367
|
+
settings.apply = false;
|
|
368
|
+
printEvent('ok', 'Modo plano', 'patches nao serao aplicados');
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
if (lower === '/apply') {
|
|
372
|
+
settings.apply = true;
|
|
373
|
+
settings.yes = false;
|
|
374
|
+
printEvent('ok', 'Modo aplicar', 'pedira confirmacao antes do git apply');
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
if (lower === '/yes') {
|
|
378
|
+
settings.apply = true;
|
|
379
|
+
settings.yes = true;
|
|
380
|
+
printEvent('warn', 'Auto-aplicar ativo', 'patches validos serao aplicados sem pergunta');
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
if (lower === '/no') {
|
|
384
|
+
settings.yes = false;
|
|
385
|
+
printEvent('ok', 'Confirmacao manual ativa');
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
if (lower === '/help' || lower === '/ajuda') {
|
|
389
|
+
renderInteractiveHelp();
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
try {
|
|
393
|
+
await runAgentTask(line, settings, async (question) => {
|
|
394
|
+
const answer = await rl.question(question);
|
|
395
|
+
return /^(y|yes|s|sim)$/i.test(answer.trim());
|
|
396
|
+
}, history);
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
printEvent('error', 'Falha', error instanceof Error ? error.message : String(error));
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
finally {
|
|
404
|
+
rl.close();
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
function runDoctor(settings) {
|
|
408
|
+
const token = getActiveTokenSync();
|
|
409
|
+
const apiUrl = config.get('neetruApiUrl') ?? 'https://api.neetru.com';
|
|
410
|
+
const git = spawnSync('git', ['--version'], { cwd: settings.cwd, encoding: 'utf8' });
|
|
411
|
+
renderHeader(settings, 'doctor');
|
|
412
|
+
if (settings.modelWarning)
|
|
413
|
+
log.warn(settings.modelWarning);
|
|
414
|
+
console.log(chalk.bold('Doctor'));
|
|
415
|
+
console.log(` token Neetru: ${token ? chalk.green('ok') : chalk.red('ausente')}`);
|
|
416
|
+
console.log(` Core API: ${chalk.dim(apiUrl)}`);
|
|
417
|
+
console.log(` AI Gateway: ${chalk.dim(AI_GATEWAY_CHAT_PATH)}`);
|
|
418
|
+
console.log(` git: ${git.status === 0 ? chalk.green('ok') : chalk.red('falhou')}`);
|
|
419
|
+
console.log(` modo patch: ${settings.apply ? 'aplica com confirmacao' : 'somente plano'}`);
|
|
420
|
+
console.log();
|
|
421
|
+
if (!token || git.status !== 0)
|
|
422
|
+
setSafeExitCode(1);
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Entrada a partir do menu interativo do CLI (`neetru` sem args / `neetru ui`).
|
|
426
|
+
* Usa settings default (cwd do processo) e gerencia o raw-mode do stdin como
|
|
427
|
+
* o loop de canal do Chat (`runChannelLoop` em chat-menu.ts) — sai do raw mode
|
|
428
|
+
* pro readline do REPL funcionar, restaura no finally pro menu principal
|
|
429
|
+
* retomar o controle do teclado.
|
|
430
|
+
*/
|
|
431
|
+
export async function runCodeMenu() {
|
|
432
|
+
const wasRaw = process.stdin.isRaw === true;
|
|
433
|
+
try {
|
|
434
|
+
if (typeof process.stdin.setRawMode === 'function') {
|
|
435
|
+
process.stdin.setRawMode(false);
|
|
436
|
+
}
|
|
437
|
+
await runInteractive(resolveSettings({}));
|
|
438
|
+
}
|
|
439
|
+
finally {
|
|
440
|
+
if (typeof process.stdin.setRawMode === 'function') {
|
|
441
|
+
process.stdin.setRawMode(wasRaw);
|
|
442
|
+
}
|
|
443
|
+
process.stdin.resume();
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
export async function runCodeCommand(promptParts, opts = {}) {
|
|
447
|
+
try {
|
|
448
|
+
const settings = resolveSettings(opts);
|
|
449
|
+
const parts = promptParts ?? [];
|
|
450
|
+
if (parts.length === 1 && parts[0].toLowerCase() === 'doctor') {
|
|
451
|
+
runDoctor(settings);
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
const task = parts.join(' ').trim();
|
|
455
|
+
if (!task) {
|
|
456
|
+
await runInteractive(settings);
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
renderHeader(settings, 'oneshot');
|
|
460
|
+
if (settings.modelWarning)
|
|
461
|
+
log.warn(settings.modelWarning);
|
|
462
|
+
await runAgentTask(task, settings, defaultConfirm);
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
log.error(error instanceof Error ? error.message : String(error));
|
|
466
|
+
setSafeExitCode(1);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
//# 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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"}
|