command-cmd 1.0.2 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (6) hide show
  1. package/cmd.js +2165 -16
  2. package/doc.md +292 -152
  3. package/docPTBR.md +299 -152
  4. package/map.md +244 -0
  5. package/mapPTBR.md +244 -0
  6. package/package.json +5 -2
package/docPTBR.md CHANGED
@@ -1,19 +1,14 @@
1
1
  # command-cmd (Documentacao PT-BR)
2
2
 
3
- `command-cmd` e uma biblioteca para detectar e extrair comandos estruturados de texto livre, com foco em respostas de IA.
3
+ `command-cmd` extrai comandos de texto de IA e executa automacoes com cursor via `robotjs`.
4
4
 
5
- Ela e util quando o modelo retorna linguagem natural junto com blocos de comando e voce precisa transformar isso em dados para automacao.
5
+ Funcoes exportadas:
6
6
 
7
- ## Para que serve
8
-
9
- Use esta biblioteca para:
10
-
11
- - Extrair comandos embutidos em respostas de IA.
12
- - Capturar varios comandos na mesma mensagem.
13
- - Normalizar saida em um objeto padrao com `type`, `command`, `extra` e `seq`.
14
- - Interpretar entradas com chaves em ingles e portugues (`type/tipo`, `command/comando`).
15
-
16
- Ela **nao executa comandos**. Ela apenas faz parsing.
7
+ - `cmd`
8
+ - `extractFirstCommand`
9
+ - `cursor`
10
+ - `initMap`
11
+ - `initDoc`
17
12
 
18
13
  ## Instalacao
19
14
 
@@ -21,223 +16,375 @@ Ela **nao executa comandos**. Ela apenas faz parsing.
21
16
  npm install command-cmd
22
17
  ```
23
18
 
24
- ## Uso rapido
19
+ ## Importacao (com nomes em PT-BR)
25
20
 
26
21
  ```js
27
- import { cmd, extractFirstCommand } from 'command-cmd';
22
+ import {
23
+ cmd as extrairComandos,
24
+ extractFirstCommand as extrairPrimeiroComando,
25
+ cursor as executarCursor,
26
+ initMap as iniciarMap,
27
+ initDoc as iniciarDoc
28
+ } from 'command-cmd';
29
+ ```
30
+
31
+ ## 1) `cmd(message)`
32
+
33
+ Extrai blocos de comando de um texto.
28
34
 
29
- const textoDaIA = `
30
- Vamos executar em duas etapas:
31
- [tipo: shell, comando: npm test, extra: executar na raiz do projeto, seq: 2]
32
- `;
35
+ Formato aceito:
33
36
 
34
- const listaDeComandos = cmd(textoDaIA);
35
- const primeiroComando = extractFirstCommand(textoDaIA);
37
+ ```txt
38
+ [tipo: abrir_app, comando: tiktok, botao: barra_pesquisa, seq: 1]
39
+ ```
40
+
41
+ Para movimento sequencial:
36
42
 
37
- console.log(listaDeComandos);
38
- console.log(primeiroComando);
43
+ ```txt
44
+ [mover_sequencia, points: 120x220|420x260|800x300, interval: 300, click: between, doubleClick: true]
39
45
  ```
40
46
 
41
- Saida esperada:
47
+ Tambem aceita o formato curto que voce pediu:
42
48
 
43
- ```js
44
- [
45
- {
46
- type: 'shell',
47
- command: 'npm test',
48
- extra: 'executar na raiz do projeto',
49
- seq: 2
50
- }
51
- ]
49
+ ```txt
50
+ [abrir_app, comando: tiktok, botao: pularADS]
51
+ ```
52
+
53
+ Objeto retornado:
52
54
 
55
+ ```js
53
56
  {
54
- type: 'shell',
55
- command: 'npm test',
56
- extra: 'executar na raiz do projeto',
57
- seq: 2
57
+ type: 'abrir_app',
58
+ command: 'tiktok',
59
+ extra: undefined,
60
+ button: 'pularADS',
61
+ seq: 1
58
62
  }
59
63
  ```
60
64
 
61
- ## API completa
65
+ ## 2) `extractFirstCommand(message)`
62
66
 
63
- ### `cmd(message)`
67
+ Retorna apenas o primeiro comando valido.
64
68
 
65
- Extrai **todos** os comandos validos de uma string.
69
+ Saida:
66
70
 
67
- - Entrada: `message` (string).
68
- - Saida: `Array<{ type: string, command: string, extra?: string, seq?: number }>`
69
- - Se `message` nao for string: retorna `[]`.
70
- - Se nenhum comando valido for encontrado: retorna `[]`.
71
+ ```js
72
+ {
73
+ type,
74
+ command,
75
+ extra,
76
+ button,
77
+ key,
78
+ modifiers,
79
+ text,
80
+ typeDelay,
81
+ points,
82
+ path,
83
+ interval,
84
+ clickDelay,
85
+ click,
86
+ doubleClick,
87
+ seq
88
+ } | null
89
+ ```
71
90
 
72
- Um comando so entra no resultado quando tem:
91
+ ## 3) `cursor(input, options?)`
73
92
 
74
- - `type` (ou `tipo`)
75
- - `command` (ou `comando`)
93
+ Executa os comandos com mouse/teclado.
76
94
 
77
- Regras do campo `seq`:
95
+ `input` pode ser:
78
96
 
79
- - E opcional.
80
- - Aceita apenas numero inteiro maior ou igual a zero.
81
- - Se o valor for invalido (ex.: `seq: duas_vezes`), o campo fica `undefined`.
97
+ - `string` (a funcao chama `cmd` internamente)
98
+ - objeto unico
99
+ - lista de objetos
82
100
 
83
- ### `extractFirstCommand(message)`
101
+ Campos aceitos no objeto:
84
102
 
85
- Retorna apenas o primeiro comando valido.
103
+ - `type` ou `tipo`
104
+ - `command` ou `comando`
105
+ - `button` ou `botao`
106
+ - `key` ou `tecla` (para `key_tap`)
107
+ - `modifiers` ou `modificadores` (ex.: `command+shift`)
108
+ - `text` ou `texto` (para `type_string_delayed`)
109
+ - `typeDelay` ou `typingDelay` (ms por caractere na digitacao)
110
+ - `points` ou `pontos` (sequencia de coordenadas)
111
+ - `path` ou `caminho` ou `trajeto` (alias de `points`)
112
+ - `interval` ou `intervalo` (ms entre pontos)
113
+ - `clickDelay` ou `delayClique` (ms entre chegada no ponto e clique)
114
+ - `click` ou `clique` (`none`, `between`, `each`, `first`, `last`)
115
+ - `doubleClick` ou `duplo` (true/false)
116
+ - `seq` ou `sequencia`
117
+ - `extra`
86
118
 
87
- - Entrada: `message` (string).
88
- - Saida: `{ type, command, extra, seq } | null`
89
- - Se nao houver comando valido: retorna `null`.
119
+ ## 4) `initMap(options?)`
90
120
 
91
- ## Formato esperado dos comandos
121
+ Cria (ou carrega/mescla) o `map.json` de forma explicita.
92
122
 
93
- Cada comando deve estar entre colchetes:
123
+ Exemplo:
94
124
 
95
- ```txt
96
- [tipo: valor, comando: valor, extra: valor, seq: 3]
125
+ ```js
126
+ await iniciarMap();
127
+ await iniciarMap({ mapPath: './config/map.json' });
97
128
  ```
98
129
 
99
- Chaves reconhecidas:
130
+ Campos opcionais:
100
131
 
101
- - `type` ou `tipo`
102
- - `command` ou `comando`
103
- - `extra`
104
- - `seq`
132
+ - `mapPath`
133
+ - `createMapIfMissing`
134
+ - `persistMap`
135
+ - `apps`
136
+ - `defaultClosePoint`
137
+ - `skipAdsPoint`
138
+ - `persistMerged` (salva defaults mesclados mesmo se o map ja existir)
105
139
 
106
- A comparacao das chaves e case-insensitive.
140
+ ## 5) `initDoc(options?)`
107
141
 
108
- Exemplos validos:
142
+ Cria os arquivos de documentacao usando os templates do pacote.
109
143
 
110
- ```txt
111
- [TYPE: shell, COMMAND: ls -la, SEQ: 1]
112
- [tipo: shell, comando: pwd, seq: 2]
144
+ Por padrao, escreve no diretório atual:
145
+
146
+ - `doc.md`
147
+ - `docPTBR.md`
148
+ - `map.md`
149
+ - `mapPTBR.md`
150
+
151
+ Exemplo:
152
+
153
+ ```js
154
+ await iniciarDoc();
155
+ await iniciarDoc({ outputDir: './docs', overwrite: true, includeMapDocs: false });
113
156
  ```
114
157
 
115
- ## Regras de parsing
158
+ Campos opcionais:
116
159
 
117
- - A biblioteca procura trechos no formato `[ ... ]`.
118
- - O conteudo interno e dividido por virgula.
119
- - Cada parte precisa ter `:` para virar `chave: valor`.
120
- - Bloco sem `type/tipo` ou `command/comando` e ignorado.
121
- - `seq` so e aplicado quando for numero inteiro nao negativo.
122
- - Chaves desconhecidas usam fallback:
123
- - A primeira chave desconhecida pode virar `type`, e o valor vira `command`.
124
- - Chaves desconhecidas seguintes podem preencher `extra`, se ainda estiver vazio.
160
+ - `outputDir` (alias: `dir`, `path`)
161
+ - `overwrite`
162
+ - `includeMapDocs`
163
+ - `files` (ex.: `['doc', 'docPTBR', 'map', 'mapPTBR']`)
125
164
 
126
- ## Exemplos com respostas de IA
165
+ ### Nome dos apps e botoes (importante)
127
166
 
128
- ### Exemplo 1: comando unico
167
+ Voce pode chamar apps e botoes como quiser.
129
168
 
130
- Texto da IA:
169
+ A lib usa o nome apenas para buscar no `map.json`, aplicando normalizacao:
131
170
 
132
- ```txt
133
- Para listar arquivos:
134
- [tipo: shell, comando: ls -la, extra: linux ou mac, seq: 1]
135
- ```
171
+ - ignora maiusculas/minusculas;
172
+ - converte espaco/hifen para `_`;
173
+ - remove acentos.
174
+
175
+ Exemplos que viram a mesma chave logica:
136
176
 
137
- Resultado:
177
+ - `Pular ADS`
178
+ - `pular-ads`
179
+ - `pular_ads`
180
+
181
+ O mesmo vale para nome de app:
182
+
183
+ - `Tik Tok`
184
+ - `tik-tok`
185
+ - `tik_tok`
186
+
187
+ Exemplo com objeto em PT-BR:
138
188
 
139
189
  ```js
140
- [
141
- {
142
- type: 'shell',
143
- command: 'ls -la',
144
- extra: 'linux ou mac',
145
- seq: 1
146
- }
147
- ]
190
+ const listaDeComandos = [
191
+ { tipo: 'abrir_app', comando: 'youtube', botao: 'barra_pesquisa', seq: 1 },
192
+ { tipo: 'abrir_app', comando: 'youtube', botao: 'pularADS', seq: 1 }
193
+ ];
194
+
195
+ const resumoDeExecucao = await executarCursor(listaDeComandos);
196
+ console.log(resumoDeExecucao);
148
197
  ```
149
198
 
150
- ### Exemplo 2: varios comandos
199
+ ## Estado de app (aberto/fechado)
151
200
 
152
- Texto da IA:
201
+ Para comandos de app (`abrir_app`, `close_app`), a lib usa `map.json`:
153
202
 
154
- ```txt
155
- Passo 1: [tipo: shell, comando: npm install, seq: 1]
156
- Passo 2: [tipo: shell, comando: npm run dev, extra: porta padrao 3000, seq: 1]
157
- Passo 3: [tipo: shell, comando: npm test, seq: 3]
158
- ```
203
+ 1. Le o estado atual do app (`aberto` ou `fechado`).
204
+ 2. Se ja estiver `aberto`, nao tenta abrir de novo.
205
+ 3. Executa o clique no botao mapeado.
206
+ 4. Se o botao tiver `setState`, atualiza o estado no `map.json`.
159
207
 
160
- Resultado:
208
+ Obs.: `abrir_app/open_app` sempre dispara `robot.keyTap("command")` antes do fluxo do app.
209
+
210
+ ### Criacao automatica do `map.json`
211
+
212
+ Se o arquivo `map.json` nao existir, a lib cria automaticamente na raiz do projeto (cwd), por padrao.
213
+
214
+ Tambem da para criar explicitamente antes das automacoes:
161
215
 
162
216
  ```js
163
- [
164
- { type: 'shell', command: 'npm install', extra: undefined, seq: 1 },
165
- { type: 'shell', command: 'npm run dev', extra: 'porta padrao 3000', seq: 1 },
166
- { type: 'shell', command: 'npm test', extra: undefined, seq: 3 }
167
- ]
217
+ await iniciarMap();
168
218
  ```
169
219
 
170
- ### Exemplo 3: `seq` invalido
220
+ Esse arquivo inicial ja vem com:
221
+
222
+ - `state` em cada app;
223
+ - `buttons` em cada app;
224
+ - botao `fechar` padrao em cada app (`setState: "fechado"`).
225
+
226
+ Isso permite cenarios como:
171
227
 
172
- Texto da IA:
228
+ - "clique na barra de pesquisa do TikTok"
229
+ - "clique no botao de pular anuncio do YouTube"
230
+
231
+ A IA pode converter para:
173
232
 
174
233
  ```txt
175
- [tipo: shell, comando: npm test, seq: tres]
234
+ [abrir_app, comando: tiktok, botao: barra_pesquisa]
235
+ [abrir_app, comando: youtube, botao: pularADS]
176
236
  ```
177
237
 
178
- Resultado:
238
+ ## Comandos de `type` suportados
179
239
 
180
- ```js
181
- [
182
- {
183
- type: 'shell',
184
- command: 'npm test',
185
- extra: undefined,
186
- seq: undefined
187
- }
188
- ]
240
+ - `abrir_app` / `open_app`
241
+ - `fechar_app` / `close_app`
242
+ - `click` / `clicar`
243
+ - `double_click` / `clique_duplo`
244
+ - `scroll` / `rolar`
245
+ - `mover_sequencia` / `move_sequence`
246
+ - `skip_ads` / `pular_ads`
247
+ - `key_tap` / `tecla`
248
+ - `type_string_delayed` / `digitar`
249
+
250
+ ## Teclado e digitacao
251
+
252
+ Atalho simples:
253
+
254
+ ```txt
255
+ [key_tap, key: enter]
189
256
  ```
190
257
 
191
- ## Como construir o system prompt da IA
258
+ Atalho com modificador:
192
259
 
193
- A qualidade da extracao depende de um formato estavel. O ideal e forcar o modelo a sempre emitir blocos validos.
260
+ ```txt
261
+ [key_tap, key: v, modifiers: command]
262
+ ```
194
263
 
195
- ### Modelo 1: estrito (somente blocos)
264
+ Digitando devagar:
196
265
 
197
266
  ```txt
198
- Voce e um assistente tecnico.
199
- Sempre que sugerir uma acao executavel, responda usando blocos no formato:
200
- [tipo: <categoria>, comando: <comando>, extra: <contexto opcional>, seq: <inteiro opcional>]
267
+ [type_string_delayed, text: Digitando devagar..., typeDelay: 100]
268
+ ```
201
269
 
202
- Regras obrigatorias:
203
- 1. Use sempre colchetes.
204
- 2. Use as chaves exatamente como: tipo, comando, extra, seq.
205
- 3. seq deve ser inteiro >= 0.
206
- 4. Nao use virgula dentro dos valores.
207
- 5. Um comando por bloco.
270
+ ## Movimento sequencial (novo)
271
+
272
+ Use `mover_sequencia` para mover o mouse por 2 ou mais coordenadas em ordem.
273
+
274
+ ### Formato de coordenadas
275
+
276
+ Use `points` no formato:
277
+
278
+ ```txt
279
+ 100x200|300x260|640x420
208
280
  ```
209
281
 
210
- ### Modelo 2: explicacao + blocos
282
+ Tambem funciona com `:`:
211
283
 
212
284
  ```txt
213
- Voce pode explicar em linguagem natural.
214
- Quando houver comando, inclua um bloco por comando no formato:
215
- [tipo: <categoria>, comando: <comando>, extra: <contexto opcional>, seq: <inteiro opcional>]
285
+ 100:200|300:260|640:420
286
+ ```
287
+
288
+ ### Controle de clique entre pontos
289
+
290
+ Campo `click`:
291
+
292
+ - `none`: sem clique
293
+ - `between`: clica em cada ponto antes do ultimo
294
+ - `each`: clica em todos os pontos
295
+ - `first`: clica so no primeiro ponto
296
+ - `last`: clica so no ultimo ponto
297
+
298
+ Campo `doubleClick`:
299
+
300
+ - `true`: usa clique duplo quando houver clique
301
+ - `false`: clique simples
216
302
 
217
- Se nao houver comando, nao invente bloco.
218
- Se houver repeticao, informe em seq.
303
+ Campo `clickDelay`:
304
+
305
+ - delay (ms) entre chegada no ponto e clique naquele ponto
306
+
307
+ ### Exemplo em texto da IA
308
+
309
+ ```txt
310
+ [mover_sequencia, points: 140x260|520x280|980x300, interval: 250, click: between, doubleClick: true]
219
311
  ```
220
312
 
221
- ### Exemplo de resposta esperada da IA
313
+ Com `clickDelay`:
222
314
 
223
315
  ```txt
224
- Para preparar o ambiente, siga:
225
- [tipo: shell, comando: npm install, extra: instalar dependencias, seq: 1]
226
- [tipo: shell, comando: npm test, extra: repetir para validar estabilidade, seq: 3]
316
+ [mover_sequencia, caminho: 140x260|520x280|980x300, interval: 250, clickDelay: 120, click: between, doubleClick: true]
317
+ ```
318
+
319
+ ### Exemplo em objeto JS (mais facil para o dev)
320
+
321
+ ```js
322
+ await executarCursor({
323
+ tipo: 'mover_sequencia',
324
+ pontos: [
325
+ { x: 140, y: 260 },
326
+ { x: 520, y: 280 },
327
+ { x: 980, y: 300 }
328
+ ],
329
+ intervalo: 250,
330
+ delayClique: 120,
331
+ clique: 'between',
332
+ duplo: true
333
+ });
227
334
  ```
228
335
 
229
- ## Limitacoes atuais
336
+ ## Opcoes de `cursor`
230
337
 
231
- - Valores com virgula podem quebrar o parsing porque a divisao interna usa `,`.
232
- - Colchetes dentro do valor (`[` ou `]`) podem interferir na captura.
233
- - Apenas um campo `extra` e retornado por bloco.
338
+ ```js
339
+ {
340
+ mapPath: 'map.json', // caminho do mapeador
341
+ createMapIfMissing: true, // padrao: cria map automaticamente se faltar
342
+ persistMap: true, // salva estado no arquivo
343
+ launchKey: 'command', // usado no fallback de close_app (atalho command+w)
344
+ moveSteps: 50,
345
+ moveDelay: 8,
346
+ scrollSteps: 10,
347
+ scrollDelay: 20,
348
+ typeDelay: 50,
349
+ sequenceInterval: 250, // intervalo padrao do mover_sequencia
350
+ sequenceClick: 'none', // none|between|each|first|last
351
+ sequenceDoubleClick: false, // clique duplo por padrao
352
+ defaultClosePoint: { x: 1888, y: 16 } // botao "fechar" padrao
353
+ }
354
+ ```
234
355
 
235
- ## Seguranca
356
+ ## map.json (doc dedicada)
236
357
 
237
- Esta biblioteca nao executa comandos.
358
+ Voce pediu uma doc dedicada para o mapeador. Ela esta aqui:
359
+
360
+ - `mapPTBR.md` (PT-BR)
361
+ - `map.md` (English)
362
+
363
+ Esses arquivos explicam:
364
+
365
+ - como montar `apps`, `buttons` e `state`;
366
+ - como mapear coordenadas;
367
+ - como mapear botoes por app;
368
+ - como usar `setState` para atualizar para `fechado`.
369
+
370
+ ## System prompt recomendado (IA -> comando)
371
+
372
+ ```txt
373
+ Voce e um assistente tecnico.
374
+ Quando sugerir acao executavel, responda apenas com blocos:
375
+ [tipo: <tipo>, comando: <app_ou_valor>, key: <tecla_opcional>, modifiers: <mods_opcional>, text: <texto_opcional>, typeDelay: <ms_digitacao>, points: <pontos_opcionais>, botao: <botao_opcional>, interval: <ms_opcional>, clickDelay: <ms_ate_click>, click: <modo_opcional>, doubleClick: <boolean_opcional>, extra: <texto_opcional>, seq: <inteiro_opcional>]
376
+
377
+ Regras:
378
+ 1. Use sempre colchetes.
379
+ 2. Um comando por bloco.
380
+ 3. seq deve ser inteiro >= 0.
381
+ 4. Para app, use tipo abrir_app e comando com nome do app.
382
+ 5. Quando for clique de elemento de UI, preencha botao com a chave do map.json.
383
+ 6. Para movimento sequencial, use tipo mover_sequencia e `points` no formato `xXy|xXy|xXy`.
384
+ ```
238
385
 
239
- Se voce for executar o resultado extraido:
386
+ ## Observacoes importantes
240
387
 
241
- - Use allowlist de comandos permitidos.
242
- - Bloqueie padroes perigosos.
243
- - Exija confirmacao para operacoes destrutivas.
388
+ - `cursor` precisa de ambiente desktop com `robotjs`.
389
+ - Se `map.json` nao existir e `createMapIfMissing` for `false`, comandos de app retornam erro.
390
+ - Evite virgulas dentro dos valores do bloco `[ ... ]`, porque o parser divide por virgula.