@autonsh/cli 0.17.2 → 0.19.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/dist/chat.d.ts +1 -1
- package/dist/chat.js +166 -120
- package/dist/chat.js.map +1 -1
- package/dist/completion.d.ts +2 -0
- package/dist/completion.js +379 -0
- package/dist/completion.js.map +1 -0
- package/dist/config-validation.d.ts +10 -0
- package/dist/config-validation.js +101 -0
- package/dist/config-validation.js.map +1 -0
- package/dist/config.d.ts +9 -3
- package/dist/config.js +23 -11
- package/dist/config.js.map +1 -1
- package/dist/doctor.d.ts +18 -0
- package/dist/doctor.js +409 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.js +60 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.js +304 -119
- package/dist/index.js.map +1 -1
- package/dist/input.d.ts +43 -0
- package/dist/input.js +288 -0
- package/dist/input.js.map +1 -0
- package/dist/llm/factory.d.ts +5 -0
- package/dist/llm/factory.js +54 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.js +11 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/provider.d.ts +27 -0
- package/dist/llm/provider.js +98 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/providers/anthropic.d.ts +23 -0
- package/dist/llm/providers/anthropic.js +198 -0
- package/dist/llm/providers/anthropic.js.map +1 -0
- package/dist/llm/providers/google.d.ts +31 -0
- package/dist/llm/providers/google.js +190 -0
- package/dist/llm/providers/google.js.map +1 -0
- package/dist/llm/providers/ollama.d.ts +21 -0
- package/dist/llm/providers/ollama.js +157 -0
- package/dist/llm/providers/ollama.js.map +1 -0
- package/dist/llm/providers/openai-compatible.d.ts +22 -0
- package/dist/llm/providers/openai-compatible.js +175 -0
- package/dist/llm/providers/openai-compatible.js.map +1 -0
- package/dist/llm/providers/openai.d.ts +20 -0
- package/dist/llm/providers/openai.js +167 -0
- package/dist/llm/providers/openai.js.map +1 -0
- package/dist/llm/registry.d.ts +19 -0
- package/dist/llm/registry.js +421 -0
- package/dist/llm/registry.js.map +1 -0
- package/dist/llm/types.d.ts +174 -0
- package/dist/llm/types.js +3 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/login.d.ts +1 -1
- package/dist/login.js +14 -14
- package/dist/login.js.map +1 -1
- package/dist/mcp/client.d.ts +36 -0
- package/dist/mcp/client.js +199 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config.d.ts +10 -0
- package/dist/mcp/config.js +43 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/types.d.ts +104 -0
- package/dist/mcp/types.js +3 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/model.d.ts +3 -14
- package/dist/model.js +131 -91
- package/dist/model.js.map +1 -1
- package/dist/ollama.d.ts +10 -0
- package/dist/ollama.js +11 -0
- package/dist/ollama.js.map +1 -0
- package/dist/prompts.d.ts +34 -8
- package/dist/prompts.js +186 -8
- package/dist/prompts.js.map +1 -1
- package/dist/repomap.d.ts +37 -0
- package/dist/repomap.js +431 -0
- package/dist/repomap.js.map +1 -0
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.js +5 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/registry.d.ts +16 -0
- package/dist/skills/registry.js +128 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/types.d.ts +48 -0
- package/dist/skills/types.js +3 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/statusline.d.ts +21 -0
- package/dist/statusline.js +68 -0
- package/dist/statusline.js.map +1 -0
- package/dist/streaming.d.ts +25 -0
- package/dist/streaming.js +91 -0
- package/dist/streaming.js.map +1 -0
- package/dist/task.d.ts +9 -1
- package/dist/task.js +21 -0
- package/dist/task.js.map +1 -1
- package/dist/template-engine.d.ts +19 -0
- package/dist/template-engine.js +187 -0
- package/dist/template-engine.js.map +1 -0
- package/dist/template-registry.d.ts +36 -0
- package/dist/template-registry.js +294 -0
- package/dist/template-registry.js.map +1 -0
- package/dist/theme.d.ts +52 -0
- package/dist/theme.js +92 -0
- package/dist/theme.js.map +1 -0
- package/dist/tools/builtin.d.ts +11 -0
- package/dist/tools/builtin.js +491 -0
- package/dist/tools/builtin.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.d.ts +186 -0
- package/dist/tools/types.js +29 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/ui.js +34 -30
- package/dist/ui.js.map +1 -1
- package/dist/verbose.d.ts +20 -0
- package/dist/verbose.js +75 -0
- package/dist/verbose.js.map +1 -0
- package/package.json +12 -2
- package/templates/api-json/task.yaml +0 -2
- package/templates/coding/agent.md +39 -0
- package/templates/coding/agent.ts +83 -0
- package/templates/coding/task.yaml +36 -0
- package/templates/cron-digester/task.yaml +0 -2
- package/templates/harness/agent.md +43 -0
- package/templates/harness/harness.ts +145 -0
- package/templates/harness/task.yaml +4 -0
- package/templates/multi-agent/agent.ts +7 -8
- package/templates/multi-agent/task.yaml +1 -3
- package/templates/research/task.yaml +4 -0
- package/templates/support/task.yaml +0 -2
- package/templates/webhook-echo/task.yaml +0 -2
- package/templates/with-approval/task.yaml +0 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: coding
|
|
2
|
+
description: Agente de código — refatorar, testar, migrar, corrigir
|
|
3
|
+
goal: ""
|
|
4
|
+
entry: agent.ts
|
|
5
|
+
models:
|
|
6
|
+
default: ollama:qwen2.5-coder:14b-instruct-q4_K_M
|
|
7
|
+
env:
|
|
8
|
+
- GITHUB_TOKEN
|
|
9
|
+
mode: build
|
|
10
|
+
skills:
|
|
11
|
+
- typescript
|
|
12
|
+
- refactoring
|
|
13
|
+
- testing
|
|
14
|
+
verify:
|
|
15
|
+
typecheck: "tsc --noEmit"
|
|
16
|
+
test: "vitest run"
|
|
17
|
+
lint: "eslint ."
|
|
18
|
+
genesis: |
|
|
19
|
+
Você é um engenheiro de software sênior especializado em TypeScript.
|
|
20
|
+
|
|
21
|
+
Princípios:
|
|
22
|
+
1. Entenda o código ANTES de mudar — leia, trace dependências
|
|
23
|
+
2. Mudanças pequenas, atômicas, testáveis
|
|
24
|
+
3. Tipos estritos: `strict: true`, `noImplicitAny`, `exactOptionalPropertyTypes`
|
|
25
|
+
4. Testes obrigatórios: unit + integration para lógica de negócio
|
|
26
|
+
5. Nunca quebre API pública sem migração + depreciação
|
|
27
|
+
6. Performance: evite alocações desnecessárias, use `const`, `readonly`
|
|
28
|
+
7. Documentação: JSDoc em exports públicos, comentários "por que" não "o que"
|
|
29
|
+
|
|
30
|
+
Fluxo por task:
|
|
31
|
+
- PLAN: analise impacto, liste arquivos, defina testes
|
|
32
|
+
- IMPLEMENT: edite um arquivo por vez, rode typecheck a cada passo
|
|
33
|
+
- VERIFY: tsc --noEmit → vitest run → eslint
|
|
34
|
+
- CHECKPOINT: salve evidência (diff, testes, coverage)
|
|
35
|
+
|
|
36
|
+
Responda em PT-BR. Seja conciso.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Harness Agent — Loop Local
|
|
2
|
+
|
|
3
|
+
Você é um agente autônomo que roda **local** (sem Control Plane).
|
|
4
|
+
Seu ciclo: **PLAN → ACT → VERIFY → CHECKPOINT** até `done: true`.
|
|
5
|
+
|
|
6
|
+
## Princípios
|
|
7
|
+
- **Pequenos passos**: uma ação por turno, verificável
|
|
8
|
+
- **Checkpoint sempre**: estado salvo em `.auton/checkpoints/` para resume
|
|
9
|
+
- **Ferramentas primeiro**: use `ctx.tools` para ler/escrever/correr código
|
|
10
|
+
- **Verificação honesta**: se não passou, explica o que falta
|
|
11
|
+
|
|
12
|
+
## Ferramentas disponíveis
|
|
13
|
+
- `ctx.tools.list(dir)` — lista arquivos
|
|
14
|
+
- `ctx.tools.read(file)` — lê arquivo
|
|
15
|
+
- `ctx.tools.write(file, content)` — escreve arquivo
|
|
16
|
+
- `ctx.tools.exec(cmd)` — roda comando shell (tsc, vitest, etc.)
|
|
17
|
+
- `ctx.tools.patch(file, oldStr, newStr)` — edita cirúrgico
|
|
18
|
+
- `ctx.storage.get/set(key, value)` — KV persistente
|
|
19
|
+
- `ctx.work.add(type, title, payload)` — work context (findings/artifacts)
|
|
20
|
+
|
|
21
|
+
## Formato de resposta (JSON)
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"plan": "Uma frase: o que vou fazer agora",
|
|
25
|
+
"action": "comando ou código para ctx.tools.exec / ctx.tools.write",
|
|
26
|
+
"done": false
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
Se `done: true`, o loop para e emite `TASK:DONE`.
|
|
30
|
+
|
|
31
|
+
## Modo harness
|
|
32
|
+
- `loop: true` — continua até `done: true` ou `maxTurns`
|
|
33
|
+
- `maxTurns: 10` — segurança contra loops infinitos
|
|
34
|
+
- `checkpointDir: ".auton/checkpoints"` — resume automático no próximo `auton run`
|
|
35
|
+
|
|
36
|
+
## Exemplo
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"plan": "Ler src/auth.ts para entender a estrutura",
|
|
40
|
+
"action": "read src/auth.ts",
|
|
41
|
+
"done": false
|
|
42
|
+
}
|
|
43
|
+
```
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Harness local — loop agêntico sem Control Plane.
|
|
4
|
+
* Roda: plan → act → verify → checkpoint → done.
|
|
5
|
+
* Checkpoints em .auton/checkpoints/ (resume no próximo run).
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir, readdir } from "node:fs/promises";
|
|
8
|
+
import { join, resolve } from "node:path";
|
|
9
|
+
import { createLlm, createStorage, createTools } from "@autonsh/runtime";
|
|
10
|
+
|
|
11
|
+
const GOAL = process.env.AUTON_GOAL ?? process.argv.slice(2).join(" ") ?? "";
|
|
12
|
+
const CHECKPOINT_DIR = ".auton/checkpoints";
|
|
13
|
+
const MAX_TURNS = Number(process.env.AUTON_MAX_TURNS ?? 10);
|
|
14
|
+
|
|
15
|
+
async function main(): Promise<void> {
|
|
16
|
+
if (!GOAL) {
|
|
17
|
+
console.error("Erro: goal não fornecido. Use AUTON_GOAL ou passe como argumento.");
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Carrega agent.md como system prompt base
|
|
22
|
+
const agentMd = await readFile("agent.md", "utf8").catch(() => "");
|
|
23
|
+
const systemPrompt = `Você é um agente autônomo em modo harness (local).
|
|
24
|
+
${agentMd}
|
|
25
|
+
|
|
26
|
+
Objetivo: ${GOAL}
|
|
27
|
+
|
|
28
|
+
Loop: planeje → execute → verifique → checkpoint.
|
|
29
|
+
Responda em JSON: { "plan": "...", "action": "...", "done": false }`;
|
|
30
|
+
|
|
31
|
+
const llm = createLlm({ model: process.env.AUTON_MODEL });
|
|
32
|
+
const storage = createStorage({ dir: ".auton/storage" });
|
|
33
|
+
const tools = createTools({ cwd: process.cwd() });
|
|
34
|
+
|
|
35
|
+
// Resume checkpoint se existir
|
|
36
|
+
let turn = 0;
|
|
37
|
+
let context = "";
|
|
38
|
+
const checkpoints = await listCheckpoints();
|
|
39
|
+
if (checkpoints.length > 0) {
|
|
40
|
+
const latest = checkpoints[checkpoints.length - 1];
|
|
41
|
+
const data = JSON.parse(await readFile(latest, "utf8"));
|
|
42
|
+
turn = data.turn ?? 0;
|
|
43
|
+
context = data.context ?? "";
|
|
44
|
+
console.log(`[harness] Resumindo checkpoint turno ${turn}`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
console.log(`[harness] Iniciando: ${GOAL}`);
|
|
48
|
+
|
|
49
|
+
while (turn < MAX_TURNS) {
|
|
50
|
+
turn++;
|
|
51
|
+
console.log(`[harness] Turno ${turn}/${MAX_TURNS}`);
|
|
52
|
+
|
|
53
|
+
// 1. PLAN
|
|
54
|
+
const planResp = await llm.chat({
|
|
55
|
+
system: systemPrompt + `\n\nContexto anterior:\n${context}`,
|
|
56
|
+
prompt: "Planeje o próximo passo. Responda JSON: { plan, action, done }",
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
let parsed: { plan: string; action: string; done: boolean };
|
|
60
|
+
try {
|
|
61
|
+
parsed = JSON.parse(planResp.trim());
|
|
62
|
+
} catch {
|
|
63
|
+
parsed = { plan: planResp, action: "", done: false };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
console.log(`[harness] Plan: ${parsed.plan}`);
|
|
67
|
+
if (parsed.done) {
|
|
68
|
+
console.log("[harness] Task concluída pelo agente");
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 2. ACT (executa action via tools se houver, senão LLM)
|
|
73
|
+
let result: string;
|
|
74
|
+
if (parsed.action) {
|
|
75
|
+
try {
|
|
76
|
+
result = await tools.exec(parsed.action);
|
|
77
|
+
console.log(`[harness] Action executada`);
|
|
78
|
+
} catch (e) {
|
|
79
|
+
result = `Erro ao executar action: ${(e as Error).message}`;
|
|
80
|
+
console.log(`[harness] ${result}`);
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
const actResp = await llm.chat({
|
|
84
|
+
system: systemPrompt + `\n\nContexto:\n${context}`,
|
|
85
|
+
prompt: `Execute: ${parsed.plan}`,
|
|
86
|
+
});
|
|
87
|
+
result = actResp;
|
|
88
|
+
console.log(`[harness] LLM executou diretamente`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// 3. VERIFY
|
|
92
|
+
const verifyResp = await llm.chat({
|
|
93
|
+
system: "Verifique se o resultado atende o objetivo. Responda JSON: { pass: boolean, feedback: string }",
|
|
94
|
+
prompt: `Objetivo: ${GOAL}\nResultado: ${result}`,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
let verified: { pass: boolean; feedback: string };
|
|
98
|
+
try {
|
|
99
|
+
verified = JSON.parse(verifyResp.trim());
|
|
100
|
+
} catch {
|
|
101
|
+
verified = { pass: verifyResp.toLowerCase().includes("sim"), feedback: verifyResp };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
console.log(`[harness] Verify: ${verified.pass ? "PASS" : "FAIL"} - ${verified.feedback}`);
|
|
105
|
+
|
|
106
|
+
// 4. CHECKPOINT
|
|
107
|
+
context += `\nTurno ${turn}:\nPlan: ${parsed.plan}\nResult: ${result}\nVerify: ${verified.feedback}\n`;
|
|
108
|
+
await saveCheckpoint(turn, context, result, verified.pass);
|
|
109
|
+
|
|
110
|
+
if (verified.pass) {
|
|
111
|
+
console.log("[harness] Verificação passou - task concluída");
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Continua loop com feedback
|
|
116
|
+
context += `Feedback: ${verified.feedback}\n`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Salva resultado final
|
|
120
|
+
await storage.set("harness:result", { goal: GOAL, turns: turn, context, finalOutput: context });
|
|
121
|
+
console.log("[TASK:DONE]", JSON.stringify({ result: context, evidence: { turns: turn } }));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function listCheckpoints(): Promise<string[]> {
|
|
125
|
+
try {
|
|
126
|
+
const files = await readdir(CHECKPOINT_DIR);
|
|
127
|
+
return files
|
|
128
|
+
.filter((f) => f.endsWith(".json"))
|
|
129
|
+
.map((f) => join(CHECKPOINT_DIR, f))
|
|
130
|
+
.sort();
|
|
131
|
+
} catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function saveCheckpoint(turn: number, context: string, result: string, pass: boolean): Promise<void> {
|
|
137
|
+
await mkdir(CHECKPOINT_DIR, { recursive: true });
|
|
138
|
+
const file = join(CHECKPOINT_DIR, `turn-${turn}-${Date.now()}.json`);
|
|
139
|
+
await writeFile(file, JSON.stringify({ turn, context, result, pass, timestamp: Date.now() }, null, 2));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
main().catch((e) => {
|
|
143
|
+
console.error("[harness] Erro fatal:", e);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { agent, TASK_DONE_EVENT } from "@autonsh/runtime";
|
|
2
2
|
|
|
3
|
-
// Template multi-agent — delega via
|
|
4
|
-
// Modo: build/deploy —
|
|
3
|
+
// Template multi-agent — delega via ctx.tools.fetch ao CP (respeita policy)
|
|
4
|
+
// Modo: build/deploy — fetch permitido em ambos (policy fetch: true)
|
|
5
5
|
export default agent(async (ctx) => {
|
|
6
6
|
const goal = ((ctx.input as { prompt?: string } | undefined)?.prompt ?? "").trim()
|
|
7
7
|
|| "orquestra agentes";
|
|
@@ -11,20 +11,19 @@ export default agent(async (ctx) => {
|
|
|
11
11
|
if (!api) throw new Error("AUTON_API não definido — delegação requer CP");
|
|
12
12
|
await ctx.logger.info("multi-agent iniciado", { goal, mode });
|
|
13
13
|
|
|
14
|
-
// Delega via
|
|
14
|
+
// Delega via ctx.tools.fetch ao CP: POST /v1/agents/{name}/invoke
|
|
15
15
|
// Retorna {result, turn, lines} — result é o TASK:DONE estruturado
|
|
16
16
|
async function delegate(toAgent: string, prompt: string): Promise<any> {
|
|
17
17
|
try {
|
|
18
|
-
const res = await fetch(`${api}/v1/agents/${toAgent}/invoke`, {
|
|
18
|
+
const res = await ctx.tools.fetch(`${api}/v1/agents/${toAgent}/invoke`, {
|
|
19
19
|
method: "POST",
|
|
20
20
|
headers: { "Content-Type": "application/json" },
|
|
21
21
|
body: JSON.stringify({ prompt }),
|
|
22
22
|
});
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
return { erro: `HTTP ${res.status}: ${text}` };
|
|
23
|
+
if (res.status >= 400) {
|
|
24
|
+
return { erro: `HTTP ${res.status}: ${res.text}` };
|
|
26
25
|
}
|
|
27
|
-
const data =
|
|
26
|
+
const data = JSON.parse(res.text);
|
|
28
27
|
return data.result ?? { turn: data.turn, lines: data.lines };
|
|
29
28
|
} catch (err) {
|
|
30
29
|
return { erro: (err as Error).message };
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
name: multi-agent
|
|
2
|
-
description: Orquestração multi-agent — delega para worker via
|
|
2
|
+
description: Orquestração multi-agent — delega para worker via HTTP (ctx.tools.fetch)
|
|
3
3
|
goal: "orquestra agentes"
|
|
4
4
|
entry: agent.ts
|
|
5
|
-
models:
|
|
6
|
-
default: mock:local
|
|
7
5
|
env:
|
|
8
6
|
- OPENAI_API_KEY
|
|
9
7
|
http: true
|