@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,186 @@
|
|
|
1
|
+
export interface ToolSchema<T> {
|
|
2
|
+
parse(input: unknown): T | undefined;
|
|
3
|
+
serialize(output: T): unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface ToolExecuteContext {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
}
|
|
9
|
+
export type ToolExecute<Params, Output> = (params: Params, context?: ToolExecuteContext) => Promise<ToolResult<Output>>;
|
|
10
|
+
export interface ToolResult<Output> {
|
|
11
|
+
data: Output;
|
|
12
|
+
newMessages?: unknown[];
|
|
13
|
+
contextModifier?: (context: ToolUseContext) => ToolUseContext;
|
|
14
|
+
mcpMeta?: {
|
|
15
|
+
_meta?: Record<string, unknown>;
|
|
16
|
+
structuredContent?: Record<string, unknown>;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface ToolUseContext {
|
|
20
|
+
abortController: AbortController;
|
|
21
|
+
getAppState(): unknown;
|
|
22
|
+
setAppState(f: (prev: unknown) => unknown): void;
|
|
23
|
+
options: {
|
|
24
|
+
commands: unknown[];
|
|
25
|
+
debug: boolean;
|
|
26
|
+
mainLoopModel: string;
|
|
27
|
+
tools: Tool[];
|
|
28
|
+
verbose: boolean;
|
|
29
|
+
mcpClients: unknown[];
|
|
30
|
+
isNonInteractiveSession: boolean;
|
|
31
|
+
maxBudgetUsd?: number;
|
|
32
|
+
customSystemPrompt?: string;
|
|
33
|
+
appendSystemPrompt?: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface Tool<Params = unknown, Output = unknown, ProgressData = unknown> {
|
|
37
|
+
name: string;
|
|
38
|
+
aliases?: string[];
|
|
39
|
+
searchHint?: string;
|
|
40
|
+
description: string;
|
|
41
|
+
inputSchema: ToolSchema<Params>;
|
|
42
|
+
outputSchema?: ToolSchema<Output>;
|
|
43
|
+
execute?: ToolExecute<Params, Output>;
|
|
44
|
+
isEnabled(): boolean;
|
|
45
|
+
isConcurrencySafe(params: Params): boolean;
|
|
46
|
+
isReadOnly(params: Params): boolean;
|
|
47
|
+
isDestructive?(params: Params): boolean;
|
|
48
|
+
interruptBehavior?(): "cancel" | "block";
|
|
49
|
+
isSearchOrReadCommand?(params: Params): {
|
|
50
|
+
isSearch: boolean;
|
|
51
|
+
isRead: boolean;
|
|
52
|
+
isList?: boolean;
|
|
53
|
+
};
|
|
54
|
+
isOpenWorld?(params: Params): boolean;
|
|
55
|
+
requiresUserInteraction?(): boolean;
|
|
56
|
+
shouldDefer?: boolean;
|
|
57
|
+
alwaysLoad?: boolean;
|
|
58
|
+
maxResultSizeChars: number;
|
|
59
|
+
strict?: boolean;
|
|
60
|
+
renderToolUseMessage(input: Partial<Params>, options: {
|
|
61
|
+
theme: string;
|
|
62
|
+
verbose: boolean;
|
|
63
|
+
commands?: unknown[];
|
|
64
|
+
}): string;
|
|
65
|
+
renderToolResultMessage(content: Output, progressMessages: ProgressMessage<ProgressData>[], options: {
|
|
66
|
+
style?: "condensed";
|
|
67
|
+
theme: string;
|
|
68
|
+
tools: Tool[];
|
|
69
|
+
verbose: boolean;
|
|
70
|
+
isTranscriptMode?: boolean;
|
|
71
|
+
isBriefOnly?: boolean;
|
|
72
|
+
input?: unknown;
|
|
73
|
+
}): string;
|
|
74
|
+
extractSearchText?(output: Output): string;
|
|
75
|
+
isResultTruncated?(output: Output): boolean;
|
|
76
|
+
getToolUseSummary?(input: Partial<Params>): string | null;
|
|
77
|
+
getActivityDescription?(input: Partial<Params>): string | null;
|
|
78
|
+
toAutoClassifierInput(params: Params): unknown;
|
|
79
|
+
userFacingName(input: Partial<Params>): string;
|
|
80
|
+
userFacingNameBackgroundColor?(input: Partial<Params>): string | undefined;
|
|
81
|
+
validateInput?(params: Params, context: ToolUseContext): Promise<ValidationResult>;
|
|
82
|
+
checkPermissions(params: Params, context: ToolUseContext): Promise<PermissionResult>;
|
|
83
|
+
getPath?(params: Params): string;
|
|
84
|
+
preparePermissionMatcher?(params: Params): Promise<(pattern: string) => boolean>;
|
|
85
|
+
prompt(options: {
|
|
86
|
+
getToolPermissionContext: () => Promise<ToolPermissionContext>;
|
|
87
|
+
tools: Tool[];
|
|
88
|
+
}): Promise<string>;
|
|
89
|
+
renderToolUseProgressMessage?(progressMessages: ProgressMessage<ProgressData>[], options: {
|
|
90
|
+
tools: Tool[];
|
|
91
|
+
verbose: boolean;
|
|
92
|
+
terminalSize?: {
|
|
93
|
+
columns: number;
|
|
94
|
+
rows: number;
|
|
95
|
+
};
|
|
96
|
+
inProgressToolCallCount?: number;
|
|
97
|
+
isTranscriptMode?: boolean;
|
|
98
|
+
}): string;
|
|
99
|
+
renderToolUseQueuedMessage?(): string;
|
|
100
|
+
renderToolUseRejectedMessage?(input: Params, options: {
|
|
101
|
+
columns: number;
|
|
102
|
+
messages: unknown[];
|
|
103
|
+
style?: "condensed";
|
|
104
|
+
theme: string;
|
|
105
|
+
tools: Tool[];
|
|
106
|
+
verbose: boolean;
|
|
107
|
+
progressMessages: ProgressMessage<ProgressData>[];
|
|
108
|
+
isTranscriptMode?: boolean;
|
|
109
|
+
}): string;
|
|
110
|
+
renderToolUseErrorMessage?(result: unknown, options: {
|
|
111
|
+
progressMessages: ProgressMessage<ProgressData>[];
|
|
112
|
+
tools: Tool[];
|
|
113
|
+
verbose: boolean;
|
|
114
|
+
isTranscriptMode?: boolean;
|
|
115
|
+
}): string;
|
|
116
|
+
renderGroupedToolUse?(toolUses: Array<{
|
|
117
|
+
param: unknown;
|
|
118
|
+
isResolved: boolean;
|
|
119
|
+
isError: boolean;
|
|
120
|
+
isInProgress: boolean;
|
|
121
|
+
progressMessages: ProgressMessage<ProgressData>[];
|
|
122
|
+
result?: {
|
|
123
|
+
param: unknown;
|
|
124
|
+
output: unknown;
|
|
125
|
+
};
|
|
126
|
+
}>, options: {
|
|
127
|
+
shouldAnimate: boolean;
|
|
128
|
+
tools: Tool[];
|
|
129
|
+
}): string | null;
|
|
130
|
+
}
|
|
131
|
+
export interface ToolDef<Params = unknown, Output = unknown, ProgressData = unknown> extends Omit<Tool<Params, Output, ProgressData>, "isEnabled" | "isConcurrencySafe" | "isReadOnly" | "isDestructive" | "checkPermissions" | "toAutoClassifierInput" | "userFacingName"> {
|
|
132
|
+
isEnabled?: () => boolean;
|
|
133
|
+
isConcurrencySafe?: (params: Params) => boolean;
|
|
134
|
+
isReadOnly?: (params: Params) => boolean;
|
|
135
|
+
isDestructive?: (params: Params) => boolean;
|
|
136
|
+
checkPermissions?: (params: Params, context: ToolUseContext) => Promise<PermissionResult>;
|
|
137
|
+
toAutoClassifierInput?: (params: Params) => unknown;
|
|
138
|
+
userFacingName?: (input: Partial<Params>) => string;
|
|
139
|
+
}
|
|
140
|
+
export interface ValidationResult {
|
|
141
|
+
result: boolean;
|
|
142
|
+
message?: string;
|
|
143
|
+
errorCode?: number;
|
|
144
|
+
}
|
|
145
|
+
export interface PermissionResult {
|
|
146
|
+
behavior: "allow" | "deny" | "ask";
|
|
147
|
+
updatedInput?: unknown;
|
|
148
|
+
message?: string;
|
|
149
|
+
}
|
|
150
|
+
export interface ToolPermissionContext {
|
|
151
|
+
mode: "default" | "bypass" | "ask";
|
|
152
|
+
additionalWorkingDirectories: Map<string, unknown>;
|
|
153
|
+
alwaysAllowRules: Record<string, unknown>;
|
|
154
|
+
alwaysDenyRules: Record<string, unknown>;
|
|
155
|
+
alwaysAskRules: Record<string, unknown>;
|
|
156
|
+
isBypassPermissionsModeAvailable: boolean;
|
|
157
|
+
shouldAvoidPermissionPrompts?: boolean;
|
|
158
|
+
awaitAutomatedChecksBeforeDialog?: boolean;
|
|
159
|
+
}
|
|
160
|
+
export interface ProgressMessage<ProgressData = unknown> {
|
|
161
|
+
id: string;
|
|
162
|
+
toolUseId: string;
|
|
163
|
+
data: ProgressData;
|
|
164
|
+
timestamp: number;
|
|
165
|
+
}
|
|
166
|
+
export interface ToolProgress<ProgressData = unknown> {
|
|
167
|
+
toolUseId: string;
|
|
168
|
+
data: ProgressData;
|
|
169
|
+
}
|
|
170
|
+
export type Tools = readonly Tool[];
|
|
171
|
+
export declare const TOOL_DEFAULTS: {
|
|
172
|
+
isEnabled: () => boolean;
|
|
173
|
+
isConcurrencySafe: () => boolean;
|
|
174
|
+
isReadOnly: () => boolean;
|
|
175
|
+
isDestructive: () => boolean;
|
|
176
|
+
checkPermissions: (_params: unknown, _ctx: ToolUseContext) => Promise<PermissionResult>;
|
|
177
|
+
toAutoClassifierInput: () => string;
|
|
178
|
+
userFacingName: (input: Partial<unknown>) => any;
|
|
179
|
+
prompt: () => Promise<string>;
|
|
180
|
+
};
|
|
181
|
+
export declare function buildTool<Params, Output, ProgressData>(def: ToolDef<Params, Output, ProgressData>): Tool<Params, Output, ProgressData>;
|
|
182
|
+
export declare function toDefinitions(tools: Tools): Array<{
|
|
183
|
+
name: string;
|
|
184
|
+
description: string;
|
|
185
|
+
parameters: object;
|
|
186
|
+
}>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// types.ts — Tool types. Based on opencode/packages/llm/src/tool.ts + openclaude/src/Tool.ts
|
|
2
|
+
export const TOOL_DEFAULTS = {
|
|
3
|
+
isEnabled: () => true,
|
|
4
|
+
isConcurrencySafe: () => false,
|
|
5
|
+
isReadOnly: () => false,
|
|
6
|
+
isDestructive: () => false,
|
|
7
|
+
checkPermissions: async (_params, _ctx) => ({
|
|
8
|
+
behavior: "allow",
|
|
9
|
+
updatedInput: _params,
|
|
10
|
+
}),
|
|
11
|
+
toAutoClassifierInput: () => "",
|
|
12
|
+
userFacingName: (input) => input?.name ?? "tool",
|
|
13
|
+
prompt: async () => "Confirm?",
|
|
14
|
+
};
|
|
15
|
+
export function buildTool(def) {
|
|
16
|
+
return {
|
|
17
|
+
...TOOL_DEFAULTS,
|
|
18
|
+
userFacingName: () => def.name,
|
|
19
|
+
...def,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function toDefinitions(tools) {
|
|
23
|
+
return tools.map((t) => ({
|
|
24
|
+
name: t.name,
|
|
25
|
+
description: t.description,
|
|
26
|
+
parameters: t.inputSchema,
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAsK7F,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;IACrB,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK;IACvB,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;IAC1B,gBAAgB,EAAE,KAAK,EAAE,OAAgB,EAAE,IAAoB,EAA6B,EAAE,CAAC,CAAC;QAC9F,QAAQ,EAAE,OAAO;QACjB,YAAY,EAAE,OAAO;KACtB,CAAC;IACF,qBAAqB,EAAE,GAAG,EAAE,CAAC,EAAE;IAC/B,cAAc,EAAE,CAAC,KAAuB,EAAE,EAAE,CAAE,KAAa,EAAE,IAAI,IAAI,MAAM;IAC3E,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU;CAC/B,CAAC;AAEF,MAAM,UAAU,SAAS,CACvB,GAA0C;IAE1C,OAAO;QACL,GAAG,aAAa;QAChB,cAAc,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI;QAC9B,GAAG,GAAG;KAC+B,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,UAAU,EAAE,CAAC,CAAC,WAAgC;KAC/C,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/ui.js
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
|
-
// ui.ts — camada de apresentação do CLI auton.
|
|
2
|
-
// Cores/badges/spinner/tabela/logo/boxes. Tudo respeita NO_COLOR e pipe (isTTY).
|
|
3
|
-
// Conteúdo do agente (payload de logs) nunca é colorido — só tags.
|
|
4
|
-
import pc from "picocolors";
|
|
5
1
|
import createSpinner from "ora";
|
|
6
|
-
import logSymbols from "log-symbols";
|
|
7
2
|
import stringWidth from "string-width";
|
|
8
3
|
import boxen from "boxen";
|
|
4
|
+
import { C, SYM, BOX } from "./theme.js";
|
|
9
5
|
export const isTTY = process.stdout.isTTY === true;
|
|
10
|
-
// --- badges
|
|
11
|
-
export const ok = (msg) =>
|
|
12
|
-
export const fail = (msg) =>
|
|
13
|
-
export const info = (msg) =>
|
|
14
|
-
export const dim = (msg) =>
|
|
15
|
-
export const bold = (msg) =>
|
|
16
|
-
export const url = (msg) =>
|
|
6
|
+
// --- badges ---
|
|
7
|
+
export const ok = (msg) => C.green(`${SYM.ok} ${msg}`);
|
|
8
|
+
export const fail = (msg) => C.blood(`${SYM.fail} ${msg}`);
|
|
9
|
+
export const info = (msg) => C.gray(`${SYM.info} ${msg}`);
|
|
10
|
+
export const dim = (msg) => C.dim(msg);
|
|
11
|
+
export const bold = (msg) => C.bold(msg);
|
|
12
|
+
export const url = (msg) => C.cyan(msg);
|
|
17
13
|
export function spinner(text) {
|
|
18
|
-
const s = createSpinner({ text, color: "
|
|
14
|
+
const s = createSpinner({ text, color: "red" });
|
|
19
15
|
if (isTTY)
|
|
20
16
|
s.start();
|
|
21
17
|
return {
|
|
@@ -29,7 +25,7 @@ export function spinner(text) {
|
|
|
29
25
|
},
|
|
30
26
|
};
|
|
31
27
|
}
|
|
32
|
-
// --- logo pixel art "AUTON"
|
|
28
|
+
// --- logo pixel art "AUTON" com gradiente blood red ---
|
|
33
29
|
const FONT = {
|
|
34
30
|
A: [
|
|
35
31
|
" █████╗ ",
|
|
@@ -81,7 +77,15 @@ export function logo() {
|
|
|
81
77
|
})
|
|
82
78
|
.join(" ")
|
|
83
79
|
.trimEnd());
|
|
84
|
-
|
|
80
|
+
// Blood red gradient: bright → normal → dim
|
|
81
|
+
return [
|
|
82
|
+
C.crimson(lines[0]),
|
|
83
|
+
C.crimson(lines[1]),
|
|
84
|
+
C.blood(lines[2]),
|
|
85
|
+
C.blood(lines[3]),
|
|
86
|
+
C.dark(lines[4]),
|
|
87
|
+
C.dark(lines[5]),
|
|
88
|
+
].join("\n");
|
|
85
89
|
}
|
|
86
90
|
// --- linha de log do agente: tag colorida, payload cru ---
|
|
87
91
|
export function tagLine(line) {
|
|
@@ -90,43 +94,43 @@ export function tagLine(line) {
|
|
|
90
94
|
return line;
|
|
91
95
|
const [tag, rest] = [m[1], m[2]];
|
|
92
96
|
const tagColor = tag.includes("error")
|
|
93
|
-
?
|
|
97
|
+
? C.blood
|
|
94
98
|
: tag.includes("info")
|
|
95
|
-
?
|
|
99
|
+
? C.gray
|
|
96
100
|
: tag.includes("runtime")
|
|
97
|
-
?
|
|
98
|
-
:
|
|
101
|
+
? C.yellow
|
|
102
|
+
: C.dim;
|
|
99
103
|
return `${tagColor(tag)} ${rest}`;
|
|
100
104
|
}
|
|
101
105
|
// --- status badge colorido ---
|
|
102
106
|
export function statusColor(s) {
|
|
103
107
|
if (s === "running")
|
|
104
|
-
return
|
|
108
|
+
return C.green(s);
|
|
105
109
|
if (s === "scheduled")
|
|
106
|
-
return
|
|
110
|
+
return C.gray(s);
|
|
107
111
|
if (s === "exited")
|
|
108
|
-
return
|
|
109
|
-
return
|
|
112
|
+
return C.blood(s);
|
|
113
|
+
return C.yellow(s);
|
|
110
114
|
}
|
|
111
|
-
// --- tabela alinhada com header bold
|
|
115
|
+
// --- tabela alinhada com header bold ---
|
|
112
116
|
export function table(headers, rows) {
|
|
113
117
|
const widths = headers.map((h, i) => Math.max(stringWidth(h), ...rows.map((r) => stringWidth(r[i] ?? ""))));
|
|
114
118
|
const fmt = (cells) => cells
|
|
115
119
|
.map((c, i) => c + " ".repeat(Math.max(0, widths[i] - stringWidth(c))))
|
|
116
120
|
.join(" ")
|
|
117
121
|
.trimEnd();
|
|
118
|
-
const head = fmt(headers.map((h, i) =>
|
|
122
|
+
const head = fmt(headers.map((h, i) => C.bold(h.padEnd(widths[i]))));
|
|
119
123
|
return [head, ...rows.map(fmt)].join("\n");
|
|
120
124
|
}
|
|
121
|
-
// --- caixa emoldurada (
|
|
125
|
+
// --- caixa emoldurada (vermelho) ---
|
|
122
126
|
export function box(title, lines) {
|
|
123
127
|
return boxen(lines.join("\n"), {
|
|
124
128
|
title,
|
|
125
129
|
titleAlignment: "left",
|
|
126
|
-
padding:
|
|
127
|
-
margin:
|
|
128
|
-
borderStyle:
|
|
129
|
-
borderColor:
|
|
130
|
+
padding: BOX.padding,
|
|
131
|
+
margin: BOX.margin,
|
|
132
|
+
borderStyle: BOX.borderStyle,
|
|
133
|
+
borderColor: BOX.borderColor,
|
|
130
134
|
});
|
|
131
135
|
}
|
|
132
136
|
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type LogLevel = "trace" | "debug" | "info" | "warn" | "error";
|
|
2
|
+
export interface LogEntry {
|
|
3
|
+
timestamp: string;
|
|
4
|
+
level: LogLevel;
|
|
5
|
+
message: string;
|
|
6
|
+
context?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface Logger {
|
|
9
|
+
trace: (message: string, context?: Record<string, unknown>) => void;
|
|
10
|
+
debug: (message: string, context?: Record<string, unknown>) => void;
|
|
11
|
+
info: (message: string, context?: Record<string, unknown>) => void;
|
|
12
|
+
warn: (message: string, context?: Record<string, unknown>) => void;
|
|
13
|
+
error: (message: string, context?: Record<string, unknown>) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function createLogger(verbose: boolean): Logger;
|
|
16
|
+
export declare function createUiLogger(verbose: boolean): Logger;
|
|
17
|
+
export declare function parseVerboseFlag(args: string[]): {
|
|
18
|
+
verbose: boolean;
|
|
19
|
+
remainingArgs: string[];
|
|
20
|
+
};
|
package/dist/verbose.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// verbose.ts — logger JSON lines com timestamp, level, message, context.
|
|
2
|
+
import { info, dim, fail } from "./ui.js";
|
|
3
|
+
const LEVEL_ORDER = ["trace", "debug", "info", "warn", "error"];
|
|
4
|
+
const MIN_LEVEL_INDEX = process.env.AUTON_VERBOSE === "1" ? 0 : 2; // trace/debug/info vs info/warn/error
|
|
5
|
+
function shouldLog(level) {
|
|
6
|
+
return LEVEL_ORDER.indexOf(level) >= MIN_LEVEL_INDEX;
|
|
7
|
+
}
|
|
8
|
+
function formatJson(entry) {
|
|
9
|
+
return JSON.stringify(entry);
|
|
10
|
+
}
|
|
11
|
+
function writeLine(line) {
|
|
12
|
+
console.error(line);
|
|
13
|
+
}
|
|
14
|
+
export function createLogger(verbose) {
|
|
15
|
+
const minIndex = verbose ? 0 : 2;
|
|
16
|
+
function log(level, message, context) {
|
|
17
|
+
if (LEVEL_ORDER.indexOf(level) < minIndex)
|
|
18
|
+
return;
|
|
19
|
+
const entry = {
|
|
20
|
+
timestamp: new Date().toISOString(),
|
|
21
|
+
level,
|
|
22
|
+
message,
|
|
23
|
+
context,
|
|
24
|
+
};
|
|
25
|
+
writeLine(formatJson(entry));
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
trace: (msg, ctx) => log("trace", msg, ctx),
|
|
29
|
+
debug: (msg, ctx) => log("debug", msg, ctx),
|
|
30
|
+
info: (msg, ctx) => log("info", msg, ctx),
|
|
31
|
+
warn: (msg, ctx) => log("warn", msg, ctx),
|
|
32
|
+
error: (msg, ctx) => log("error", msg, ctx),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function createUiLogger(verbose) {
|
|
36
|
+
const base = createLogger(verbose);
|
|
37
|
+
return {
|
|
38
|
+
trace: (msg, ctx) => {
|
|
39
|
+
base.trace(msg, ctx);
|
|
40
|
+
if (verbose)
|
|
41
|
+
console.error(dim(`[trace] ${msg}`), ctx ? dim(JSON.stringify(ctx)) : "");
|
|
42
|
+
},
|
|
43
|
+
debug: (msg, ctx) => {
|
|
44
|
+
base.debug(msg, ctx);
|
|
45
|
+
if (verbose)
|
|
46
|
+
console.error(dim(`[debug] ${msg}`), ctx ? dim(JSON.stringify(ctx)) : "");
|
|
47
|
+
},
|
|
48
|
+
info: (msg, ctx) => {
|
|
49
|
+
base.info(msg, ctx);
|
|
50
|
+
console.error(info(msg), ctx ? dim(JSON.stringify(ctx)) : "");
|
|
51
|
+
},
|
|
52
|
+
warn: (msg, ctx) => {
|
|
53
|
+
base.warn(msg, ctx);
|
|
54
|
+
console.error(dim(`⚠ ${msg}`), ctx ? dim(JSON.stringify(ctx)) : "");
|
|
55
|
+
},
|
|
56
|
+
error: (msg, ctx) => {
|
|
57
|
+
base.error(msg, ctx);
|
|
58
|
+
console.error(fail(msg), ctx ? dim(JSON.stringify(ctx)) : "");
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function parseVerboseFlag(args) {
|
|
63
|
+
const remainingArgs = [];
|
|
64
|
+
let verbose = process.env.AUTON_VERBOSE === "1";
|
|
65
|
+
for (const arg of args) {
|
|
66
|
+
if (arg === "--verbose" || arg === "-v") {
|
|
67
|
+
verbose = true;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
remainingArgs.push(arg);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return { verbose, remainingArgs };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=verbose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verbose.js","sourceRoot":"","sources":["../src/verbose.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autonsh/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "auton CLI. Run autonomous tasks in one command.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -13,6 +13,13 @@
|
|
|
13
13
|
"dev": "tsx src/index.ts",
|
|
14
14
|
"typecheck": "tsc --noEmit"
|
|
15
15
|
},
|
|
16
|
+
"exports": {
|
|
17
|
+
".": "./dist/index.js",
|
|
18
|
+
"./tools": "./dist/tools/index.js",
|
|
19
|
+
"./mcp": "./dist/mcp/index.js",
|
|
20
|
+
"./skills": "./dist/skills/index.js",
|
|
21
|
+
"./llm": "./dist/llm/index.js"
|
|
22
|
+
},
|
|
16
23
|
"devDependencies": {
|
|
17
24
|
"@types/node": "^20.10.0",
|
|
18
25
|
"tsx": "^4.7.0",
|
|
@@ -22,9 +29,12 @@
|
|
|
22
29
|
"@clack/prompts": "^1.7.0",
|
|
23
30
|
"boxen": "^8.0.1",
|
|
24
31
|
"cli-progress": "^3.12.0",
|
|
32
|
+
"handlebars": "^4.7.8",
|
|
25
33
|
"log-symbols": "^7.0.1",
|
|
34
|
+
"minimatch": "^10.2.6",
|
|
26
35
|
"ora": "^9.4.1",
|
|
27
36
|
"picocolors": "^1.1.1",
|
|
28
|
-
"string-width": "^8.2.2"
|
|
37
|
+
"string-width": "^8.2.2",
|
|
38
|
+
"zod": "^3.25.76"
|
|
29
39
|
}
|
|
30
40
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Coding Agent — Engenheiro TypeScript Sênior
|
|
2
|
+
|
|
3
|
+
Você refatora, testa, migra e corrige código TypeScript.
|
|
4
|
+
|
|
5
|
+
## Princípios Invioláveis
|
|
6
|
+
1. **Entenda antes de mudar** — leia, trace dependências, entenda o fluxo
|
|
7
|
+
2. **Mudanças atômicas** — um arquivo por vez, typecheck a cada passo
|
|
8
|
+
3. **Tipos estritos** — `strict: true`, `noImplicitAny`, `exactOptionalPropertyTypes`
|
|
9
|
+
4. **Testes obrigatórios** — unit + integration para lógica de negócio
|
|
10
|
+
5. **Sem breaking changes** — API pública só com migração + depreciação
|
|
11
|
+
6. **Performance consciente** — `const`, `readonly`, evite alocações
|
|
12
|
+
7. **Documentação "por que"** — JSDoc em exports, comentários de decisão
|
|
13
|
+
|
|
14
|
+
## Fluxo por Task
|
|
15
|
+
```
|
|
16
|
+
PLAN → analise impacto, liste arquivos, defina testes
|
|
17
|
+
IMPLEMENT → edite um arquivo, tsc --noEmit, commit mental
|
|
18
|
+
TEST → vitest run, coverage > 80%
|
|
19
|
+
VERIFY → goal atendido? gaps? evidência
|
|
20
|
+
CHECKPOINT→ salve diff, testes, coverage
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Ferramentas
|
|
24
|
+
- `ctx.tools.read(file)` — ler
|
|
25
|
+
- `ctx.tools.write(file, content)` — escrever
|
|
26
|
+
- `ctx.tools.patch(file, old, new)` — editar cirúrgico
|
|
27
|
+
- `ctx.tools.exec(cmd)` — rodar tsc, vitest, eslint
|
|
28
|
+
- `ctx.tools.list(dir)` — explorar
|
|
29
|
+
- `ctx.storage` — KV persistente
|
|
30
|
+
- `ctx.work.add(type, title, payload)` — findings/artifacts
|
|
31
|
+
|
|
32
|
+
## Resposta (JSON)
|
|
33
|
+
```json
|
|
34
|
+
{ "file": "src/auth.ts", "content": "...", "reason": "adicionar Zod schema" }
|
|
35
|
+
```
|
|
36
|
+
ou finalização:
|
|
37
|
+
```json
|
|
38
|
+
{ "done": true, "summary": "Refatorado auth.ts + 12 testes + OpenAPI atualizado" }
|
|
39
|
+
```
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, existsSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { agent, TASK_DONE_EVENT } from "@autonsh/runtime";
|
|
4
|
+
|
|
5
|
+
function readdirSyncSafe(dir: string): string[] {
|
|
6
|
+
try { return readdirSync(dir); } catch { return []; }
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function readFileSafe(file: string): string {
|
|
10
|
+
try { return readFileSync(file, "utf8"); } catch { return ""; }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function writeFileSafe(file: string, content: string): void {
|
|
14
|
+
writeFileSync(file, content, "utf8");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default agent(async (ctx) => {
|
|
18
|
+
const goal = ((ctx.input as { prompt?: string } | undefined)?.prompt ?? "").trim();
|
|
19
|
+
if (!goal) {
|
|
20
|
+
await ctx.events.emit(TASK_DONE_EVENT, { result: "goal vazio", evidence: {} });
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Carrega agent.md (genesis) + skills
|
|
25
|
+
const agentMd = readFileSafe("agent.md");
|
|
26
|
+
const skillDocs = readdirSyncSafe("skills")
|
|
27
|
+
.filter((d) => existsSync(join("skills", d, "SKILL.md")))
|
|
28
|
+
.map((d) => `# skill: ${d}\n${readFileSafe(join("skills", d, "SKILL.md"))}`)
|
|
29
|
+
.join("\n\n");
|
|
30
|
+
const systemPrompt = `${agentMd}\n\n${skillDocs}`;
|
|
31
|
+
|
|
32
|
+
await ctx.logger.info("task iniciada", { goal });
|
|
33
|
+
|
|
34
|
+
// 1. PLAN — analisa código, propõe plano
|
|
35
|
+
const plan = await ctx.llm.chat({
|
|
36
|
+
system: `Você é um engenheiro sênior TypeScript.\n${systemPrompt}\n\nAnalise o codebase e proponha um PLANO detalhado para: ${goal}\nListe: arquivos a tocar, testes a criar, riscos.`,
|
|
37
|
+
prompt: goal,
|
|
38
|
+
});
|
|
39
|
+
await ctx.logger.info("plano", { plan });
|
|
40
|
+
|
|
41
|
+
// 2. IMPLEMENT — executa mudanças arquivo a arquivo
|
|
42
|
+
// Para simplicidade: pede ao LLM para gerar os diffs/patches
|
|
43
|
+
const implement = await ctx.llm.chat({
|
|
44
|
+
system: `Execute o plano. Use ctx.tools para ler/escrever/editar arquivos.\nFaça UMA mudança por vez. Rode tsc --noEmit após cada arquivo.\nResponda JSON: { file, content, reason } ou { done: true, summary }`,
|
|
45
|
+
prompt: plan,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
let parsed: { file?: string; content?: string; reason?: string; done?: boolean; summary?: string };
|
|
49
|
+
try { parsed = JSON.parse(implement.trim()); } catch { parsed = { done: true, summary: implement }; }
|
|
50
|
+
|
|
51
|
+
if (!parsed.done && parsed.file && parsed.content) {
|
|
52
|
+
await ctx.tools.write(parsed.file, parsed.content);
|
|
53
|
+
await ctx.logger.info("arquivo escrito", { file: parsed.file, reason: parsed.reason });
|
|
54
|
+
|
|
55
|
+
// Typecheck incremental
|
|
56
|
+
const tc = await ctx.tools.exec("tsc --noEmit").catch((e) => e.message);
|
|
57
|
+
await ctx.logger.info("typecheck", { result: tc });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 3. TESTS — roda testes
|
|
61
|
+
const testResult = await ctx.tools.exec("vitest run --reporter=json").catch((e) => e.message);
|
|
62
|
+
await ctx.logger.info("testes", { result: testResult });
|
|
63
|
+
|
|
64
|
+
// 4. VERIFY — validação final
|
|
65
|
+
const verify = await ctx.llm.chat({
|
|
66
|
+
system: "Verifique: goal atendido? Testes passam? Typecheck limpo? Responda JSON: { pass: boolean, gaps: string[] }",
|
|
67
|
+
prompt: `Goal: ${goal}\nPlan: ${plan}\nTestes: ${testResult}`,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
let verified: { pass: boolean; gaps: string[] };
|
|
71
|
+
try { verified = JSON.parse(verify.trim()); } catch { verified = { pass: false, gaps: ["parse error"] }; }
|
|
72
|
+
|
|
73
|
+
await ctx.logger.info("verificacao", { pass: verified.pass, gaps: verified.gaps });
|
|
74
|
+
|
|
75
|
+
// Work context
|
|
76
|
+
await ctx.work.add("finding", "implementação", { goal, plan, verify: verified });
|
|
77
|
+
await ctx.work.add("artifact", "mudanças", { files: parsed.file ? [parsed.file] : [] });
|
|
78
|
+
|
|
79
|
+
await ctx.events.emit(TASK_DONE_EVENT, {
|
|
80
|
+
result: verified.pass ? "Goal atendido" : `Gaps: ${verified.gaps.join(", ")}`,
|
|
81
|
+
evidence: { plan, testResult, verify: verified, filesChanged: parsed.file ? [parsed.file] : [] },
|
|
82
|
+
});
|
|
83
|
+
});
|