ai-dev-workflow-cli 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,25 +1,36 @@
1
- # ai-dev-workflow (template 0.3.0 / CLI 0.5.0)
1
+ # ai-dev-workflow (template 0.3.0 / CLI 0.5.1)
2
2
 
3
3
  Template reutilizável para conduzir projetos **novos** e **existentes** com Codex, Continue e revisão humana. Não é uma plataforma de orquestração automática: os documentos em `agents/` descrevem papéis a serem assumidos por um agente conforme a fase.
4
4
 
5
- ## Distribuição npm em preparação
5
+ ## Instalação rápida com npx (CLI 0.5.1+)
6
6
 
7
- Pacote público previsto: **ai-dev-workflow-cli@0.5.0**. Executável: **ai-dev-workflow**. Node.js **24.x** exclusivo da ferramenta e Git **2.28+** para operações que o exigem; nenhuma dependência npm de runtime. Template 0.3.0 e manifesto 2.0.0 preservados. Esta revisão ainda não foi publicada.
8
-
9
- Para testar um tarball local em diretório isolado, sem npm link nem instalação global:
7
+ Abra o terminal do VS Code na **raiz Git do projeto**, em uma branch de task autorizada, e execute:
10
8
 
11
9
  ```sh
12
- npm install --prefix "/caminho/ferramenta-isolada" --offline --ignore-scripts --no-audit --no-fund "/caminho/ai-dev-workflow-cli-0.5.0.tgz"
13
- node "/caminho/ferramenta-isolada/node_modules/ai-dev-workflow-cli/bin/ai-dev-workflow.js" --version
10
+ npx ai-dev-workflow-cli init
14
11
  ```
15
12
 
16
- Após publicação explicitamente autorizada, será possível usar `npm exec --package=ai-dev-workflow-cli@0.5.0 -- ai-dev-workflow --help`. Esse exemplo consulta npm; não instala a ferramenta como dependência da aplicação. Confira origem e versão antes de executar. Não atualizar o runtime ou dependências da aplicação para usar a CLI.
13
+ A ferramenta exige **Node.js 24.x** no terminal da CLI e Git 2.28+. Use Node 24 separado do runtime da aplicação; não altere engines, dependências ou lockfiles do projeto. Não há instalação global: npx obtém a ferramenta em seu cache e pode solicitar confirmação do próprio npm antes da execução.
14
+
15
+ Em TTY, init mostra indícios de projeto existente e pede a trilha na primeira instalação; em reexecução usa a trilha já instalada. Diretório vazio não determina a trilha. Mostra destino e arquivos a criar/preservar e explica:
16
+
17
+ > Serão adicionados arquivos de regras, agentes e documentação para trabalhar com IA. Seu código e suas dependências serão preservados.
18
+
19
+ A confirmação é **Deseja adicionar o AI Dev Workflow a este projeto? (s/N)**, padrão N. Somente `s` confirma. Não inicializa Git, não altera branch, não migra instalações antigas e não instala automaticamente Codex, Continue, Claude Code ou Gemini CLI. Sem Git seguro/branch permitida, interrompe com orientação; não contorna controles para aceitar qualquer pasta.
20
+
21
+ Após instalar:
22
+
23
+ ```sh
24
+ npx ai-dev-workflow-cli discover
25
+ npx ai-dev-workflow-cli doctor
26
+ npx ai-dev-workflow-cli status
27
+ ```
17
28
 
18
- Pacote inclui código da CLI, catálogos/payloads, instruções/adaptadores, modelos e guias públicos. Exclui docs/project, docs/tasks, relatórios internos, logs, fixtures e dados de projetos. Não há acesso automático a banco/produção, atualização de instalações antigas ou aprovação humana implícita.
29
+ Use `discover --save` para persistir o diagnóstico explicitamente. Em CI, sem TTY, com --json/--dry-run ou para dispensar perguntas, informe `--track new|existing`, por exemplo `npx ai-dev-workflow-cli init --track existing --dry-run --json`. --target continua opcional com precedência explícita. O executável permanece ai-dev-workflow; template 0.3.0 e manifesto 2.0.0. O comando npx usa a versão publicada disponível: o assistente descrito requer 0.5.1 ou posterior.
19
30
 
20
31
  ## Início rápido
21
32
 
22
- Para instalar com a CLI 0.5.0, siga o [Quickstart](docs/QUICKSTART.md). Novas instalações usam o template central 0.3.0. Instalações legadas têm diagnóstico somente leitura, sem migração automática. O roteiro manual abaixo também exige destino autorizado e preservação dos arquivos existentes; não copie sobre personalizações.
33
+ Para instalar com a CLI 0.5.1, siga o [Quickstart](docs/QUICKSTART.md). Novas instalações usam o template central 0.3.0. Instalações legadas têm diagnóstico somente leitura, sem migração automática. O roteiro manual abaixo também exige destino autorizado e preservação dos arquivos existentes; não copie sobre personalizações.
23
34
 
24
35
  1. Crie um repositório a partir deste template (ou copie as pastas para um projeto autorizado).
25
36
  2. Leia `AGENTS.md` e `docs/WORKFLOW.md`.
@@ -60,7 +71,7 @@ Banco começa em **MANUAL_SQL**. Escolha de modo e aprovação de task não auto
60
71
  ## CLI local (TASK-003)
61
72
  Com Node.js 24 exclusivo da ferramenta e Git 2.28+ para init/doctor, execute `node bin/ai-dev-workflow.js --help`. Comandos init/doctor/status/validate, com --dry-run e --json; nenhuma instalação de dependências npm necessária. Node e dependências das aplicações não são alterados. A alternativa Docker mantém Node fora do host.
62
73
 
63
- Veja o [Quickstart](docs/QUICKSTART.md) para começar e [docs/CLI.md](docs/CLI.md) para instalação local, isolamento, conflitos, testes, Docker e estratégia futura de versões. O pacote não foi publicado; upgrade/downgrade automático não implementado. Os comandos não acessam banco, produção ou rede. G4 não concede DB_EXEC.
74
+ Veja o [Quickstart](docs/QUICKSTART.md) para começar e [docs/CLI.md](docs/CLI.md) para instalação local, isolamento, conflitos, testes, Docker e estratégia futura de versões. Upgrade/downgrade automático não implementado. Os comandos não acessam banco, produção ou rede. G4 não concede DB_EXEC.
64
75
 
65
76
  ## Estrutura instalada
66
77
 
package/docs/CLI.md CHANGED
@@ -3,9 +3,9 @@
3
3
  Para o primeiro uso, consulte o [Quickstart](QUICKSTART.md). Este guia detalha comportamento, isolamento e recuperação. Quickstart e guia de estrutura acompanham o checkout/pacote da ferramenta; não são documentos instalados no projeto pelo catálogo.
4
4
 
5
5
  ## Escopo e requisitos
6
- CLI **0.5.0**, template central **0.3.0**, catálogo/manifesto **2.0.0**, layout **central-v2** (SemVer). Node.js **24.x** exclusivamente para a ferramenta. Git **2.28+** disponível para init, doctor e testes; status/validate sem --save inspecionam a instalação e o isolamento dos metadados por filesystem, sem executar Git. Os quatro comandos exigem metadados Git locais verificáveis. Não instalar a CLI como dependência da aplicação. Não alterar Node, PHP, Java, Ruby, Python, package.json, lockfiles, PATH ou gerenciadores de versões do destino.
6
+ CLI **0.5.1**, template central **0.3.0**, catálogo/manifesto **2.0.0**, layout **central-v2** (SemVer). Node.js **24.x** exclusivamente para a ferramenta. Git **2.28+** disponível para init, doctor e testes; status/validate sem --save inspecionam a instalação e o isolamento dos metadados por filesystem, sem executar Git. Os quatro comandos exigem metadados Git locais verificáveis. Não instalar a CLI como dependência da aplicação. Não alterar Node, PHP, Java, Ruby, Python, package.json, lockfiles, PATH ou gerenciadores de versões do destino.
7
7
 
8
- Sem dependências npm. npm e tar são necessários para os testes de empacotamento, não para executar a CLI. O pacote não foi publicado. Não existem upgrade, downgrade, repair, --force ou --yes. Nenhum comando acessa banco, produção ou rede, nem executa scripts/hooks da aplicação. A CLI só chama comandos Git fixos de inspeção, sem shell. MANUAL_SQL é o padrão dos contextos novos; instalar não concede G0–G6, DB_CHANGE ou DB_EXEC.
8
+ Sem dependências npm. npm e tar são necessários para os testes de empacotamento, não para executar a CLI. Pacote npm: ai-dev-workflow-cli; executável: ai-dev-workflow. Não existem upgrade, downgrade, repair, --force ou --yes. Nenhum comando acessa banco, produção ou rede, nem executa scripts/hooks da aplicação. A CLI só chama comandos Git fixos de inspeção, sem shell. MANUAL_SQL é o padrão dos contextos novos; instalar não concede G0–G6, DB_CHANGE ou DB_EXEC.
9
9
 
10
10
  ## Preparar um projeto novo
11
11
  O destino deve existir e ser a raiz de um Git real, sem repositório pai/aninhado e em branch de task. Depois de obter autorização para criar o diretório/Git, preparar manualmente (exemplo sintético):
@@ -61,7 +61,7 @@ Em --json, **stdout contém um único objeto JSON**. Antes de qualquer escrita d
61
61
  Exemplo real de `--version --json`:
62
62
 
63
63
  ```json
64
- {"ok":true,"message":"0.5.0"}
64
+ {"ok":true,"message":"0.5.1"}
65
65
  ```
66
66
 
67
67
  Exemplo de erro por instalação interrompida (código de saída 2; sem execução de escrita):
@@ -207,10 +207,18 @@ init real continua dependendo de autorização para criação: retirar --dry-run
207
207
 
208
208
  process.cwd() representa o diretório atual do processo, não a pasta do executável, PWD de ambiente ou raiz Git descoberta. Não há busca de projeto nem subida de diretórios para escolher outro alvo. As inspeções de marcadores Git ancestrais continuam necessárias para bloquear GIT_PARENT/GIT_NESTED; elas não promovem o destino. Subpastas continuam recusadas conforme contrato de cada comando. No Docker, o padrão é o diretório de trabalho do contêiner (/project na imagem atual), nunca o cwd do host; esses exemplos não representam teste Docker.
209
209
 
210
- Sem Git, apenas discover --allow-no-git pode usar o modo limitado existente. Init mantém --track obrigatório; políticas de branch, journal, manifestos, MANUAL_SQL e aprovações não mudam. Alvo inválido não é criado automaticamente. Se process.cwd() não puder ser obtido, CWD_UNAVAILABLE retorna exit 1 com mensagem sanitizada; --target absoluto permite selecionar um destino sem obter cwd pela CLI. Help/version não consultam cwd. Não há alteração de formato ou migração.
210
+ Sem Git, apenas discover --allow-no-git pode usar o modo limitado existente. Init exige --track fora do assistente TTY; políticas de branch, journal, manifestos, MANUAL_SQL e aprovações não mudam. Alvo inválido não é criado automaticamente. Se process.cwd() não puder ser obtido, CWD_UNAVAILABLE retorna exit 1 com mensagem sanitizada; --target absoluto permite selecionar um destino sem obter cwd pela CLI. Help/version não consultam cwd. Não há alteração de formato ou migração.
211
211
 
212
212
 
213
213
  ## Registros opt-in (TASK-009)
214
214
  Os cinco comandos aceitam `--save`, que grava eventos seguros em docs/project/COMMAND_HISTORY.jsonl. Discover concluído salva também docs/project/DISCOVERY.md e versões em docs/project/discovery-history/, preservando documentos personalizados. Sem save, mantém-se o comportamento anterior; discover bem-sucedido em texto apenas sugere salvar. `--save --dry-run` é erro 3 sem escrita.
215
215
 
216
216
  Gravações exigem Git seguro e branch de task, ou discover sem Git explicitamente permitido. Status/validate com save passam a exigir Git executável para essa autorização de escrita. JSON separa operationExitCode e persistence; falha de registro pode ocorrer após a operação concluir. Journal/lock de persistência são separados da instalação e exigem reconciliação humana se restarem. Detalhes, exemplos, limites, recuperação e alcance parcial da auditoria no [guia de persistência](PERSISTENCE.md). Não há migração ou alteração de MANUAL_SQL.
217
+
218
+
219
+ ## Init interativo (TASK-011, 0.5.1+)
220
+ `npx ai-dev-workflow-cli init` usa cwd sem promover para raiz/pai. Somente em stdin/stdout TTY, sem --track, --json e --dry-run, oferece o assistente. Git/branch/journal e perfil são validados antes das perguntas; o instalador existente faz plano dry-run e revalida na execução confirmada. Não há inicialização Git, bypass, migração ou sobrescrita.
221
+
222
+ Trilha instalada prevalece; manifesto conhecido presente é indício de existing, sem ler seu conteúdo. Em primeira instalação esse indício não determina a fase: exige escolha new/existing sem padrão, inclusive em pasta vazia. Antes da escrita lista arquivos criados/preservados/conflitos. Apresenta a explicação e confirmação exatas do [Quickstart](QUICKSTART.md#caminho-comum-com-npx-051), padrão N; somente s confirma. Enter/n/EOF cancelam com exit 0 sem escrita/evento save; entrada de trilha inválida retorna 3. Falhas e conflitos mantêm códigos anteriores. --track explícito preserva execução determinística sem perguntas; CI, --json e --dry-run sem trilha retornam orientação/exit 3.
223
+
224
+ Sucesso interativo informa próximos comandos npx discover/doctor/status e que clientes de IA não são instalados. Nenhuma dependência ou runtime da aplicação é alterado. Confirmação é somente autorização de instalação dos arquivos mostrados, não aprovação de fases ou banco. Histórico --save e limites de filesystem/ACLs permanecem; interromper durante escrita exige a reconciliação anterior. Npx pode acessar npm/cache antes de iniciar o binário; a CLI não executa npm internamente.
@@ -1,6 +1,6 @@
1
1
  # Discovery estático — TASK-006
2
2
 
3
- Disponível na CLI 0.5.0 (introduzido na 0.3.0), Node.js 24 exclusivo da ferramenta; sem dependências npm. O comando `discover` analisa arquivos estáticos autorizados, sem executar código da aplicação ou acessar rede/banco. Sem --save, não preenche DISCOVERY.md; não concede G1 e não substitui revisão humana. Discover não altera template, manifestos ou snapshots de instalação do alvo; a versão do template padrão é documentada no guia multi-IA.
3
+ Disponível na CLI 0.5.1 (introduzido na 0.3.0), Node.js 24 exclusivo da ferramenta; sem dependências npm. O comando `discover` analisa arquivos estáticos autorizados, sem executar código da aplicação ou acessar rede/banco. Sem --save, não preenche DISCOVERY.md; não concede G1 e não substitui revisão humana. Discover não altera template, manifestos ou snapshots de instalação do alvo; a versão do template padrão é documentada no guia multi-IA.
4
4
 
5
5
  ## Uso
6
6
  ```sh
package/docs/MULTI_AI.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # Suporte multi-IA — TASK-007
2
- CLI 0.5.0; template 0.3.0; manifesto 2.0.0. Implementação local para G5, sem comprovação de carregamento real pelos clientes.
2
+ CLI 0.5.1; template 0.3.0; manifesto 2.0.0. Implementação local para G5, sem comprovação de carregamento real pelos clientes.
3
3
 
4
4
  ## Uma fonte de regras
5
5
  AGENTS.md e as regras/processo canônicos continuam existentes; nenhum conteúdo normativo é copiado para CLAUDE.md/GEMINI.md. Os novos arquivos contêm apenas imports locais de AGENTS.md, workflow e regras centrais obrigatórias, incluindo banco. Papéis e templates continuam sob .ai-dev-workflow; os contextos do projeto em docs/project são lidos conforme fase e autorização. Não há dependência de fornecedor, chamadas de IA, plugins, perguntas interativas ou configuração global no init.
@@ -1,8 +1,24 @@
1
1
  # Começar com a CLI do AI Dev Workflow
2
2
 
3
- A CLI instala instruções e prepara o contexto do workflow em projetos novos ou existentes, independentemente da stack. CLI **0.5.0**, template central **0.3.0**. Não cria a aplicação, não realiza o Discovery humano completo automaticamente, não executa agentes nem concede aprovações humanas.
3
+ A CLI instala instruções e prepara o contexto do workflow em projetos novos ou existentes, independentemente da stack. CLI **0.5.1**, template central **0.3.0**. Não cria a aplicação, não realiza o Discovery humano completo automaticamente, não executa agentes nem concede aprovações humanas.
4
4
 
5
- Este guia usa um checkout local confiável da ferramenta. Primeiras instalações usam .ai-dev-workflow para o núcleo e preservam docs/project para documentos próprios. Se já houver manifesto legado, init é bloqueado (LEGACY_READ_ONLY): use doctor/status/validate somente leitura; não há migração automática. Não há pacote npm publicado. Para detalhes e recuperação, consulte o [guia da CLI](CLI.md).
5
+ Este guia usa um checkout local confiável da ferramenta. Primeiras instalações usam .ai-dev-workflow para o núcleo e preservam docs/project para documentos próprios. Se já houver manifesto legado, init é bloqueado (LEGACY_READ_ONLY): use doctor/status/validate somente leitura; não há migração automática. A CLI pode ser executada via npx ai-dev-workflow-cli. Para detalhes e recuperação, consulte o [guia da CLI](CLI.md).
6
+
7
+ ## Caminho comum com npx (0.5.1+)
8
+
9
+ Em um terminal TTY do VS Code, na raiz Git autorizada e branch de task, execute:
10
+
11
+ ```sh
12
+ npx ai-dev-workflow-cli init
13
+ ```
14
+
15
+ O terminal da ferramenta precisa de Node.js 24.x separado do runtime da aplicação. Não atualizar as dependências ou versões da aplicação. Npx usa cache, sem instalação global, e pode perguntar sobre o download do pacote; essa pergunta pertence ao npm. A versão publicada deve ser 0.5.1 ou posterior para oferecer o assistente descrito.
16
+
17
+ Init usa a trilha já instalada; em primeira instalação mostra indícios e pede a decisão new/existing, inclusive em diretório vazio. Manifesto sozinho pode ser ambíguo. Presença de manifesto não certifica stack/funcionalidade. Antes de escrever, mostra plano e a explicação “Serão adicionados arquivos de regras, agentes e documentação para trabalhar com IA. Seu código e suas dependências serão preservados.” Confirma com “Deseja adicionar o AI Dev Workflow a este projeto? (s/N)”. Somente s confirma; Enter/n/EOF cancelam sem escrita (exit 0). Escolha de trilha inválida é erro 3. Conflitos e Git inseguro bloqueiam antes da confirmação.
18
+
19
+ Sem TTY ou com --json/--dry-run, usar `init --track new|existing`; sem essa decisão retorna 3, sem perguntas ou escrita. --track explícito também evita interação em TTY. Git nunca é inicializado; preparar raiz e branch manualmente com autorização conforme abaixo. Journal/legado, MANUAL_SQL e aprovações humanas não mudam. Confirmar instalação não concede G1–G6 nem DB_EXEC. A CLI não instala os clientes de IA.
20
+
21
+ Depois: `npx ai-dev-workflow-cli discover`, `npx ai-dev-workflow-cli doctor` e `npx ai-dev-workflow-cli status`. Persistir Discovery continua opt-in via --save. Cancelar init --save não gera evento; histórico permanece parcial. As seções seguintes detalham preparação e execução avançada via Node/Docker; Docker não é necessário para o caminho comum.
6
22
 
7
23
  ## 1. Conferir os pré-requisitos
8
24
 
@@ -94,7 +110,7 @@ Sem --save, as três inspeções são somente leitura; também aceitam --dry-run
94
110
  `--json` envia um único objeto JSON para stdout. Init sem --dry-run anuncia o destino canonicalizado em stderr antes das escritas; capture os dois canais separadamente. Exemplo real de versão:
95
111
 
96
112
  ```json
97
- {"ok":true,"message":"0.5.0"}
113
+ {"ok":true,"message":"0.5.1"}
98
114
  ```
99
115
 
100
116
  Os resultados variam por comando: init inclui operations; doctor, checks; status, files; validate, findings. `ok:true` não significa aprovação humana ou aplicação testada.
@@ -104,7 +120,7 @@ Os resultados variam por comando: init inclui operations; doctor, checks; status
104
120
  | 0 | Operação concluída; status pode apresentar drift sem falhar |
105
121
  | 1 | Falha operacional: I/O/permissões, Node incompatível ou executável Git necessário indisponível |
106
122
  | 2 | Conflito ou validação bloqueante: metadados inseguros, journal, manifesto inválido, arquivo conflitante ou lock ocupado |
107
- | 3 | Argumentos inválidos, como comando/flag desconhecidos ou --target vazio ou ausência de --track obrigatório no init |
123
+ | 3 | Argumentos inválidos, como comando/flag desconhecidos ou --target vazio ou ausência de --track fora do assistente TTY |
108
124
 
109
125
  ## 5. Alternativa Docker
110
126
 
@@ -194,7 +210,7 @@ A CLI 0.3.0 oferece `discover --target DIR --json` como inventário técnico lim
194
210
  CLI 0.4.0/template 0.3.0 acrescentam CLAUDE.md/GEMINI.md com imports locais, preservando arquivos personalizados. Templates anteriores são apenas inspecionados: init retorna LEGACY_READ_ONLY ou TEMPLATE_READ_ONLY, sem atualização automática. Veja [o guia multi-IA](MULTI_AI.md); arquivos presentes não comprovam carregamento por clientes.
195
211
 
196
212
  ## Comandos na pasta atual (TASK-008)
197
- Após confirmar que o terminal está na raiz autorizada do projeto, --target pode ser omitido em init, doctor, status, validate e discover. Exemplo: `node /caminho/ai-dev-workflow/bin/ai-dev-workflow.js doctor --json`. init continua exigindo --track, por exemplo `init --track existing --dry-run --json`; sem Git, discover continua exigindo --allow-no-git. Exemplos anteriores com --target explícito permanecem válidos e prevalecem sobre a pasta atual. Não há busca de raiz Git ou fallback para o pai; subpastas e GIT_NESTED mantêm seus bloqueios. Revise canonicalTarget antes de instalar. No PowerShell, use o caminho absoluto Windows do executável entre aspas com os mesmos argumentos. Veja [o contrato completo](CLI.md#alvo-implícito-task-008).
213
+ Após confirmar que o terminal está na raiz autorizada do projeto, --target pode ser omitido em init, doctor, status, validate e discover. Exemplo: `node /caminho/ai-dev-workflow/bin/ai-dev-workflow.js doctor --json`. fora do assistente TTY, init exige --track, por exemplo `init --track existing --dry-run --json`; sem Git, discover continua exigindo --allow-no-git. Exemplos anteriores com --target explícito permanecem válidos e prevalecem sobre a pasta atual. Não há busca de raiz Git ou fallback para o pai; subpastas e GIT_NESTED mantêm seus bloqueios. Revise canonicalTarget antes de instalar. No PowerShell, use o caminho absoluto Windows do executável entre aspas com os mesmos argumentos. Veja [o contrato completo](CLI.md#alvo-implícito-task-008).
198
214
 
199
215
 
200
216
  ## Guardar diagnósticos e consultar registros
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-dev-workflow-cli",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Instalador local e diagnóstico do AI Dev Workflow",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -37,7 +37,7 @@
37
37
  "docs/LAYOUT.md"
38
38
  ],
39
39
  "scripts": {
40
- "test": "node --test test/commands.test.js test/installer.test.js test/safety.test.js test/package.test.js test/recovery.test.js test/git-paths.test.js test/exit-codes.test.js test/git-storage.test.js test/layout.test.js test/discovery.test.js test/discovery-corrections.test.js test/multi-ai.test.js test/cwd.test.js test/persistence.test.js",
40
+ "test": "node --test test/commands.test.js test/installer.test.js test/safety.test.js test/package.test.js test/recovery.test.js test/git-paths.test.js test/exit-codes.test.js test/git-storage.test.js test/layout.test.js test/discovery.test.js test/discovery-corrections.test.js test/multi-ai.test.js test/cwd.test.js test/persistence.test.js test/interactive-init.test.js",
41
41
  "validate:catalog": "node scripts/check-catalog.js"
42
42
  },
43
43
  "publishConfig": {
package/src/cli.js CHANGED
@@ -8,12 +8,13 @@ import { run as status } from './commands/status.js';
8
8
  import { run as discover } from './commands/discover.js';
9
9
  import { run as validate } from './commands/validate.js';
10
10
  import { preflight, persist } from './persistence/record.js';
11
+ import { prepareInit } from './interaction/init.js';
11
12
  import { renderText } from './output/text.js';
12
13
  import { renderJson } from './output/json.js';
13
14
  const help = `ai-dev-workflow <init|doctor|status|validate|discover> [--target <diretorio>]
14
15
  --target omitido usa process.cwd(); não procura outra raiz nem sobe diretórios.
15
16
  Git 2.28+ é necessário para init/doctor; Git nunca é inicializado automaticamente.
16
- init requer --track new|existing. discover admite --allow-no-git somente para ausência real de Git. Opções: --dry-run --json --help --version. --save grava registros locais opt-in; incompatível com --dry-run.
17
+ init em TTY sem flags de automação oferece plano e confirmação padrão N; fora desse modo requer --track new|existing. discover admite --allow-no-git somente para ausência real de Git. Opções: --dry-run --json --help --version. --save grava registros locais opt-in; incompatível com --dry-run.
17
18
  Node.js 24 somente para a CLI; nenhum comando acessa banco, rede ou runtime da aplicação.
18
19
  `;
19
20
  export async function main(args, io = { out: text => process.stdout.write(text), err: text => process.stderr.write(text) }) {
@@ -36,10 +37,14 @@ export async function main(args, io = { out: text => process.stdout.write(text),
36
37
  }
37
38
  const command = positionals[0];
38
39
  if (positionals.length !== 1 || !['init', 'doctor', 'status', 'validate', 'discover'].includes(command) ||
39
- values.target === '' || (command === 'init' && !['new', 'existing'].includes(values.track)) ||
40
+ values.target === '' || (command === 'init' && values.track !== undefined && !['new', 'existing'].includes(values.track)) ||
40
41
  (command !== 'init' && values.track !== undefined) ||
41
42
  (command !== 'discover' && values['allow-no-git'] !== undefined))
42
43
  fail('ARGUMENTS', 'Informe comando válido e, para init, --track new|existing. --target é opcional, mas não pode ser vazio. Use --help.', 3);
44
+ const interactiveInit = !process.env.CI && command === 'init' && values.track === undefined && !json && !values['dry-run'] &&
45
+ !!(io.input ?? process.stdin).isTTY && !!(io.output ?? process.stdout).isTTY;
46
+ if (command === 'init' && values.track === undefined && !interactiveInit)
47
+ fail('ARGUMENTS', 'Init sem interação requer --track new|existing. Use um terminal TTY para o assistente; CI, --json e --dry-run não fazem perguntas.', 3);
43
48
  let input = values.target;
44
49
  if (input === undefined) {
45
50
  try { input = process.cwd(); }
@@ -48,6 +53,14 @@ export async function main(args, io = { out: text => process.stdout.write(text),
48
53
  const target = await resolveTarget(input);
49
54
  if ((command === 'init' && !values['dry-run']) || values.save) io.err(`Destino canonicalizado: ${target}\n`);
50
55
  if (values.save) await preflight(target,command,!!values['allow-no-git']);
56
+ if (interactiveInit) {
57
+ const prepared = await prepareInit(target,io);
58
+ if (prepared.result) {
59
+ io.out(renderText({ command, canonicalTarget:target, ...prepared.result }));
60
+ return prepared.result.exitCode ?? (prepared.result.ok ? 0 : 2);
61
+ }
62
+ values.track = prepared.track;
63
+ }
51
64
  const execute = async () => command === 'discover' ? await discover({ target, allowNoGit: !!values['allow-no-git'] }) : command === 'init' ? await init({ target, track: values.track, dryRun: !!values['dry-run'] }) :
52
65
  await ({ doctor, status, validate })[command](target);
53
66
  let result;
@@ -62,6 +75,7 @@ export async function main(args, io = { out: text => process.stdout.write(text),
62
75
  catch(e) { response.persistence={ok:false,writeState:'incomplete-or-unknown',code:e instanceof WorkflowError?e.code:'IO_ERROR',message:'Persistência não concluída; preservar evidências e revisar sem repetir init automaticamente.'};response.ok=false;response.exitCode=e.exitCode??1; }
63
76
  }
64
77
  io.out(json ? renderJson(response) : renderText(response));
78
+ if (interactiveInit && response.ok) io.out('Próximos passos neste projeto: npx ai-dev-workflow-cli discover, npx ai-dev-workflow-cli doctor e npx ai-dev-workflow-cli status.\nA CLI não instala automaticamente Codex, Continue, Claude Code ou Gemini CLI.\n');
65
79
  if (!json && command==='discover' && !values.save && result.ok) io.out('Para salvar este diagnóstico, use discover --save, mantendo o mesmo destino.\n');
66
80
  return response.exitCode??result.exitCode ?? (result.ok ? 0 : 2);
67
81
  } catch (error) {
@@ -0,0 +1,52 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { checkedPath, stat } from '../platform/filesystem.js';
3
+ import { inspectGit } from '../platform/git.js';
4
+ import { installedProfile } from '../core/manifest.js';
5
+ import { assertReconciled } from '../core/journal.js';
6
+ import { fail } from '../core/errors.js';
7
+ import { run as init } from '../commands/init.js';
8
+
9
+ export async function prepareInit(target, io) {
10
+ const git = await inspectGit(target);
11
+ if (!git.safe) fail(git.code, git.message, git.exitCode);
12
+ await assertReconciled(target);
13
+ const installed = await installedProfile(target);
14
+ let track = installed?.manifest.track;
15
+ if (!track) {
16
+ let hint=false;
17
+ // Somente presença de manifestos conhecidos; não ler conteúdo/configurações/segredos.
18
+ for (const name of ['package.json','composer.json','pyproject.toml','requirements.txt','pom.xml','build.gradle','build.gradle.kts','Gemfile','Cargo.toml','go.mod']) {
19
+ const info = await stat(await checkedPath(target, name));
20
+ if (info?.nlink !== undefined && info.nlink !== 1) fail('UNSAFE_PATH', 'Manifesto indireto; revisar o destino.');
21
+ if (info) hint = true;
22
+ }
23
+ if (hint) io.out('Indício de projeto existente: manifesto conhecido presente. Confirme a trilha; presença de manifesto não determina a fase do projeto.\n');
24
+ }
25
+ const rl = createInterface({ input: io.input ?? process.stdin, terminal: false, crlfDelay: Infinity });
26
+ const lines = rl[Symbol.asyncIterator]();
27
+ const ask = async prompt => {
28
+ io.out(prompt);
29
+ const line = await lines.next();
30
+ return line.done ? null : line.value.trim().toLowerCase();
31
+ };
32
+ const cancelled = { result: { ok:true, code:'CANCELLED', message:'Instalação cancelada; nenhum arquivo escrito.' } };
33
+ try {
34
+ if (!track) {
35
+ const answer = await ask('Trilha não determinada (diretório vazio também é ambíguo). [1] Projeto novo [2] Projeto existente: ');
36
+ if (answer === null) return cancelled;
37
+ track = ['1','new'].includes(answer) ? 'new' : ['2','existing'].includes(answer) ? 'existing' : null;
38
+ if (!track) fail('ARGUMENTS', 'Escolha new ou existing; nenhuma escrita. Também pode usar init --track new|existing.', 3);
39
+ }
40
+ const plan = await init({ target, track, dryRun:true });
41
+ io.out(`Plano para ${target}\nTrilha: ${track}\n`);
42
+ for (const [label, actions] of [['Criar',['create']],['Preservar',['unchanged','preserve-custom']],['Conflitos',['conflict']]]) {
43
+ const files = plan.operations.filter(e => actions.includes(e.action)).map(e => e.path);
44
+ if (files.length) io.out(`${label} (${files.length}): ${files.join(', ')}\n`);
45
+ }
46
+ if (!plan.ok) return { result:plan };
47
+ io.out('Serão adicionados arquivos de regras, agentes e documentação para trabalhar com IA. Seu código e suas dependências serão preservados.\n');
48
+ const answer = await ask('Deseja adicionar o AI Dev Workflow a este projeto? (s/N) ');
49
+ if (answer !== 's') return cancelled;
50
+ return { track };
51
+ } finally { rl.close(); }
52
+ }