ilse-design 0.3.0-beta.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 +187 -0
- package/dist/agent/executor.d.ts +20 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +130 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/ai/provider.d.ts +45 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +374 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/analysis/classify-element.d.ts +23 -0
- package/dist/analysis/classify-element.d.ts.map +1 -0
- package/dist/analysis/classify-element.js +79 -0
- package/dist/analysis/classify-element.js.map +1 -0
- package/dist/analysis/compare-family.d.ts +22 -0
- package/dist/analysis/compare-family.d.ts.map +1 -0
- package/dist/analysis/compare-family.js +82 -0
- package/dist/analysis/compare-family.js.map +1 -0
- package/dist/analysis/profile-component.d.ts +32 -0
- package/dist/analysis/profile-component.d.ts.map +1 -0
- package/dist/analysis/profile-component.js +119 -0
- package/dist/analysis/profile-component.js.map +1 -0
- package/dist/bridge/augment.d.ts +20 -0
- package/dist/bridge/augment.d.ts.map +1 -0
- package/dist/bridge/augment.js +110 -0
- package/dist/bridge/augment.js.map +1 -0
- package/dist/bridge/store.d.ts +17 -0
- package/dist/bridge/store.d.ts.map +1 -0
- package/dist/bridge/store.js +70 -0
- package/dist/bridge/store.js.map +1 -0
- package/dist/bridge/ws-server.d.ts +12 -0
- package/dist/bridge/ws-server.d.ts.map +1 -0
- package/dist/bridge/ws-server.js +136 -0
- package/dist/bridge/ws-server.js.map +1 -0
- package/dist/cli/check.d.ts +8 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +303 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/default.d.ts +2 -0
- package/dist/cli/default.d.ts.map +1 -0
- package/dist/cli/default.js +166 -0
- package/dist/cli/default.js.map +1 -0
- package/dist/cli/extract.d.ts +5 -0
- package/dist/cli/extract.d.ts.map +1 -0
- package/dist/cli/extract.js +62 -0
- package/dist/cli/extract.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +5 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +190 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/insight.d.ts +5 -0
- package/dist/cli/insight.d.ts.map +1 -0
- package/dist/cli/insight.js +141 -0
- package/dist/cli/insight.js.map +1 -0
- package/dist/cli/listen.d.ts +10 -0
- package/dist/cli/listen.d.ts.map +1 -0
- package/dist/cli/listen.js +94 -0
- package/dist/cli/listen.js.map +1 -0
- package/dist/cli/login.d.ts +15 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +302 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/config/limits.d.ts +13 -0
- package/dist/config/limits.d.ts.map +1 -0
- package/dist/config/limits.js +26 -0
- package/dist/config/limits.js.map +1 -0
- package/dist/config/mcp-register.d.ts +5 -0
- package/dist/config/mcp-register.d.ts.map +1 -0
- package/dist/config/mcp-register.js +50 -0
- package/dist/config/mcp-register.js.map +1 -0
- package/dist/config/preferences.d.ts +22 -0
- package/dist/config/preferences.d.ts.map +1 -0
- package/dist/config/preferences.js +159 -0
- package/dist/config/preferences.js.map +1 -0
- package/dist/config/user-config.d.ts +10 -0
- package/dist/config/user-config.d.ts.map +1 -0
- package/dist/config/user-config.js +32 -0
- package/dist/config/user-config.js.map +1 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +49 -0
- package/dist/constants.js.map +1 -0
- package/dist/extraction/find-inconsistencies.d.ts +17 -0
- package/dist/extraction/find-inconsistencies.d.ts.map +1 -0
- package/dist/extraction/find-inconsistencies.js +93 -0
- package/dist/extraction/find-inconsistencies.js.map +1 -0
- package/dist/extraction/find-patterns.d.ts +20 -0
- package/dist/extraction/find-patterns.d.ts.map +1 -0
- package/dist/extraction/find-patterns.js +179 -0
- package/dist/extraction/find-patterns.js.map +1 -0
- package/dist/extraction/index-tokens.d.ts +16 -0
- package/dist/extraction/index-tokens.d.ts.map +1 -0
- package/dist/extraction/index-tokens.js +103 -0
- package/dist/extraction/index-tokens.js.map +1 -0
- package/dist/fixer/autofix.d.ts +11 -0
- package/dist/fixer/autofix.d.ts.map +1 -0
- package/dist/fixer/autofix.js +202 -0
- package/dist/fixer/autofix.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +271 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parsers/repo.d.ts +22 -0
- package/dist/parsers/repo.d.ts.map +1 -0
- package/dist/parsers/repo.js +165 -0
- package/dist/parsers/repo.js.map +1 -0
- package/dist/parsers/snapshot.d.ts +15 -0
- package/dist/parsers/snapshot.d.ts.map +1 -0
- package/dist/parsers/snapshot.js +136 -0
- package/dist/parsers/snapshot.js.map +1 -0
- package/dist/parsers/tokens.d.ts +10 -0
- package/dist/parsers/tokens.d.ts.map +1 -0
- package/dist/parsers/tokens.js +119 -0
- package/dist/parsers/tokens.js.map +1 -0
- package/dist/react/annotator.d.ts +64 -0
- package/dist/react/annotator.d.ts.map +1 -0
- package/dist/react/annotator.js +279 -0
- package/dist/react/annotator.js.map +1 -0
- package/dist/react/area-selector.d.ts +14 -0
- package/dist/react/area-selector.d.ts.map +1 -0
- package/dist/react/area-selector.js +76 -0
- package/dist/react/area-selector.js.map +1 -0
- package/dist/react/freeze.d.ts +5 -0
- package/dist/react/freeze.d.ts.map +1 -0
- package/dist/react/freeze.js +109 -0
- package/dist/react/freeze.js.map +1 -0
- package/dist/react/image-input.d.ts +14 -0
- package/dist/react/image-input.d.ts.map +1 -0
- package/dist/react/image-input.js +100 -0
- package/dist/react/image-input.js.map +1 -0
- package/dist/react/index.d.ts +6 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +13 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/toolbar.d.ts +2 -0
- package/dist/react/toolbar.d.ts.map +1 -0
- package/dist/react/toolbar.js +755 -0
- package/dist/react/toolbar.js.map +1 -0
- package/dist/react/ws-client.d.ts +8 -0
- package/dist/react/ws-client.d.ts.map +1 -0
- package/dist/react/ws-client.js +71 -0
- package/dist/react/ws-client.js.map +1 -0
- package/dist/reporters/coverage.d.ts +6 -0
- package/dist/reporters/coverage.d.ts.map +1 -0
- package/dist/reporters/coverage.js +74 -0
- package/dist/reporters/coverage.js.map +1 -0
- package/dist/reporters/ds-report.d.ts +8 -0
- package/dist/reporters/ds-report.d.ts.map +1 -0
- package/dist/reporters/ds-report.js +66 -0
- package/dist/reporters/ds-report.js.map +1 -0
- package/dist/reporters/terminal.d.ts +43 -0
- package/dist/reporters/terminal.d.ts.map +1 -0
- package/dist/reporters/terminal.js +361 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/setup/framework-detect.d.ts +8 -0
- package/dist/setup/framework-detect.d.ts.map +1 -0
- package/dist/setup/framework-detect.js +109 -0
- package/dist/setup/framework-detect.js.map +1 -0
- package/dist/setup/inject-component.d.ts +12 -0
- package/dist/setup/inject-component.d.ts.map +1 -0
- package/dist/setup/inject-component.js +98 -0
- package/dist/setup/inject-component.js.map +1 -0
- package/dist/types.d.ts +170 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/ast.d.ts +18 -0
- package/dist/utils/ast.d.ts.map +1 -0
- package/dist/utils/ast.js +57 -0
- package/dist/utils/ast.js.map +1 -0
- package/dist/utils/files.d.ts +6 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +25 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/suggest.d.ts +37 -0
- package/dist/utils/suggest.d.ts.map +1 -0
- package/dist/utils/suggest.js +158 -0
- package/dist/utils/suggest.js.map +1 -0
- package/dist/validators/coverage.d.ts +24 -0
- package/dist/validators/coverage.d.ts.map +1 -0
- package/dist/validators/coverage.js +156 -0
- package/dist/validators/coverage.js.map +1 -0
- package/dist/validators/static.d.ts +14 -0
- package/dist/validators/static.d.ts.map +1 -0
- package/dist/validators/static.js +398 -0
- package/dist/validators/static.js.map +1 -0
- package/package.json +64 -0
package/README.md
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Ilse
|
|
2
|
+
|
|
3
|
+
**Olho do designer dentro do agente de código.**
|
|
4
|
+
|
|
5
|
+
Aponte o que está errado na UI. Seu agente corrige.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @iversondantas/ilse@beta
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
// app/layout.tsx
|
|
13
|
+
import { Ilse } from "@iversondantas/ilse/react";
|
|
14
|
+
|
|
15
|
+
export default function Layout({ children }) {
|
|
16
|
+
return (
|
|
17
|
+
<html>
|
|
18
|
+
<body>
|
|
19
|
+
{children}
|
|
20
|
+
<Ilse />
|
|
21
|
+
</body>
|
|
22
|
+
</html>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Em dev, aparece uma toolbar flutuante. Em prod, desaparece automaticamente.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Setup completo (3 passos)
|
|
32
|
+
|
|
33
|
+
### 1. Instalar
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install @iversondantas/ilse@beta --legacy-peer-deps
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Adicionar o componente no layout
|
|
40
|
+
|
|
41
|
+
**Next.js (App Router):**
|
|
42
|
+
```tsx
|
|
43
|
+
// app/layout.tsx
|
|
44
|
+
import { Ilse } from "@iversondantas/ilse/react";
|
|
45
|
+
|
|
46
|
+
export default function RootLayout({ children }) {
|
|
47
|
+
return (
|
|
48
|
+
<html>
|
|
49
|
+
<body>
|
|
50
|
+
{children}
|
|
51
|
+
<Ilse />
|
|
52
|
+
</body>
|
|
53
|
+
</html>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Vite / CRA / Remix / Astro:**
|
|
59
|
+
```tsx
|
|
60
|
+
// App.tsx ou equivalente
|
|
61
|
+
import { Ilse } from "@iversondantas/ilse/react";
|
|
62
|
+
|
|
63
|
+
function App() {
|
|
64
|
+
return (
|
|
65
|
+
<>
|
|
66
|
+
<MyApp />
|
|
67
|
+
<Ilse />
|
|
68
|
+
</>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 3. Conectar ao seu agente (opcional)
|
|
74
|
+
|
|
75
|
+
Para o Claude Code corrigir automaticamente:
|
|
76
|
+
```bash
|
|
77
|
+
npx @iversondantas/ilse@beta setup
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Isso registra o MCP server no Claude Code. Reinicie o Claude Code.
|
|
81
|
+
|
|
82
|
+
Para outros agentes (Cursor, VS Code, Codex, ChatGPT): funciona via clipboard automaticamente. Sem setup.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Como usar
|
|
87
|
+
|
|
88
|
+
1. Rode seu projeto (`npm run dev`)
|
|
89
|
+
2. Abre no browser — você verá uma toolbar pixelada no canto
|
|
90
|
+
3. Clica no toolbar → escolhe modo (elemento, texto, área)
|
|
91
|
+
4. Clica no que está errado na UI
|
|
92
|
+
5. Escreve o que precisa mudar ("botão torto", "cor errada")
|
|
93
|
+
6. Clica enviar
|
|
94
|
+
|
|
95
|
+
**Se o MCP está conectado:** a anotação vai direto pro seu agente.
|
|
96
|
+
**Se não está:** copia automático pro clipboard. Cola no chat do agente (Cmd+V).
|
|
97
|
+
|
|
98
|
+
No Claude Code:
|
|
99
|
+
```
|
|
100
|
+
/ilse
|
|
101
|
+
```
|
|
102
|
+
Uma palavra. O agente lê todas as anotações pendentes, corrige cada uma, e marca como resolvido.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## O que a Ilse captura
|
|
107
|
+
|
|
108
|
+
Quando você anota um elemento, o agente recebe:
|
|
109
|
+
|
|
110
|
+
- **Seletor CSS** (`button.cta-primary`)
|
|
111
|
+
- **Nome do componente React** (via React fiber)
|
|
112
|
+
- **Componente stack** (hierarquia)
|
|
113
|
+
- **Grep pattern** (pra encontrar no código)
|
|
114
|
+
- **Full DOM path**
|
|
115
|
+
- **Styles relevantes** (filtrados por intent — se você disse "cor errada", só manda cores)
|
|
116
|
+
- **Parent context** (flex, gap, layout)
|
|
117
|
+
- **Viewport, URL, DPR** (contexto da página)
|
|
118
|
+
- **Imagem de referência** (se colar com Cmd+V no textarea)
|
|
119
|
+
|
|
120
|
+
O agente não precisa adivinhar — tem tudo que precisa pra agir.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Features
|
|
125
|
+
|
|
126
|
+
- **3 modos de captura** — click em elemento, seleção de texto, arrastar área
|
|
127
|
+
- **Imagem de referência** — Cole screenshot do Figma direto no textarea (Cmd+V)
|
|
128
|
+
- **Animation pause** — Congela animações pra anotar tooltips, toasts, dropdowns
|
|
129
|
+
- **Envio individual ou batch** — anota várias, envia de uma vez
|
|
130
|
+
- **Smart augmentation** — filtra styles por intent (layout, cor, spacing, tipografia)
|
|
131
|
+
- **Fallback inteligente** — MCP → clipboard → modal
|
|
132
|
+
- **Análise estática** (bônus) — `ilse check` detecta tokens hardcoded, a11y, consistência
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## CLI
|
|
137
|
+
|
|
138
|
+
A Ilse também tem CLI pra análise estática:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npx @iversondantas/ilse@beta init # setup interativo
|
|
142
|
+
npx @iversondantas/ilse@beta check # análise estática
|
|
143
|
+
npx @iversondantas/ilse@beta listen # debug mode (WS server)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Filosofia
|
|
149
|
+
|
|
150
|
+
IA liberou designers do gargalo de execução, mas craft ainda exige esforço humano.
|
|
151
|
+
|
|
152
|
+
A Ilse existe para potencializar o uso de IA no craft. Não é craft vs. IA — pelo contrário. O designer aponta o que o olho vê. O agente faz o que a mão faria.
|
|
153
|
+
|
|
154
|
+
> "Design é uma ferramenta para melhorar a humanidade." — Ilse Crawford
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Compatibilidade
|
|
159
|
+
|
|
160
|
+
| Framework | Status |
|
|
161
|
+
|---|---|
|
|
162
|
+
| Next.js 13+ | ✓ |
|
|
163
|
+
| Vite + React | ✓ |
|
|
164
|
+
| Create React App | ✓ |
|
|
165
|
+
| Remix | ✓ |
|
|
166
|
+
| Astro + React | ✓ |
|
|
167
|
+
|
|
168
|
+
| Agente | Integração |
|
|
169
|
+
|---|---|
|
|
170
|
+
| Claude Code | MCP nativo + skill `/ilse` |
|
|
171
|
+
| Cursor | MCP |
|
|
172
|
+
| VS Code (Copilot/Continue) | MCP |
|
|
173
|
+
| Codex, ChatGPT, Gemini | Clipboard automático |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Status
|
|
178
|
+
|
|
179
|
+
Beta público. `0.2.0-beta.x` — em desenvolvimento ativo.
|
|
180
|
+
|
|
181
|
+
Quer reportar bug ou sugerir feature? Abre uma issue: github.com/idantas/ilse
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## License
|
|
186
|
+
|
|
187
|
+
MIT
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Annotation } from '../types.js';
|
|
2
|
+
export type AgentKind = 'claude' | 'codex' | 'cursor-agent' | 'gemini' | 'none';
|
|
3
|
+
export interface AgentDetection {
|
|
4
|
+
kind: AgentKind;
|
|
5
|
+
command?: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function detectAgent(): AgentDetection;
|
|
9
|
+
export interface ExecutionResult {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
summary: string;
|
|
12
|
+
rawOutput?: string;
|
|
13
|
+
error?: string;
|
|
14
|
+
durationMs: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function executeAnnotation(annotation: Annotation, agent: AgentDetection, options?: {
|
|
17
|
+
cwd?: string;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}): Promise<ExecutionResult>;
|
|
20
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/agent/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqBD,wBAAgB,WAAW,IAAI,cAAc,CAM5C;AA0BD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,eAAe,CAAC,CAmE1B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { augmentAnnotation } from '../bridge/augment.js';
|
|
4
|
+
// ── Agent detection ─────────────────────────────────────────────────────────
|
|
5
|
+
const AGENT_CANDIDATES = [
|
|
6
|
+
{ kind: 'claude', command: 'claude' },
|
|
7
|
+
{ kind: 'codex', command: 'codex' },
|
|
8
|
+
{ kind: 'cursor-agent', command: 'cursor-agent' },
|
|
9
|
+
{ kind: 'gemini', command: 'gemini' },
|
|
10
|
+
];
|
|
11
|
+
function which(command) {
|
|
12
|
+
const paths = (process.env.PATH ?? '').split(':');
|
|
13
|
+
for (const dir of paths) {
|
|
14
|
+
if (!dir)
|
|
15
|
+
continue;
|
|
16
|
+
const full = `${dir}/${command}`;
|
|
17
|
+
if (existsSync(full))
|
|
18
|
+
return full;
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
export function detectAgent() {
|
|
23
|
+
for (const { kind, command } of AGENT_CANDIDATES) {
|
|
24
|
+
const path = which(command);
|
|
25
|
+
if (path)
|
|
26
|
+
return { kind, command, path };
|
|
27
|
+
}
|
|
28
|
+
return { kind: 'none' };
|
|
29
|
+
}
|
|
30
|
+
// ── Prompt formatting ───────────────────────────────────────────────────────
|
|
31
|
+
function buildPrompt(annotation) {
|
|
32
|
+
const augmented = augmentAnnotation(annotation);
|
|
33
|
+
return [
|
|
34
|
+
'Você recebeu uma anotação visual do designer via Ilse (visual feedback tool).',
|
|
35
|
+
'',
|
|
36
|
+
'Contexto do elemento:',
|
|
37
|
+
augmented.context,
|
|
38
|
+
'',
|
|
39
|
+
'INSTRUÇÕES:',
|
|
40
|
+
'1. Analise se o problema está na DEFINIÇÃO do componente ou na INSTÂNCIA específica',
|
|
41
|
+
'2. Se é um problema de estilo padrão, corrija no componente base',
|
|
42
|
+
'3. Se é específico dessa instância, corrija só no uso',
|
|
43
|
+
'4. Se o mesmo problema pode existir em outras ocorrências, procure com o grep pattern e corrija todas',
|
|
44
|
+
'5. Seja cirúrgico — edite apenas o necessário',
|
|
45
|
+
'',
|
|
46
|
+
'Após aplicar as mudanças, responda em UMA linha (máximo 15 palavras) o que você mudou.',
|
|
47
|
+
'Exemplo: "Ajustei align-items do Button em components/Button.tsx"',
|
|
48
|
+
].join('\n');
|
|
49
|
+
}
|
|
50
|
+
export async function executeAnnotation(annotation, agent, options = {}) {
|
|
51
|
+
if (agent.kind === 'none' || !agent.command) {
|
|
52
|
+
return { ok: false, summary: '', error: 'Nenhum agente CLI detectado', durationMs: 0 };
|
|
53
|
+
}
|
|
54
|
+
const start = Date.now();
|
|
55
|
+
const prompt = buildPrompt(annotation);
|
|
56
|
+
const cwd = options.cwd ?? process.cwd();
|
|
57
|
+
const timeout = options.timeoutMs ?? 180_000;
|
|
58
|
+
// Build args per agent
|
|
59
|
+
const args = buildArgs(agent.kind, prompt);
|
|
60
|
+
return new Promise((resolve) => {
|
|
61
|
+
let stdout = '';
|
|
62
|
+
let stderr = '';
|
|
63
|
+
let timedOut = false;
|
|
64
|
+
const proc = spawn(agent.command, args, {
|
|
65
|
+
cwd,
|
|
66
|
+
env: process.env,
|
|
67
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
68
|
+
});
|
|
69
|
+
const timer = setTimeout(() => {
|
|
70
|
+
timedOut = true;
|
|
71
|
+
proc.kill('SIGTERM');
|
|
72
|
+
}, timeout);
|
|
73
|
+
proc.stdout?.on('data', (chunk) => { stdout += chunk.toString(); });
|
|
74
|
+
proc.stderr?.on('data', (chunk) => { stderr += chunk.toString(); });
|
|
75
|
+
proc.on('close', (code) => {
|
|
76
|
+
clearTimeout(timer);
|
|
77
|
+
const durationMs = Date.now() - start;
|
|
78
|
+
if (timedOut) {
|
|
79
|
+
resolve({ ok: false, summary: '', error: `Timeout (${timeout}ms)`, durationMs });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (code !== 0) {
|
|
83
|
+
resolve({
|
|
84
|
+
ok: false,
|
|
85
|
+
summary: '',
|
|
86
|
+
error: stderr.trim() || `Exit code ${code}`,
|
|
87
|
+
rawOutput: stdout,
|
|
88
|
+
durationMs,
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Extract summary: last non-empty line of stdout (agent's final response)
|
|
93
|
+
const summary = extractSummary(stdout);
|
|
94
|
+
resolve({ ok: true, summary, rawOutput: stdout, durationMs });
|
|
95
|
+
});
|
|
96
|
+
proc.on('error', (err) => {
|
|
97
|
+
clearTimeout(timer);
|
|
98
|
+
resolve({
|
|
99
|
+
ok: false,
|
|
100
|
+
summary: '',
|
|
101
|
+
error: err.message,
|
|
102
|
+
durationMs: Date.now() - start,
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function buildArgs(kind, prompt) {
|
|
108
|
+
switch (kind) {
|
|
109
|
+
case 'claude':
|
|
110
|
+
return ['-p', prompt, '--dangerously-skip-permissions'];
|
|
111
|
+
case 'codex':
|
|
112
|
+
return ['exec', prompt];
|
|
113
|
+
case 'cursor-agent':
|
|
114
|
+
return ['-p', prompt];
|
|
115
|
+
case 'gemini':
|
|
116
|
+
return ['-p', prompt];
|
|
117
|
+
default:
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function extractSummary(stdout) {
|
|
122
|
+
const lines = stdout.trim().split('\n').filter(l => l.trim().length > 0);
|
|
123
|
+
if (lines.length === 0)
|
|
124
|
+
return 'Corrigido';
|
|
125
|
+
// Last line is usually the final response
|
|
126
|
+
const last = lines[lines.length - 1].trim();
|
|
127
|
+
// Strip markdown if present
|
|
128
|
+
return last.replace(/^[*•\-#>]+\s*/, '').slice(0, 200);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/agent/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import type { AIConfig, AIAnalysisRequest, AIAnalysisResponse, Result } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create an OpenRouter client based on AI config.
|
|
5
|
+
* Priority: project config → global ~/.ilserc → env var
|
|
6
|
+
*/
|
|
7
|
+
export declare function createClient(config: AIConfig): OpenAI;
|
|
8
|
+
/**
|
|
9
|
+
* Analyze code with AI via OpenRouter.
|
|
10
|
+
*/
|
|
11
|
+
export declare function analyzeWithAI(request: AIAnalysisRequest, config: AIConfig): Promise<Result<AIAnalysisResponse>>;
|
|
12
|
+
/**
|
|
13
|
+
* Enrich static violations with AI-generated contextual suggestions.
|
|
14
|
+
*/
|
|
15
|
+
export declare function enrichSuggestions(violations: Array<{
|
|
16
|
+
file: string;
|
|
17
|
+
line: number;
|
|
18
|
+
context: string;
|
|
19
|
+
type: string;
|
|
20
|
+
}>, projectStack: {
|
|
21
|
+
dependencies: string[];
|
|
22
|
+
uiComponents: string[];
|
|
23
|
+
}, config: AIConfig): Promise<Result<string[]>>;
|
|
24
|
+
/**
|
|
25
|
+
* Generate contextual aria-labels and alt texts based on code context.
|
|
26
|
+
*/
|
|
27
|
+
export declare function enrichLabels(contexts: Array<{
|
|
28
|
+
file: string;
|
|
29
|
+
line: number;
|
|
30
|
+
code: string;
|
|
31
|
+
}>, config: AIConfig): Promise<Result<string[]>>;
|
|
32
|
+
/**
|
|
33
|
+
* Element roles for semantic classification.
|
|
34
|
+
*/
|
|
35
|
+
export type AIElementRole = 'button' | 'backdrop' | 'link' | 'toggle' | 'container' | 'unknown';
|
|
36
|
+
/**
|
|
37
|
+
* Classify elements that static heuristics couldn't resolve.
|
|
38
|
+
* Lightweight call — small prompt, minimal context. Runs on free model.
|
|
39
|
+
*/
|
|
40
|
+
export declare function classifyElements(contexts: Array<{
|
|
41
|
+
file: string;
|
|
42
|
+
line: number;
|
|
43
|
+
code: string;
|
|
44
|
+
}>, config: AIConfig): Promise<Result<AIElementRole[]>>;
|
|
45
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAO5B,OAAO,KAAK,EACV,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAIlB,MAAM,EACP,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAuBrD;AA4ID;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAiCrC;AA8BD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAChF,YAAY,EAAE;IAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,EAChE,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CA2C3B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7D,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAkD3B;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AAmBhG;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7D,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CA4ClC"}
|