apiario 0.7.0 → 0.9.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/cli.js +176 -6
- package/dist/cli.js.map +1 -1
- package/dist/extensions/cost.d.ts +46 -0
- package/dist/extensions/cost.d.ts.map +1 -0
- package/dist/extensions/cost.js +401 -0
- package/dist/extensions/cost.js.map +1 -0
- package/package.json +3 -2
- package/skills/git-worktree/SKILL.md +203 -0
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { AuthStorage, ModelRegistry, InteractiveMode, runPrintMode, createAgentSessionRuntime, createAgentSessionFromServices, createAgentSessionServices, SessionManager, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { AuthStorage, ModelRegistry, InteractiveMode, runPrintMode, createAgentSessionRuntime, createAgentSessionFromServices, createAgentSessionServices, SessionManager, createSyntheticSourceInfo, } from "@earendil-works/pi-coding-agent";
|
|
3
3
|
import { resolveApiKey, runSetupWizard } from "./auth.js";
|
|
4
4
|
import { resolveModels, mapToProviderModelConfigs, sortModelsByPriority, } from "./provider.js";
|
|
5
5
|
import { API_BASE_URL, apiClientHeaders } from "./client.js";
|
|
6
6
|
import localizationExtension from "./extensions/localization.js";
|
|
7
|
+
import subagentExtension from "./extensions/subagent/index.js";
|
|
8
|
+
import costExtension from "./extensions/cost.js";
|
|
7
9
|
import { homedir } from "os";
|
|
8
|
-
import { join } from "path";
|
|
10
|
+
import { join, dirname } from "path";
|
|
11
|
+
import { readFileSync, existsSync, readdirSync } from "fs";
|
|
12
|
+
import { fileURLToPath } from "url";
|
|
9
13
|
// ---------------------------------------------------------------------------
|
|
10
14
|
// Monkey-patch: traduz seções de startup do pi.dev para pt-BR
|
|
11
15
|
// ---------------------------------------------------------------------------
|
|
@@ -121,11 +125,115 @@ catch {
|
|
|
121
125
|
// ---------------------------------------------------------------------------
|
|
122
126
|
// Constants
|
|
123
127
|
// ---------------------------------------------------------------------------
|
|
128
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
129
|
+
const __dirname = dirname(__filename);
|
|
130
|
+
// PKG_ROOT resolve para a raiz do pacote npm: dist/cli.js → join("dist", "..")
|
|
131
|
+
// Funciona porque tsconfig.json usa rootDir: "src" e outDir: "dist"
|
|
132
|
+
const PKG_ROOT = join(__dirname, "..");
|
|
124
133
|
const AGENT_DIR = join(homedir(), ".config", "apiario");
|
|
125
134
|
// ---------------------------------------------------------------------------
|
|
126
|
-
//
|
|
135
|
+
// Skills empacotadas
|
|
127
136
|
// ---------------------------------------------------------------------------
|
|
137
|
+
/**
|
|
138
|
+
* Carrega skills empacotadas do diretório skills/ na raiz do pacote npm.
|
|
139
|
+
* Cada subdiretório dentro de skills/ que contenha um SKILL.md com
|
|
140
|
+
* frontmatter YAML válido é convertido em um objeto Skill.
|
|
141
|
+
*
|
|
142
|
+
* Falhas de leitura ou parse resultam em null (skill ignorada
|
|
143
|
+
* silenciosamente), sem crashar o startup.
|
|
144
|
+
*
|
|
145
|
+
* Retorna array vazio se skills/ não existir ou estiver vazio.
|
|
146
|
+
*/
|
|
147
|
+
function loadBundledSkills() {
|
|
148
|
+
const skillsDir = join(PKG_ROOT, "skills");
|
|
149
|
+
if (!existsSync(skillsDir))
|
|
150
|
+
return [];
|
|
151
|
+
return readdirSync(skillsDir, { withFileTypes: true })
|
|
152
|
+
.filter((d) => d.isDirectory())
|
|
153
|
+
.map((d) => {
|
|
154
|
+
try {
|
|
155
|
+
const skillDir = join(skillsDir, d.name);
|
|
156
|
+
const skillMd = join(skillDir, "SKILL.md");
|
|
157
|
+
if (!existsSync(skillMd))
|
|
158
|
+
return null;
|
|
159
|
+
const content = readFileSync(skillMd, "utf-8");
|
|
160
|
+
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
161
|
+
if (!fmMatch)
|
|
162
|
+
return null;
|
|
163
|
+
const fm = fmMatch[1];
|
|
164
|
+
const nameMatch = fm.match(/^name:\s*(.+)$/m);
|
|
165
|
+
const descMatch = fm.match(/^description:\s*(.+)$/m);
|
|
166
|
+
return {
|
|
167
|
+
name: nameMatch?.[1]?.trim() ?? d.name,
|
|
168
|
+
description: descMatch?.[1]?.trim() ?? "",
|
|
169
|
+
filePath: skillMd,
|
|
170
|
+
baseDir: skillDir,
|
|
171
|
+
sourceInfo: createSyntheticSourceInfo(skillMd, {
|
|
172
|
+
source: "apiario",
|
|
173
|
+
}),
|
|
174
|
+
disableModelInvocation: false,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Arquivo corrompido ou sem permissão — ignora silenciosamente
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
})
|
|
182
|
+
.filter((s) => s !== null);
|
|
183
|
+
}
|
|
184
|
+
function parseJsonModeFlags() {
|
|
185
|
+
const args = process.argv.slice(2);
|
|
186
|
+
const modeIndex = args.indexOf("--mode");
|
|
187
|
+
const isJsonMode = modeIndex >= 0 && args[modeIndex + 1] === "json";
|
|
188
|
+
const getValue = (flag) => {
|
|
189
|
+
const idx = args.indexOf(flag);
|
|
190
|
+
return idx >= 0 && idx + 1 < args.length
|
|
191
|
+
? args[idx + 1]
|
|
192
|
+
: undefined;
|
|
193
|
+
};
|
|
194
|
+
const appendSystemPrompt = [];
|
|
195
|
+
for (let i = 0; i < args.length; i++) {
|
|
196
|
+
if (args[i] === "--append-system-prompt" &&
|
|
197
|
+
i + 1 < args.length) {
|
|
198
|
+
appendSystemPrompt.push(args[i + 1]);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Coleta argumentos posicionais (mensagens)
|
|
202
|
+
const messages = [];
|
|
203
|
+
let seenModeFlag = false;
|
|
204
|
+
for (let i = 0; i < args.length; i++) {
|
|
205
|
+
if (args[i] === "--mode") {
|
|
206
|
+
seenModeFlag = true;
|
|
207
|
+
i++; // pula o valor
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (args[i] === "--model" || args[i] === "--tools") {
|
|
211
|
+
i++; // pula o valor
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (args[i] === "--append-system-prompt") {
|
|
215
|
+
i++; // pula o valor
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
if (args[i] === "--no-session" || args[i] === "--mode") {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (args[i].startsWith("--"))
|
|
222
|
+
continue;
|
|
223
|
+
messages.push(args[i]);
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
isJsonMode,
|
|
227
|
+
modelFlag: getValue("--model"),
|
|
228
|
+
toolsFlag: getValue("--tools"),
|
|
229
|
+
appendSystemPrompt,
|
|
230
|
+
noSession: args.includes("--no-session"),
|
|
231
|
+
messages,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
128
234
|
async function main() {
|
|
235
|
+
// ── 0. Parse CLI flags ────────────────────────────────────────
|
|
236
|
+
const jsonFlags = parseJsonModeFlags();
|
|
129
237
|
// ── 1. Resolve API key ──────────────────────────────────────────────
|
|
130
238
|
let apiKey = resolveApiKey();
|
|
131
239
|
if (!apiKey) {
|
|
@@ -169,13 +277,31 @@ async function main() {
|
|
|
169
277
|
authStorage,
|
|
170
278
|
modelRegistry,
|
|
171
279
|
resourceLoaderOptions: {
|
|
172
|
-
extensionFactories: [localizationExtension],
|
|
280
|
+
extensionFactories: [localizationExtension, subagentExtension, costExtension],
|
|
281
|
+
skillsOverride: (current) => {
|
|
282
|
+
const bundled = loadBundledSkills();
|
|
283
|
+
// Skills locais do usuário têm prioridade (first-wins)
|
|
284
|
+
const existingNames = new Set(current.skills.map((s) => s.name));
|
|
285
|
+
const filteredBundled = bundled.filter((s) => !existingNames.has(s.name));
|
|
286
|
+
return {
|
|
287
|
+
skills: [...current.skills, ...filteredBundled],
|
|
288
|
+
diagnostics: current.diagnostics,
|
|
289
|
+
};
|
|
290
|
+
},
|
|
291
|
+
appendSystemPrompt: jsonFlags.isJsonMode
|
|
292
|
+
? jsonFlags.appendSystemPrompt
|
|
293
|
+
: undefined,
|
|
173
294
|
},
|
|
174
295
|
});
|
|
175
296
|
const allModels = modelRegistry
|
|
176
297
|
.getAll()
|
|
177
298
|
.filter((m) => m.provider === "apiario");
|
|
178
|
-
|
|
299
|
+
// Se --model foi passado, tenta encontrar o modelo específico
|
|
300
|
+
const modelOverride = jsonFlags.isJsonMode && jsonFlags.modelFlag
|
|
301
|
+
? allModels.find((m) => m.id === jsonFlags.modelFlag)
|
|
302
|
+
: undefined;
|
|
303
|
+
const defaultModel = modelOverride ??
|
|
304
|
+
allModels.find((m) => m.id === "deepseek/deepseek-v4-flash") ??
|
|
179
305
|
allModels[0];
|
|
180
306
|
const sessionResult = await createAgentSessionFromServices({
|
|
181
307
|
services,
|
|
@@ -190,13 +316,57 @@ async function main() {
|
|
|
190
316
|
};
|
|
191
317
|
};
|
|
192
318
|
const cwd = process.cwd();
|
|
319
|
+
// ── 5. JSON mode ──────────────────────────────────────────────────
|
|
320
|
+
if (jsonFlags.isJsonMode) {
|
|
321
|
+
const stdin = await readStdin();
|
|
322
|
+
// Se --no-session, usa session em memória
|
|
323
|
+
const sessionManager = jsonFlags.noSession
|
|
324
|
+
? SessionManager.inMemory(cwd)
|
|
325
|
+
: await SessionManager.create(cwd);
|
|
326
|
+
const runtime = await createAgentSessionRuntime(createRuntime, {
|
|
327
|
+
cwd,
|
|
328
|
+
agentDir: AGENT_DIR,
|
|
329
|
+
sessionManager,
|
|
330
|
+
});
|
|
331
|
+
// Tenta parsear stdin como JSON para extrair mensagens
|
|
332
|
+
let initialMessage;
|
|
333
|
+
let initialMessages;
|
|
334
|
+
if (stdin.trim()) {
|
|
335
|
+
try {
|
|
336
|
+
const input = JSON.parse(stdin.trim());
|
|
337
|
+
if (input.messages && input.messages.length > 0) {
|
|
338
|
+
initialMessages = input.messages.map((m) => `${m.role}: ${m.content}`);
|
|
339
|
+
}
|
|
340
|
+
else if (Array.isArray(stdin)) {
|
|
341
|
+
initialMessages = stdin;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
initialMessage = stdin.trim();
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
// Não é JSON — usa como texto simples
|
|
349
|
+
initialMessage = stdin.trim() || jsonFlags.messages.join(" ");
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
else if (jsonFlags.messages.length > 0) {
|
|
353
|
+
initialMessage = jsonFlags.messages.join(" ");
|
|
354
|
+
}
|
|
355
|
+
await runPrintMode(runtime, {
|
|
356
|
+
mode: "json",
|
|
357
|
+
messages: initialMessages,
|
|
358
|
+
initialMessage,
|
|
359
|
+
});
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
// ── 6. Session normal ─────────────────────────────────────────────
|
|
193
363
|
const sessionManager = await SessionManager.create(cwd);
|
|
194
364
|
const runtime = await createAgentSessionRuntime(createRuntime, {
|
|
195
365
|
cwd,
|
|
196
366
|
agentDir: AGENT_DIR,
|
|
197
367
|
sessionManager,
|
|
198
368
|
});
|
|
199
|
-
// ──
|
|
369
|
+
// ── 7. Detect TTY and launch mode ─────────────────────────────────
|
|
200
370
|
const isTTY = process.stdout.isTTY && !process.env.PIPESTART;
|
|
201
371
|
if (isTTY) {
|
|
202
372
|
const interactiveMode = new InteractiveMode(runtime);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extensão de custo da sessão (/cost) para o Apiário Dev
|
|
3
|
+
*
|
|
4
|
+
* Expõe:
|
|
5
|
+
* - Tool "session_cost" para o LLM consultar gastos acumulados da sessão
|
|
6
|
+
* - Comando "/cost" para o usuário ver a mesma tabela no chat
|
|
7
|
+
*
|
|
8
|
+
* Formatação: pt-BR (R$), tokens com sufixo k/M, cores alternadas por provedor.
|
|
9
|
+
*/
|
|
10
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
11
|
+
export interface ModelCost {
|
|
12
|
+
modelId: string;
|
|
13
|
+
provider: string;
|
|
14
|
+
inputTokens: number;
|
|
15
|
+
outputTokens: number;
|
|
16
|
+
toolCalls: number;
|
|
17
|
+
cost: number;
|
|
18
|
+
}
|
|
19
|
+
export interface SessionCosts {
|
|
20
|
+
models: ModelCost[];
|
|
21
|
+
totalCost: number;
|
|
22
|
+
totalInputTokens: number;
|
|
23
|
+
totalOutputTokens: number;
|
|
24
|
+
totalToolCalls: number;
|
|
25
|
+
currentModel: string;
|
|
26
|
+
messageCount: number;
|
|
27
|
+
turnCount: number;
|
|
28
|
+
balance: number | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Percorre as mensagens da sessão e computa custos agregados por modelo.
|
|
32
|
+
*
|
|
33
|
+
* @param ctx ExtensionContext (usado em tools e commands)
|
|
34
|
+
* @returns SessionCosts com dados agregados e saldo (null se falhar)
|
|
35
|
+
*/
|
|
36
|
+
export declare function computeSessionCosts(ctx: ExtensionContext): SessionCosts;
|
|
37
|
+
/**
|
|
38
|
+
* Versão assíncrona de computeSessionCosts que também busca o saldo.
|
|
39
|
+
*/
|
|
40
|
+
export declare function computeSessionCostsAsync(ctx: ExtensionContext): Promise<SessionCosts>;
|
|
41
|
+
/**
|
|
42
|
+
* Gera o texto da tabela de custos para exibição no chat ou tool result.
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatSessionCostsTable(costs: SessionCosts): string;
|
|
45
|
+
export default function costExtension(pi: ExtensionAPI): void;
|
|
46
|
+
//# sourceMappingURL=cost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/extensions/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACV,YAAY,EAEZ,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AAezC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AA4DD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,gBAAgB,GACpB,YAAY,CAwEd;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,YAAY,CAAC,CAcvB;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAmFnE;AAkPD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,YAAY,QAgErD"}
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extensão de custo da sessão (/cost) para o Apiário Dev
|
|
3
|
+
*
|
|
4
|
+
* Expõe:
|
|
5
|
+
* - Tool "session_cost" para o LLM consultar gastos acumulados da sessão
|
|
6
|
+
* - Comando "/cost" para o usuário ver a mesma tabela no chat
|
|
7
|
+
*
|
|
8
|
+
* Formatação: pt-BR (R$), tokens com sufixo k/M, cores alternadas por provedor.
|
|
9
|
+
*/
|
|
10
|
+
import { Container, Spacer, Text, visibleWidth, } from "@earendil-works/pi-tui";
|
|
11
|
+
import { Type } from "typebox";
|
|
12
|
+
import { fetchBalance, formatBalanceBRL } from "../balance.js";
|
|
13
|
+
import { resolveApiKey } from "../auth.js";
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Helpers de formatação
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Formata tokens: < 1000 → literal, senão 1.2k, 1.5M etc.
|
|
19
|
+
*/
|
|
20
|
+
function formatTokens(n) {
|
|
21
|
+
if (n < 1000)
|
|
22
|
+
return `${n}`;
|
|
23
|
+
if (n < 1_000_000)
|
|
24
|
+
return `${(n / 1000).toFixed(1)}k`;
|
|
25
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Formata custo em reais (pt-BR).
|
|
29
|
+
* Valores < R$ 0,01 usam 4 casas decimais, senão 3.
|
|
30
|
+
*/
|
|
31
|
+
function formatCostBRL(cost) {
|
|
32
|
+
const decimals = cost > 0 && cost < 0.01 ? 4 : 3;
|
|
33
|
+
return `R$ ${cost.toLocaleString("pt-BR", {
|
|
34
|
+
minimumFractionDigits: decimals,
|
|
35
|
+
maximumFractionDigits: decimals,
|
|
36
|
+
})}`;
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Pool de cores por provedor (hash determinístico)
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
const PROVIDER_COLORS = [
|
|
42
|
+
"accent",
|
|
43
|
+
"success",
|
|
44
|
+
"warning",
|
|
45
|
+
"toolOutput",
|
|
46
|
+
"text",
|
|
47
|
+
];
|
|
48
|
+
function hashProvider(provider) {
|
|
49
|
+
let hash = 0;
|
|
50
|
+
for (let i = 0; i < provider.length; i++) {
|
|
51
|
+
hash = (hash * 31 + provider.charCodeAt(i)) | 0;
|
|
52
|
+
}
|
|
53
|
+
return Math.abs(hash);
|
|
54
|
+
}
|
|
55
|
+
function colorForProvider(provider, theme) {
|
|
56
|
+
const idx = hashProvider(provider) % PROVIDER_COLORS.length;
|
|
57
|
+
const colorKey = PROVIDER_COLORS[idx];
|
|
58
|
+
return (text) => theme.fg(colorKey, text);
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Lógica compartilhada: computeSessionCosts
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/**
|
|
64
|
+
* Percorre as mensagens da sessão e computa custos agregados por modelo.
|
|
65
|
+
*
|
|
66
|
+
* @param ctx ExtensionContext (usado em tools e commands)
|
|
67
|
+
* @returns SessionCosts com dados agregados e saldo (null se falhar)
|
|
68
|
+
*/
|
|
69
|
+
export function computeSessionCosts(ctx) {
|
|
70
|
+
const branch = ctx.sessionManager.getBranch();
|
|
71
|
+
const modelMap = new Map();
|
|
72
|
+
let messageCount = 0;
|
|
73
|
+
let turnCount = 0;
|
|
74
|
+
let currentModel = "";
|
|
75
|
+
for (const entry of branch) {
|
|
76
|
+
if (entry.type !== "message")
|
|
77
|
+
continue;
|
|
78
|
+
const msg = entry.message;
|
|
79
|
+
if (msg.role === "assistant") {
|
|
80
|
+
turnCount++;
|
|
81
|
+
const am = msg;
|
|
82
|
+
const modelId = am.model || "desconhecido";
|
|
83
|
+
if (!currentModel)
|
|
84
|
+
currentModel = modelId;
|
|
85
|
+
const provider = modelId.includes("/")
|
|
86
|
+
? modelId.split("/")[0]
|
|
87
|
+
: modelId;
|
|
88
|
+
const inputTokens = am.usage?.input ?? 0;
|
|
89
|
+
const outputTokens = am.usage?.output ?? 0;
|
|
90
|
+
const cost = am.usage?.cost?.total ?? 0;
|
|
91
|
+
// Conta tool calls no content
|
|
92
|
+
let toolCalls = 0;
|
|
93
|
+
if (am.content) {
|
|
94
|
+
for (const part of am.content) {
|
|
95
|
+
if (part.type === "toolCall")
|
|
96
|
+
toolCalls++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const existing = modelMap.get(modelId);
|
|
100
|
+
if (existing) {
|
|
101
|
+
existing.inputTokens += inputTokens;
|
|
102
|
+
existing.outputTokens += outputTokens;
|
|
103
|
+
existing.toolCalls += toolCalls;
|
|
104
|
+
existing.cost += cost;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
modelMap.set(modelId, {
|
|
108
|
+
modelId,
|
|
109
|
+
provider,
|
|
110
|
+
inputTokens,
|
|
111
|
+
outputTokens,
|
|
112
|
+
toolCalls,
|
|
113
|
+
cost,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
messageCount++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const models = Array.from(modelMap.values());
|
|
120
|
+
const totalCost = models.reduce((s, m) => s + m.cost, 0);
|
|
121
|
+
const totalInputTokens = models.reduce((s, m) => s + m.inputTokens, 0);
|
|
122
|
+
const totalOutputTokens = models.reduce((s, m) => s + m.outputTokens, 0);
|
|
123
|
+
const totalToolCalls = models.reduce((s, m) => s + m.toolCalls, 0);
|
|
124
|
+
return {
|
|
125
|
+
models,
|
|
126
|
+
totalCost,
|
|
127
|
+
totalInputTokens,
|
|
128
|
+
totalOutputTokens,
|
|
129
|
+
totalToolCalls,
|
|
130
|
+
currentModel,
|
|
131
|
+
messageCount,
|
|
132
|
+
turnCount,
|
|
133
|
+
balance: null,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Versão assíncrona de computeSessionCosts que também busca o saldo.
|
|
138
|
+
*/
|
|
139
|
+
export async function computeSessionCostsAsync(ctx) {
|
|
140
|
+
const costs = computeSessionCosts(ctx);
|
|
141
|
+
try {
|
|
142
|
+
const apiKey = resolveApiKey();
|
|
143
|
+
if (apiKey) {
|
|
144
|
+
const { balance } = await fetchBalance(apiKey);
|
|
145
|
+
costs.balance = balance;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
costs.balance = null;
|
|
150
|
+
}
|
|
151
|
+
return costs;
|
|
152
|
+
}
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Renderização da tabela de custos (texto)
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
/**
|
|
157
|
+
* Gera o texto da tabela de custos para exibição no chat ou tool result.
|
|
158
|
+
*/
|
|
159
|
+
export function formatSessionCostsTable(costs) {
|
|
160
|
+
if (costs.models.length === 0) {
|
|
161
|
+
return "Nenhum dado de custo disponível.";
|
|
162
|
+
}
|
|
163
|
+
const lines = [];
|
|
164
|
+
lines.push("## 💰 Custo da Sessão");
|
|
165
|
+
lines.push("");
|
|
166
|
+
lines.push(`Modelo ativo: ${costs.currentModel}`);
|
|
167
|
+
lines.push(`Mensagens: ${costs.messageCount} · Turns: ${costs.turnCount} · Tool calls: ${costs.totalToolCalls}`);
|
|
168
|
+
lines.push("");
|
|
169
|
+
lines.push("### Gasto por Modelo");
|
|
170
|
+
lines.push("");
|
|
171
|
+
// Cabeçalho da tabela
|
|
172
|
+
const hdrModel = "Modelo";
|
|
173
|
+
const hdrIn = "Tokens In";
|
|
174
|
+
const hdrOut = "Tokens Out";
|
|
175
|
+
const hdrTl = "Tool Calls";
|
|
176
|
+
const hdrCost = "Custo (R$)";
|
|
177
|
+
// Larguras das colunas (baseadas no conteúdo)
|
|
178
|
+
const colModelW = Math.max(hdrModel.length, ...costs.models.map((m) => m.modelId.length));
|
|
179
|
+
const colInW = Math.max(hdrIn.length, ...costs.models.map((m) => formatTokens(m.inputTokens).length));
|
|
180
|
+
const colOutW = Math.max(hdrOut.length, ...costs.models.map((m) => formatTokens(m.outputTokens).length));
|
|
181
|
+
const colTlW = Math.max(hdrTl.length, ...costs.models.map((m) => String(m.toolCalls).length));
|
|
182
|
+
const colCostW = Math.max(hdrCost.length, ...costs.models.map((m) => formatCostBRL(m.cost).replace(/\x1b\[[0-9;]*m/g, "").length));
|
|
183
|
+
const sep = " ";
|
|
184
|
+
const pad = " ";
|
|
185
|
+
const header = hdrModel.padEnd(colModelW) +
|
|
186
|
+
sep +
|
|
187
|
+
hdrIn.padStart(colInW) +
|
|
188
|
+
sep +
|
|
189
|
+
hdrOut.padStart(colOutW) +
|
|
190
|
+
sep +
|
|
191
|
+
hdrTl.padStart(colTlW) +
|
|
192
|
+
sep +
|
|
193
|
+
hdrCost.padStart(colCostW);
|
|
194
|
+
lines.push(header);
|
|
195
|
+
// Separador
|
|
196
|
+
const sepLine = "─".repeat(colModelW) + sep + "─".repeat(colInW) + sep + "─".repeat(colOutW) + sep + "─".repeat(colTlW) + sep + "─".repeat(colCostW);
|
|
197
|
+
lines.push(sepLine);
|
|
198
|
+
// Linhas de dados
|
|
199
|
+
for (const m of costs.models) {
|
|
200
|
+
const modelPadded = m.modelId.padEnd(colModelW);
|
|
201
|
+
const inPadded = formatTokens(m.inputTokens).padStart(colInW);
|
|
202
|
+
const outPadded = formatTokens(m.outputTokens).padStart(colOutW);
|
|
203
|
+
const tlPadded = String(m.toolCalls).padStart(colTlW);
|
|
204
|
+
const costPadded = formatCostBRL(m.cost).padStart(colCostW);
|
|
205
|
+
lines.push(`${modelPadded}${sep}${inPadded}${sep}${outPadded}${sep}${tlPadded}${sep}${costPadded}`);
|
|
206
|
+
}
|
|
207
|
+
// Separador total
|
|
208
|
+
lines.push(sepLine);
|
|
209
|
+
// Linha de total
|
|
210
|
+
const totalIn = formatTokens(costs.totalInputTokens).padStart(colInW);
|
|
211
|
+
const totalOut = formatTokens(costs.totalOutputTokens).padStart(colOutW);
|
|
212
|
+
const totalTl = String(costs.totalToolCalls).padStart(colTlW);
|
|
213
|
+
const totalCost = formatCostBRL(costs.totalCost).padStart(colCostW);
|
|
214
|
+
lines.push(`Total${" ".repeat(colModelW - 5)}${sep}${totalIn}${sep}${totalOut}${sep}${totalTl}${sep}${totalCost}`);
|
|
215
|
+
// Saldo
|
|
216
|
+
lines.push("");
|
|
217
|
+
lines.push("### Saldo da Conta");
|
|
218
|
+
lines.push("");
|
|
219
|
+
if (costs.balance !== null) {
|
|
220
|
+
lines.push(`Saldo disponível: ${formatBalanceBRL(costs.balance)}`);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
lines.push("Saldo disponível: indisponível");
|
|
224
|
+
}
|
|
225
|
+
return lines.join("\n");
|
|
226
|
+
}
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
// Renderização TUI (renderCall / renderResult)
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
function renderCostCall(_args, theme) {
|
|
231
|
+
return new Text(theme.fg("toolTitle", "💰 ") +
|
|
232
|
+
theme.fg("text", "Consultando custos da sessão..."), 0, 0);
|
|
233
|
+
}
|
|
234
|
+
function renderCostResult(result, options, theme, _context) {
|
|
235
|
+
if (options.isPartial) {
|
|
236
|
+
return new Text(theme.fg("dim", "Calculando custos..."), 0, 0);
|
|
237
|
+
}
|
|
238
|
+
const costs = result.details?.costs;
|
|
239
|
+
// Fallback para texto puro (quando não há detalhes ou é erro)
|
|
240
|
+
if (!costs) {
|
|
241
|
+
const textContent = result.content[0];
|
|
242
|
+
const rawText = textContent?.type === "text" ? textContent.text || "(sem dados)" : "(sem dados)";
|
|
243
|
+
return new Text(rawText, 0, 0);
|
|
244
|
+
}
|
|
245
|
+
// Collapsed: linha única resumo
|
|
246
|
+
if (!options.expanded) {
|
|
247
|
+
const modelsSummary = costs.models.length === 0
|
|
248
|
+
? "Nenhum modelo"
|
|
249
|
+
: costs.models.length === 1
|
|
250
|
+
? "1 modelo"
|
|
251
|
+
: `${costs.models.length} modelos`;
|
|
252
|
+
const balanceStr = costs.balance !== null ? formatBalanceBRL(costs.balance) : "indisponível";
|
|
253
|
+
const totalCostStr = formatCostBRL(costs.totalCost);
|
|
254
|
+
const text = `💰 ${totalCostStr} · Saldo: ${balanceStr} · ${modelsSummary}`;
|
|
255
|
+
return new Text(text, 0, 0);
|
|
256
|
+
}
|
|
257
|
+
// Expanded: tabela completa com cores por provedor
|
|
258
|
+
if (costs.models.length === 0) {
|
|
259
|
+
return new Text("Nenhum dado de custo disponível.", 0, 0);
|
|
260
|
+
}
|
|
261
|
+
const container = new Container();
|
|
262
|
+
// Título
|
|
263
|
+
container.addChild(new Text(theme.fg("toolTitle", "💰 ") + theme.fg("bold", "Custo da Sessão"), 0, 0));
|
|
264
|
+
container.addChild(new Spacer(1));
|
|
265
|
+
// Metadados
|
|
266
|
+
container.addChild(new Text(theme.fg("text", "Modelo ativo: ") +
|
|
267
|
+
theme.fg("accent", costs.currentModel), 0, 0));
|
|
268
|
+
container.addChild(new Text(theme.fg("dim", `Mensagens: ${costs.messageCount} · Turns: ${costs.turnCount} · Tool calls: ${costs.totalToolCalls}`), 0, 0));
|
|
269
|
+
container.addChild(new Spacer(1));
|
|
270
|
+
container.addChild(new Text(theme.fg("toolTitle", "Gasto por Modelo"), 0, 0));
|
|
271
|
+
container.addChild(new Spacer(1));
|
|
272
|
+
// Cabeçalho da tabela
|
|
273
|
+
const hdrModel = "Modelo";
|
|
274
|
+
const hdrIn = "Tokens In";
|
|
275
|
+
const hdrOut = "Tokens Out";
|
|
276
|
+
const hdrTl = "Tool Calls";
|
|
277
|
+
const hdrCost = "Custo (R$)";
|
|
278
|
+
const colModelW = Math.max(hdrModel.length, ...costs.models.map((m) => m.modelId.length));
|
|
279
|
+
const colInW = Math.max(hdrIn.length, ...costs.models.map((m) => formatTokens(m.inputTokens).length));
|
|
280
|
+
const colOutW = Math.max(hdrOut.length, ...costs.models.map((m) => formatTokens(m.outputTokens).length));
|
|
281
|
+
const colTlW = Math.max(hdrTl.length, ...costs.models.map((m) => String(m.toolCalls).length));
|
|
282
|
+
const colCostW = Math.max(hdrCost.length, ...costs.models.map((m) => {
|
|
283
|
+
return visibleWidth(formatCostBRL(m.cost));
|
|
284
|
+
}));
|
|
285
|
+
const sep = " ";
|
|
286
|
+
// Linha do cabeçalho
|
|
287
|
+
const headerText = theme.fg("dim", hdrModel.padEnd(colModelW)) +
|
|
288
|
+
sep +
|
|
289
|
+
theme.fg("dim", hdrIn.padStart(colInW)) +
|
|
290
|
+
sep +
|
|
291
|
+
theme.fg("dim", hdrOut.padStart(colOutW)) +
|
|
292
|
+
sep +
|
|
293
|
+
theme.fg("dim", hdrTl.padStart(colTlW)) +
|
|
294
|
+
sep +
|
|
295
|
+
theme.fg("dim", hdrCost.padStart(colCostW));
|
|
296
|
+
container.addChild(new Text(headerText, 0, 0));
|
|
297
|
+
// Separador
|
|
298
|
+
const sepLineStr = theme.fg("dim", "─".repeat(colModelW)) +
|
|
299
|
+
sep +
|
|
300
|
+
theme.fg("dim", "─".repeat(colInW)) +
|
|
301
|
+
sep +
|
|
302
|
+
theme.fg("dim", "─".repeat(colOutW)) +
|
|
303
|
+
sep +
|
|
304
|
+
theme.fg("dim", "─".repeat(colTlW)) +
|
|
305
|
+
sep +
|
|
306
|
+
theme.fg("dim", "─".repeat(colCostW));
|
|
307
|
+
container.addChild(new Text(sepLineStr, 0, 0));
|
|
308
|
+
// Linhas de modelo com cor por provedor
|
|
309
|
+
for (const m of costs.models) {
|
|
310
|
+
const colorize = colorForProvider(m.provider, theme);
|
|
311
|
+
const modelPadded = colorize(m.modelId.padEnd(colModelW));
|
|
312
|
+
const inPadded = theme.fg("text", formatTokens(m.inputTokens).padStart(colInW));
|
|
313
|
+
const outPadded = theme.fg("text", formatTokens(m.outputTokens).padStart(colOutW));
|
|
314
|
+
const tlPadded = theme.fg("text", String(m.toolCalls).padStart(colTlW));
|
|
315
|
+
const costPadded = theme.fg("success", formatCostBRL(m.cost).padStart(colCostW));
|
|
316
|
+
const rowText = `${modelPadded}${sep}${inPadded}${sep}${outPadded}${sep}${tlPadded}${sep}${costPadded}`;
|
|
317
|
+
container.addChild(new Text(rowText, 0, 0));
|
|
318
|
+
}
|
|
319
|
+
// Separador total
|
|
320
|
+
container.addChild(new Text(sepLineStr, 0, 0));
|
|
321
|
+
// Linha de total
|
|
322
|
+
const totalInStr = theme.fg("bold", formatTokens(costs.totalInputTokens).padStart(colInW));
|
|
323
|
+
const totalOutStr = theme.fg("bold", formatTokens(costs.totalOutputTokens).padStart(colOutW));
|
|
324
|
+
const totalTlStr = theme.fg("bold", String(costs.totalToolCalls).padStart(colTlW));
|
|
325
|
+
const totalCostStr = theme.fg("success", theme.bold(formatCostBRL(costs.totalCost).padStart(colCostW)));
|
|
326
|
+
const totalRowText = theme.fg("bold", "Total") +
|
|
327
|
+
" ".repeat(Math.max(0, colModelW - 5)) +
|
|
328
|
+
sep +
|
|
329
|
+
totalInStr +
|
|
330
|
+
sep +
|
|
331
|
+
totalOutStr +
|
|
332
|
+
sep +
|
|
333
|
+
totalTlStr +
|
|
334
|
+
sep +
|
|
335
|
+
totalCostStr;
|
|
336
|
+
container.addChild(new Text(totalRowText, 0, 0));
|
|
337
|
+
container.addChild(new Spacer(1));
|
|
338
|
+
container.addChild(new Text(theme.fg("toolTitle", "Saldo da Conta"), 0, 0));
|
|
339
|
+
container.addChild(new Spacer(1));
|
|
340
|
+
if (costs.balance !== null) {
|
|
341
|
+
container.addChild(new Text(theme.fg("text", "Saldo disponível: ") +
|
|
342
|
+
theme.fg("success", formatBalanceBRL(costs.balance)), 0, 0));
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
container.addChild(new Text(theme.fg("text", "Saldo disponível: ") +
|
|
346
|
+
theme.fg("warning", "indisponível"), 0, 0));
|
|
347
|
+
}
|
|
348
|
+
return container;
|
|
349
|
+
}
|
|
350
|
+
// ---------------------------------------------------------------------------
|
|
351
|
+
// Extensão
|
|
352
|
+
// ---------------------------------------------------------------------------
|
|
353
|
+
export default function costExtension(pi) {
|
|
354
|
+
// ── Tool: session_cost ────────────────────────────────────────────
|
|
355
|
+
pi.registerTool({
|
|
356
|
+
name: "session_cost",
|
|
357
|
+
label: "Custo da Sessão",
|
|
358
|
+
description: "Consultar custos acumulados, tokens e saldo da sessão atual",
|
|
359
|
+
promptSnippet: "Consultar custos acumulados, tokens e saldo da sessão atual",
|
|
360
|
+
parameters: Type.Object({}),
|
|
361
|
+
async execute(_toolCallId, _params, _signal, onUpdate, ctx) {
|
|
362
|
+
// Notificação inicial
|
|
363
|
+
if (onUpdate) {
|
|
364
|
+
onUpdate({
|
|
365
|
+
content: [
|
|
366
|
+
{
|
|
367
|
+
type: "text",
|
|
368
|
+
text: "Consultando custos da sessão...",
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
const costs = await computeSessionCostsAsync(ctx);
|
|
374
|
+
const tableText = formatSessionCostsTable(costs);
|
|
375
|
+
return {
|
|
376
|
+
content: [{ type: "text", text: tableText }],
|
|
377
|
+
details: { costs },
|
|
378
|
+
};
|
|
379
|
+
},
|
|
380
|
+
renderCall(args, theme, _context) {
|
|
381
|
+
return renderCostCall(args, theme);
|
|
382
|
+
},
|
|
383
|
+
renderResult(result, options, theme, context) {
|
|
384
|
+
return renderCostResult(result, options, theme, context);
|
|
385
|
+
},
|
|
386
|
+
});
|
|
387
|
+
// ── Command: /cost ────────────────────────────────────────────────
|
|
388
|
+
pi.registerCommand("cost", {
|
|
389
|
+
description: "Exibe custos acumulados da sessão atual",
|
|
390
|
+
async handler(_args, ctx) {
|
|
391
|
+
const costs = await computeSessionCostsAsync(ctx);
|
|
392
|
+
const tableText = formatSessionCostsTable(costs);
|
|
393
|
+
pi.sendMessage({
|
|
394
|
+
customType: "session_cost",
|
|
395
|
+
content: tableText,
|
|
396
|
+
display: true,
|
|
397
|
+
}, { triggerTurn: false });
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=cost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/extensions/cost.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apiario",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "CLI Harness — pi.dev TUI wrapper for Apiário Dev API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"node": ">=20.6.0"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
27
|
-
"dist"
|
|
27
|
+
"dist",
|
|
28
|
+
"skills"
|
|
28
29
|
]
|
|
29
30
|
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: git-worktree
|
|
3
|
+
description: Isola todas as alterações de código em um git worktree separado, protegendo a branch atual de mudanças durante a implementação de features ou correções
|
|
4
|
+
compatibility: Requer git >= 2.5 (git worktree add) e permissão de escrita no sistema de arquivos
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Git Worktree
|
|
8
|
+
|
|
9
|
+
## Visão Geral
|
|
10
|
+
|
|
11
|
+
Garante que o trabalho aconteça em um workspace isolado. Prefere ferramentas nativas de worktree da plataforma. Usa `git worktree` manual como fallback apenas quando não há ferramenta nativa disponível.
|
|
12
|
+
|
|
13
|
+
**Princípio central:** Detecte isolamento existente primeiro. Use ferramentas nativas. Depois fallback para git. Nunca lute contra o harness.
|
|
14
|
+
|
|
15
|
+
**Anuncie no início:** "Estou usando a skill git-worktree para configurar um workspace isolado."
|
|
16
|
+
|
|
17
|
+
## Passo 0: Detectar Isolamento Existente
|
|
18
|
+
|
|
19
|
+
**Antes de criar qualquer coisa, verifique se você já está em um workspace isolado.**
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
23
|
+
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
24
|
+
BRANCH=$(git branch --show-current)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Proteção contra submodules:** `GIT_DIR != GIT_COMMON` também é verdadeiro dentro de submodules. Antes de concluir "já estou em um worktree", verifique se não está em um submodule:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Se retornar um caminho, você está em um submodule — trate como repositório normal
|
|
31
|
+
git rev-parse --show-superproject-working-tree 2>/dev/null
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Se `GIT_DIR != GIT_COMMON` (e não for submodule):** Você já está em um worktree vinculado. Pule para o Passo 2 (Configuração do Projeto). NÃO crie outro worktree.
|
|
35
|
+
|
|
36
|
+
Reporte o estado da branch:
|
|
37
|
+
- Em uma branch: "Já estou em workspace isolado em `<caminho>` na branch `<nome>`."
|
|
38
|
+
- HEAD detached: "Já estou em workspace isolado em `<caminho>` (HEAD detached, gerenciado externamente). Criação de branch necessária no final."
|
|
39
|
+
|
|
40
|
+
**Se `GIT_DIR == GIT_COMMON` (ou em submodule):** Você está em um checkout normal do repositório.
|
|
41
|
+
|
|
42
|
+
O usuário já indicou sua preferência de worktree nas instruções? Se não, peça consentimento antes de criar um worktree:
|
|
43
|
+
|
|
44
|
+
> "Gostaria que eu configurasse um worktree isolado? Isso protege sua branch atual de alterações."
|
|
45
|
+
|
|
46
|
+
Respeite qualquer preferência já declarada sem perguntar novamente. Se o usuário recusar, trabalhe no diretório atual e pule para o Passo 2.
|
|
47
|
+
|
|
48
|
+
## Passo 1: Criar Workspace Isolado
|
|
49
|
+
|
|
50
|
+
**Você tem dois mecanismos. Tente nesta ordem.**
|
|
51
|
+
|
|
52
|
+
### 1a. Ferramentas Nativas de Worktree (preferido)
|
|
53
|
+
|
|
54
|
+
O usuário pediu um workspace isolado (consentimento do Passo 0). Você já tem uma forma de criar worktree? Pode ser uma ferramenta com nome `EnterWorktree`, `WorktreeCreate`, um comando `/worktree` ou uma flag `--worktree`. Se tiver, use e pule para o Passo 2.
|
|
55
|
+
|
|
56
|
+
Ferramentas nativas cuidam da colocação do diretório, criação da branch e limpeza automaticamente. Usar `git worktree add` quando você tem uma ferramenta nativa cria estado fantasma que seu harness não consegue ver ou gerenciar.
|
|
57
|
+
|
|
58
|
+
Só prossiga para o Passo 1b se não tiver ferramenta nativa de worktree disponível.
|
|
59
|
+
|
|
60
|
+
### 1b. Git Worktree Fallback
|
|
61
|
+
|
|
62
|
+
**Use apenas se o Passo 1a não se aplicar** — você não tem ferramenta nativa de worktree disponível. Crie um worktree manualmente usando git.
|
|
63
|
+
|
|
64
|
+
#### Seleção de Diretório
|
|
65
|
+
|
|
66
|
+
Siga esta ordem de prioridade. Preferência explícita do usuário sempre vence estado observado do filesystem.
|
|
67
|
+
|
|
68
|
+
1. **Verifique suas instruções para uma preferência de diretório de worktree declarada.** Se o usuário já especificou uma, use sem perguntar.
|
|
69
|
+
|
|
70
|
+
2. **Verifique se existe um diretório de worktree local do projeto:**
|
|
71
|
+
```bash
|
|
72
|
+
ls -d .worktrees 2>/dev/null # Preferido (oculto)
|
|
73
|
+
ls -d worktrees 2>/dev/null # Alternativa
|
|
74
|
+
```
|
|
75
|
+
Se encontrado, use. Se ambos existirem, `.worktrees` vence.
|
|
76
|
+
|
|
77
|
+
3. **Se não houver outra orientação disponível**, use `.worktrees/` na raiz do projeto como padrão.
|
|
78
|
+
|
|
79
|
+
#### Verificação de Segurança (apenas diretórios locais do projeto)
|
|
80
|
+
|
|
81
|
+
**DEVE verificar se o diretório está no .gitignore antes de criar worktree:**
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
git check-ignore -q .worktrees 2>/dev/null || git check-ignore -q worktrees 2>/dev/null
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Se NÃO estiver ignorado:** Adicione ao .gitignore, faça commit da mudança, então prossiga.
|
|
88
|
+
|
|
89
|
+
**Por que é crítico:** Previne que conteúdo do worktree seja acidentalmente commitado ao repositório.
|
|
90
|
+
|
|
91
|
+
#### Criar o Worktree
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Determine o caminho baseado na localização escolhida
|
|
95
|
+
caminho="$LOCALIZACAO/$NOME_DA_BRANCH"
|
|
96
|
+
|
|
97
|
+
git worktree add "$caminho" -b "$NOME_DA_BRANCH"
|
|
98
|
+
cd "$caminho"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Sandbox fallback:** Se `git worktree add` falhar com erro de permissão (negação do sandbox), informe que o sandbox bloqueou a criação do worktree e que você está trabalhando no diretório atual. Então execute setup e testes de baseline no lugar.
|
|
102
|
+
|
|
103
|
+
## Passo 2: Configuração do Projeto
|
|
104
|
+
|
|
105
|
+
Auto-detecte e execute o setup apropriado:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Node.js
|
|
109
|
+
if [ -f package.json ]; then npm install; fi
|
|
110
|
+
|
|
111
|
+
# Rust
|
|
112
|
+
if [ -f Cargo.toml ]; then cargo build; fi
|
|
113
|
+
|
|
114
|
+
# Python
|
|
115
|
+
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
|
116
|
+
if [ -f pyproject.toml ]; then poetry install; fi
|
|
117
|
+
|
|
118
|
+
# Go
|
|
119
|
+
if [ -f go.mod ]; then go mod download; fi
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Passo 3: Verificar Baseline Limpo
|
|
123
|
+
|
|
124
|
+
Execute testes para garantir que o workspace começa limpo:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# Use o comando apropriado para o projeto
|
|
128
|
+
npm test / cargo test / pytest / go test ./...
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Se os testes falharem:** Reporte as falhas, pergunte se deve prosseguir ou investigar.
|
|
132
|
+
|
|
133
|
+
**Se os testes passarem:** Reporte pronto.
|
|
134
|
+
|
|
135
|
+
### Relatório
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
Worktree pronto em <caminho-completo>
|
|
139
|
+
Testes passando (<N> testes, 0 falhas)
|
|
140
|
+
Pronto para implementar <nome-da-feature>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Tabela de Referência Rápida
|
|
144
|
+
|
|
145
|
+
| Situação | Ação |
|
|
146
|
+
|----------|------|
|
|
147
|
+
| Já em worktree vinculado | Pule criação (Passo 0) |
|
|
148
|
+
| Em submodule | Trate como repositório normal (guarda do Passo 0) |
|
|
149
|
+
| Ferramenta nativa de worktree disponível | Use (Passo 1a) |
|
|
150
|
+
| Sem ferramenta nativa | Fallback git worktree (Passo 1b) |
|
|
151
|
+
| `.worktrees/` existe | Use (verifique se ignorado) |
|
|
152
|
+
| `worktrees/` existe | Use (verifique se ignorado) |
|
|
153
|
+
| Ambos existem | Use `.worktrees/` |
|
|
154
|
+
| Nenhum existe | Verifique instruções, depois padrão `.worktrees/` |
|
|
155
|
+
| Diretório não ignorado | Adicione ao .gitignore + commit |
|
|
156
|
+
| Erro de permissão ao criar | Sandbox fallback, trabalhe no lugar |
|
|
157
|
+
| Testes falham no baseline | Reporte falhas + pergunte |
|
|
158
|
+
| Sem package.json/Cargo.toml | Pule instalação de dependências |
|
|
159
|
+
|
|
160
|
+
## Erros Comuns
|
|
161
|
+
|
|
162
|
+
### Lutando contra o harness
|
|
163
|
+
|
|
164
|
+
- **Problema:** Usar `git worktree add` quando a plataforma já oferece isolamento
|
|
165
|
+
- **Correção:** Passo 0 detecta isolamento existente. Passo 1a delega para ferramentas nativas.
|
|
166
|
+
|
|
167
|
+
### Pulando detecção
|
|
168
|
+
|
|
169
|
+
- **Problema:** Criar worktree aninhado dentro de um worktree existente
|
|
170
|
+
- **Correção:** Sempre execute o Passo 0 antes de criar qualquer coisa
|
|
171
|
+
|
|
172
|
+
### Pulando verificação de ignorado
|
|
173
|
+
|
|
174
|
+
- **Problema:** Conteúdo do worktree fica rastreado, poluindo git status
|
|
175
|
+
- **Correção:** Sempre use `git check-ignore` antes de criar worktree local do projeto
|
|
176
|
+
|
|
177
|
+
### Assumindo localização do diretório
|
|
178
|
+
|
|
179
|
+
- **Problema:** Cria inconsistência, viola convenções do projeto
|
|
180
|
+
- **Correção:** Siga prioridade: instruções explícitas > diretório local existente do projeto > padrão
|
|
181
|
+
|
|
182
|
+
### Prosseguindo com testes falhando
|
|
183
|
+
|
|
184
|
+
- **Problema:** Não é possível distinguir novos bugs de problemas pré-existentes
|
|
185
|
+
- **Correção:** Reporte falhas, obtenha permissão explícita para prosseguir
|
|
186
|
+
|
|
187
|
+
## Bandeiras Vermelhas
|
|
188
|
+
|
|
189
|
+
**Nunca:**
|
|
190
|
+
- Crie worktree quando o Passo 0 detecta isolamento existente
|
|
191
|
+
- Use `git worktree add` quando você tem ferramenta nativa de worktree (ex.: `EnterWorktree`). Este é o erro #1 — se você tem, use-a.
|
|
192
|
+
- Pule o Passo 1a indo direto para comandos git do Passo 1b
|
|
193
|
+
- Crie worktree sem verificar se o diretório está ignorado (local do projeto)
|
|
194
|
+
- Pule verificação de baseline de testes
|
|
195
|
+
- Prossiga com testes falhando sem perguntar
|
|
196
|
+
|
|
197
|
+
**Sempre:**
|
|
198
|
+
- Execute detecção do Passo 0 primeiro
|
|
199
|
+
- Prefira ferramentas nativas sobre fallback git
|
|
200
|
+
- Siga prioridade de diretório: instruções explícitas > diretório local existente do projeto > padrão
|
|
201
|
+
- Verifique se o diretório está ignorado para diretórios locais do projeto
|
|
202
|
+
- Auto-detecte e execute setup do projeto
|
|
203
|
+
- Verifique baseline limpo de testes
|