@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.
Files changed (136) hide show
  1. package/dist/chat.d.ts +1 -1
  2. package/dist/chat.js +166 -120
  3. package/dist/chat.js.map +1 -1
  4. package/dist/completion.d.ts +2 -0
  5. package/dist/completion.js +379 -0
  6. package/dist/completion.js.map +1 -0
  7. package/dist/config-validation.d.ts +10 -0
  8. package/dist/config-validation.js +101 -0
  9. package/dist/config-validation.js.map +1 -0
  10. package/dist/config.d.ts +9 -3
  11. package/dist/config.js +23 -11
  12. package/dist/config.js.map +1 -1
  13. package/dist/doctor.d.ts +18 -0
  14. package/dist/doctor.js +409 -0
  15. package/dist/doctor.js.map +1 -0
  16. package/dist/errors.d.ts +22 -0
  17. package/dist/errors.js +60 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.js +304 -119
  20. package/dist/index.js.map +1 -1
  21. package/dist/input.d.ts +43 -0
  22. package/dist/input.js +288 -0
  23. package/dist/input.js.map +1 -0
  24. package/dist/llm/factory.d.ts +5 -0
  25. package/dist/llm/factory.js +54 -0
  26. package/dist/llm/factory.js.map +1 -0
  27. package/dist/llm/index.d.ts +9 -0
  28. package/dist/llm/index.js +11 -0
  29. package/dist/llm/index.js.map +1 -0
  30. package/dist/llm/provider.d.ts +27 -0
  31. package/dist/llm/provider.js +98 -0
  32. package/dist/llm/provider.js.map +1 -0
  33. package/dist/llm/providers/anthropic.d.ts +23 -0
  34. package/dist/llm/providers/anthropic.js +198 -0
  35. package/dist/llm/providers/anthropic.js.map +1 -0
  36. package/dist/llm/providers/google.d.ts +31 -0
  37. package/dist/llm/providers/google.js +190 -0
  38. package/dist/llm/providers/google.js.map +1 -0
  39. package/dist/llm/providers/ollama.d.ts +21 -0
  40. package/dist/llm/providers/ollama.js +157 -0
  41. package/dist/llm/providers/ollama.js.map +1 -0
  42. package/dist/llm/providers/openai-compatible.d.ts +22 -0
  43. package/dist/llm/providers/openai-compatible.js +175 -0
  44. package/dist/llm/providers/openai-compatible.js.map +1 -0
  45. package/dist/llm/providers/openai.d.ts +20 -0
  46. package/dist/llm/providers/openai.js +167 -0
  47. package/dist/llm/providers/openai.js.map +1 -0
  48. package/dist/llm/registry.d.ts +19 -0
  49. package/dist/llm/registry.js +421 -0
  50. package/dist/llm/registry.js.map +1 -0
  51. package/dist/llm/types.d.ts +174 -0
  52. package/dist/llm/types.js +3 -0
  53. package/dist/llm/types.js.map +1 -0
  54. package/dist/login.d.ts +1 -1
  55. package/dist/login.js +14 -14
  56. package/dist/login.js.map +1 -1
  57. package/dist/mcp/client.d.ts +36 -0
  58. package/dist/mcp/client.js +199 -0
  59. package/dist/mcp/client.js.map +1 -0
  60. package/dist/mcp/config.d.ts +10 -0
  61. package/dist/mcp/config.js +43 -0
  62. package/dist/mcp/config.js.map +1 -0
  63. package/dist/mcp/index.d.ts +4 -0
  64. package/dist/mcp/index.js +6 -0
  65. package/dist/mcp/index.js.map +1 -0
  66. package/dist/mcp/types.d.ts +104 -0
  67. package/dist/mcp/types.js +3 -0
  68. package/dist/mcp/types.js.map +1 -0
  69. package/dist/model.d.ts +3 -14
  70. package/dist/model.js +131 -91
  71. package/dist/model.js.map +1 -1
  72. package/dist/ollama.d.ts +10 -0
  73. package/dist/ollama.js +11 -0
  74. package/dist/ollama.js.map +1 -0
  75. package/dist/prompts.d.ts +34 -8
  76. package/dist/prompts.js +186 -8
  77. package/dist/prompts.js.map +1 -1
  78. package/dist/repomap.d.ts +37 -0
  79. package/dist/repomap.js +431 -0
  80. package/dist/repomap.js.map +1 -0
  81. package/dist/skills/index.d.ts +3 -0
  82. package/dist/skills/index.js +5 -0
  83. package/dist/skills/index.js.map +1 -0
  84. package/dist/skills/registry.d.ts +16 -0
  85. package/dist/skills/registry.js +128 -0
  86. package/dist/skills/registry.js.map +1 -0
  87. package/dist/skills/types.d.ts +48 -0
  88. package/dist/skills/types.js +3 -0
  89. package/dist/skills/types.js.map +1 -0
  90. package/dist/statusline.d.ts +21 -0
  91. package/dist/statusline.js +68 -0
  92. package/dist/statusline.js.map +1 -0
  93. package/dist/streaming.d.ts +25 -0
  94. package/dist/streaming.js +91 -0
  95. package/dist/streaming.js.map +1 -0
  96. package/dist/task.d.ts +9 -1
  97. package/dist/task.js +21 -0
  98. package/dist/task.js.map +1 -1
  99. package/dist/template-engine.d.ts +19 -0
  100. package/dist/template-engine.js +187 -0
  101. package/dist/template-engine.js.map +1 -0
  102. package/dist/template-registry.d.ts +36 -0
  103. package/dist/template-registry.js +294 -0
  104. package/dist/template-registry.js.map +1 -0
  105. package/dist/theme.d.ts +52 -0
  106. package/dist/theme.js +92 -0
  107. package/dist/theme.js.map +1 -0
  108. package/dist/tools/builtin.d.ts +11 -0
  109. package/dist/tools/builtin.js +491 -0
  110. package/dist/tools/builtin.js.map +1 -0
  111. package/dist/tools/index.d.ts +3 -0
  112. package/dist/tools/index.js +5 -0
  113. package/dist/tools/index.js.map +1 -0
  114. package/dist/tools/types.d.ts +186 -0
  115. package/dist/tools/types.js +29 -0
  116. package/dist/tools/types.js.map +1 -0
  117. package/dist/ui.js +34 -30
  118. package/dist/ui.js.map +1 -1
  119. package/dist/verbose.d.ts +20 -0
  120. package/dist/verbose.js +75 -0
  121. package/dist/verbose.js.map +1 -0
  122. package/package.json +12 -2
  123. package/templates/api-json/task.yaml +0 -2
  124. package/templates/coding/agent.md +39 -0
  125. package/templates/coding/agent.ts +83 -0
  126. package/templates/coding/task.yaml +36 -0
  127. package/templates/cron-digester/task.yaml +0 -2
  128. package/templates/harness/agent.md +43 -0
  129. package/templates/harness/harness.ts +145 -0
  130. package/templates/harness/task.yaml +4 -0
  131. package/templates/multi-agent/agent.ts +7 -8
  132. package/templates/multi-agent/task.yaml +1 -3
  133. package/templates/research/task.yaml +4 -0
  134. package/templates/support/task.yaml +0 -2
  135. package/templates/webhook-echo/task.yaml +0 -2
  136. package/templates/with-approval/task.yaml +0 -2
@@ -0,0 +1,48 @@
1
+ export interface Skill {
2
+ name: string;
3
+ description: string;
4
+ version: string;
5
+ author?: string;
6
+ homepage?: string;
7
+ dependencies?: string[];
8
+ tools?: string[];
9
+ commands?: string[];
10
+ onLoad?: (context: SkillContext) => Promise<void>;
11
+ onUnload?: (context: SkillContext) => Promise<void>;
12
+ }
13
+ export interface SkillContext {
14
+ cwd: string;
15
+ tools: Map<string, Tool>;
16
+ registerTool(name: string, tool: Tool): void;
17
+ unregisterTool(name: string): void;
18
+ getTool(name: string): Tool | undefined;
19
+ }
20
+ export interface Tool {
21
+ name: string;
22
+ description: string;
23
+ inputSchema: object;
24
+ execute: (params: unknown, context: SkillContext) => Promise<unknown>;
25
+ }
26
+ export interface SkillManifest {
27
+ name: string;
28
+ version: string;
29
+ description: string;
30
+ entry: string;
31
+ dependencies?: string[];
32
+ provides?: {
33
+ tools?: string[];
34
+ commands?: string[];
35
+ };
36
+ }
37
+ export interface SkillRegistry {
38
+ skills: Map<string, LoadedSkill>;
39
+ load(manifest: SkillManifest): Promise<LoadedSkill>;
40
+ unload(name: string): Promise<void>;
41
+ get(name: string): LoadedSkill | undefined;
42
+ list(): LoadedSkill[];
43
+ }
44
+ export interface LoadedSkill {
45
+ manifest: SkillManifest;
46
+ instance: Skill;
47
+ tools: Map<string, Tool>;
48
+ }
@@ -0,0 +1,3 @@
1
+ // types.ts — Skills types. Based on openclaude/src/skills/ + zero/internal/skills/*
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA,oFAAoF"}
@@ -0,0 +1,21 @@
1
+ export type StatusSegment = {
2
+ content: string;
3
+ color?: "red" | "green" | "blue" | "yellow" | "cyan" | "magenta" | "white" | "gray";
4
+ flex?: boolean;
5
+ };
6
+ export type StatusLineOptions = {
7
+ segments?: StatusSegment[];
8
+ separator?: string;
9
+ padding?: number;
10
+ };
11
+ export declare class StatusLine {
12
+ private segments;
13
+ private separator;
14
+ private padding;
15
+ constructor(options?: StatusLineOptions);
16
+ setSegments(segments: StatusSegment[]): void;
17
+ updateSegment(index: number, segment: StatusSegment): void;
18
+ render(): void;
19
+ private getColorFn;
20
+ }
21
+ export declare function buildDefaultStatusLine(model?: string, tokensIn?: number, tokensOut?: number, mode?: string, branch?: string): StatusSegment[];
@@ -0,0 +1,68 @@
1
+ // statusline.ts — Status line com segmentos, git branch, tokens formatados.
2
+ import { C, SYM, fmtTokens, sep } from "./theme.js";
3
+ export class StatusLine {
4
+ segments;
5
+ separator;
6
+ padding;
7
+ constructor(options = {}) {
8
+ this.segments = options.segments ?? [];
9
+ this.separator = options.separator ?? ` ${C.dim(SYM.pipe)} `;
10
+ this.padding = options.padding ?? 1;
11
+ }
12
+ setSegments(segments) {
13
+ this.segments = segments;
14
+ this.render();
15
+ }
16
+ updateSegment(index, segment) {
17
+ if (index < this.segments.length) {
18
+ this.segments[index] = segment;
19
+ this.render();
20
+ }
21
+ }
22
+ render() {
23
+ process.stdout.write("\r\x1B[K");
24
+ process.stdout.write(sep(40) + "\n");
25
+ const parts = [];
26
+ for (const seg of this.segments) {
27
+ const colorFn = this.getColorFn(seg.color);
28
+ parts.push(colorFn(seg.content));
29
+ }
30
+ const line = parts.join(this.separator);
31
+ const padded = " ".repeat(this.padding) + line;
32
+ process.stdout.write(padded + "\n");
33
+ }
34
+ getColorFn(color) {
35
+ switch (color) {
36
+ case "red": return C.blood;
37
+ case "green": return C.green;
38
+ case "blue": return C.cyan;
39
+ case "yellow": return C.yellow;
40
+ case "cyan": return C.gray;
41
+ case "magenta": return C.magenta;
42
+ case "white": return C.white;
43
+ case "gray": return C.dim;
44
+ default: return C.dim;
45
+ }
46
+ }
47
+ }
48
+ // --- Default status line builder ---
49
+ export function buildDefaultStatusLine(model, tokensIn, tokensOut, mode, branch) {
50
+ const segments = [];
51
+ if (model) {
52
+ segments.push({ content: model, color: "red" });
53
+ }
54
+ if (tokensIn !== undefined && tokensOut !== undefined) {
55
+ segments.push({
56
+ content: `${fmtTokens(tokensIn)}→${fmtTokens(tokensOut)} tok`,
57
+ color: "gray",
58
+ });
59
+ }
60
+ if (branch) {
61
+ segments.push({ content: branch, color: "gray" });
62
+ }
63
+ if (mode) {
64
+ segments.push({ content: mode, color: "cyan" });
65
+ }
66
+ return segments;
67
+ }
68
+ //# sourceMappingURL=statusline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline.js","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type StreamEvent = {
2
+ type: "token" | "done" | "error" | "tool";
3
+ content?: string;
4
+ tokensIn?: number;
5
+ tokensOut?: number;
6
+ error?: string;
7
+ };
8
+ export declare class StreamingDisplay {
9
+ private buffer;
10
+ private rendered;
11
+ private spinnerFrame;
12
+ private spinnerInterval;
13
+ private isStreaming;
14
+ start(): void;
15
+ handleEvent(event: StreamEvent): void;
16
+ private startSpinner;
17
+ private stopSpinner;
18
+ private renderIncremental;
19
+ private renderFinal;
20
+ private renderError;
21
+ private renderTool;
22
+ stop(): void;
23
+ getBuffer(): string;
24
+ clear(): void;
25
+ }
@@ -0,0 +1,91 @@
1
+ // streaming.ts — Streaming output display com spinner blood red e tool visualization.
2
+ import { C, SYM, fmtTokens } from "./theme.js";
3
+ export class StreamingDisplay {
4
+ buffer = "";
5
+ rendered = 0;
6
+ spinnerFrame = 0;
7
+ spinnerInterval = null;
8
+ isStreaming = false;
9
+ start() {
10
+ this.isStreaming = true;
11
+ this.buffer = "";
12
+ this.rendered = 0;
13
+ this.startSpinner();
14
+ }
15
+ handleEvent(event) {
16
+ switch (event.type) {
17
+ case "token":
18
+ if (event.content) {
19
+ this.buffer += event.content;
20
+ this.renderIncremental(event.content);
21
+ }
22
+ break;
23
+ case "done":
24
+ this.stop();
25
+ this.renderFinal(event.tokensIn, event.tokensOut);
26
+ break;
27
+ case "error":
28
+ this.stop();
29
+ this.renderError(event.error ?? "erro desconhecido");
30
+ break;
31
+ case "tool":
32
+ this.renderTool(event.content ?? "");
33
+ break;
34
+ }
35
+ }
36
+ startSpinner() {
37
+ const frames = ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"];
38
+ this.spinnerInterval = setInterval(() => {
39
+ if (!this.isStreaming)
40
+ return;
41
+ const frame = frames[this.spinnerFrame % frames.length];
42
+ process.stdout.write(`\r${C.blood(frame)} ${C.dim("gerando...")}`);
43
+ this.spinnerFrame++;
44
+ }, 100);
45
+ }
46
+ stopSpinner() {
47
+ if (this.spinnerInterval) {
48
+ clearInterval(this.spinnerInterval);
49
+ this.spinnerInterval = null;
50
+ }
51
+ }
52
+ renderIncremental(token) {
53
+ process.stdout.write("\r\x1B[K");
54
+ process.stdout.write(token);
55
+ }
56
+ renderFinal(tokensIn, tokensOut) {
57
+ this.stopSpinner();
58
+ process.stdout.write("\r\x1B[K");
59
+ if (tokensOut !== undefined) {
60
+ const inStr = tokensIn !== undefined ? fmtTokens(tokensIn) : "?";
61
+ process.stdout.write(C.dim(` ${inStr}→${fmtTokens(tokensOut)} tok\n`));
62
+ }
63
+ if (this.rendered < this.buffer.length) {
64
+ const remaining = this.buffer.slice(this.rendered);
65
+ process.stdout.write(remaining);
66
+ this.rendered = this.buffer.length;
67
+ }
68
+ process.stdout.write("\n");
69
+ }
70
+ renderError(error) {
71
+ this.stopSpinner();
72
+ process.stdout.write("\r\x1B[K");
73
+ process.stdout.write(`${C.blood(`${SYM.fail} erro: ${error}`)}\n`);
74
+ }
75
+ renderTool(content) {
76
+ this.stopSpinner();
77
+ process.stdout.write(`${C.gray(` ${SYM.gear} ${content}`)}\n`);
78
+ }
79
+ stop() {
80
+ this.isStreaming = false;
81
+ this.stopSpinner();
82
+ }
83
+ getBuffer() {
84
+ return this.buffer;
85
+ }
86
+ clear() {
87
+ this.buffer = "";
88
+ this.rendered = 0;
89
+ }
90
+ }
91
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}
package/dist/task.d.ts CHANGED
@@ -16,7 +16,7 @@ export declare class ExitError extends Error {
16
16
  export declare const MODES: readonly ["research", "build", "test", "review", "deploy"];
17
17
  export type TaskMode = (typeof MODES)[number];
18
18
  /** Skills built-in (docs embutidas nos templates; usuário pode criar custom). */
19
- export declare const SKILLS: readonly ["frontend", "react", "testing", "api", "security", "docs"];
19
+ export declare const SKILLS: readonly ["frontend", "react", "testing", "api", "security", "docs", "typescript", "refactoring"];
20
20
  export type TaskSkill = (typeof SKILLS)[number];
21
21
  /** Gate mecânico do `verify:` no task.yaml (0.13+): nome → comando shell. */
22
22
  export interface VerifyGate {
@@ -28,6 +28,12 @@ export interface VerifyConfig {
28
28
  timeoutMs: number;
29
29
  onFail: "fail" | "warn";
30
30
  }
31
+ /** Config do modo harness (loop local sem CP). */
32
+ export interface HarnessConfig {
33
+ loop: boolean;
34
+ maxTurns: number;
35
+ checkpointDir: string;
36
+ }
31
37
  export interface TaskManifest {
32
38
  name: string;
33
39
  description?: string;
@@ -41,6 +47,8 @@ export interface TaskManifest {
41
47
  mode: TaskMode;
42
48
  invokeTimeoutMs?: number;
43
49
  verify: VerifyConfig;
50
+ genesis?: string;
51
+ harness?: HarnessConfig;
44
52
  legacy: boolean;
45
53
  }
46
54
  export declare function loadTaskManifest(dir: string): Promise<TaskManifest>;
package/dist/task.js CHANGED
@@ -34,6 +34,8 @@ export const SKILLS = [
34
34
  "api",
35
35
  "security",
36
36
  "docs",
37
+ "typescript",
38
+ "refactoring",
37
39
  ];
38
40
  const MANIFESTS = ["task.yaml", "agent.yaml"];
39
41
  export async function loadTaskManifest(dir) {
@@ -89,6 +91,23 @@ export async function loadTaskManifest(dir) {
89
91
  skills.push(skill);
90
92
  }
91
93
  }
94
+ // genesis: prompt de personalidade (bloco multi-linha com | ou >)
95
+ const genesisMatch = raw.match(/^genesis:\s*[\|>]\s*\n((?:[ \t].*\n?)+)/m);
96
+ const genesis = genesisMatch?.[1]?.replace(/^[ \t]/gm, "").trim();
97
+ // harness: config do modo harness
98
+ const harness = (() => {
99
+ const harnessBlock = raw.match(/^harness:\s*\n((?:[ \t]+\S.*\n?)+)/m);
100
+ if (!harnessBlock?.[1])
101
+ return undefined;
102
+ const loop = harnessBlock[1].match(/^\s+loop:\s*(\S+)/m)?.[1];
103
+ const maxTurns = harnessBlock[1].match(/^\s+maxTurns:\s*(\d+)/m)?.[1];
104
+ const checkpointDir = harnessBlock[1].match(/^\s+checkpointDir:\s*(\S+)/m)?.[1];
105
+ return {
106
+ loop: loop?.toLowerCase() === "true",
107
+ maxTurns: maxTurns ? Number(maxTurns) : 10,
108
+ checkpointDir: checkpointDir ?? ".auton/checkpoints",
109
+ };
110
+ })();
92
111
  // verify: (0.13+) gates mecânicos executados antes do run.
93
112
  // Bloco: `verify:\n <nome>: "<cmd>"` + chaves opcionais timeout_ms/on-fail.
94
113
  const verify = { gates: [], timeoutMs: 120_000, onFail: "fail" };
@@ -122,6 +141,8 @@ export async function loadTaskManifest(dir) {
122
141
  mode,
123
142
  invokeTimeoutMs,
124
143
  verify,
144
+ genesis,
145
+ harness,
125
146
  legacy: source === "agent.yaml",
126
147
  };
127
148
  }
package/dist/task.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { TemplateSpec } from "./template-registry.js";
2
+ export interface RenderContext {
3
+ name: string;
4
+ [key: string]: unknown;
5
+ }
6
+ export interface ScaffoldResult {
7
+ files: string[];
8
+ manifest: Record<string, unknown>;
9
+ }
10
+ export declare function renderTemplate(spec: TemplateSpec, context: RenderContext, targetDir: string, options?: {
11
+ dryRun?: boolean;
12
+ overwrite?: boolean;
13
+ }): Promise<ScaffoldResult>;
14
+ export declare function validateVariables(spec: TemplateSpec, provided: Record<string, unknown>): {
15
+ valid: boolean;
16
+ missing: string[];
17
+ extra: string[];
18
+ };
19
+ export declare function promptVariables(spec: TemplateSpec, provided?: Record<string, unknown>): Promise<Record<string, unknown>>;
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Template Engine — renderiza templates com Handlebars
3
+ * Suporta: variáveis, conditionals, loops, partials
4
+ */
5
+ import { readFile, readdir, writeFile, mkdir, cp } from "node:fs/promises";
6
+ import { join, resolve, extname, basename, dirname } from "node:path";
7
+ import Handlebars from "handlebars";
8
+ async function collectTemplateFiles(templateDir) {
9
+ const files = [];
10
+ async function walk(dir, prefix = "") {
11
+ const entries = await readdir(dir, { withFileTypes: true });
12
+ for (const entry of entries) {
13
+ const fullPath = join(dir, entry.name);
14
+ const relPath = join(prefix, entry.name);
15
+ if (entry.isDirectory()) {
16
+ await walk(fullPath, relPath);
17
+ continue;
18
+ }
19
+ if (entry.name === "template.json")
20
+ continue;
21
+ const content = await readFile(fullPath, "utf8");
22
+ const isTemplate = [".hbs", ".handlebars", ".tmpl", ".yaml", ".yml", ".ts", ".js", ".md", ".json"].includes(extname(entry.name))
23
+ || content.includes("{{")
24
+ || entry.name === "task.yaml"
25
+ || entry.name === "package.json";
26
+ files.push({ path: relPath, content, isTemplate });
27
+ }
28
+ }
29
+ await walk(templateDir);
30
+ return files;
31
+ }
32
+ function createHandlebarsContext(ctx, spec) {
33
+ return {
34
+ ...ctx,
35
+ now: new Date().toISOString(),
36
+ year: new Date().getFullYear(),
37
+ template: {
38
+ id: spec.id,
39
+ name: spec.name,
40
+ description: spec.description,
41
+ category: spec.category,
42
+ defaultModel: spec.defaultModel,
43
+ defaultMode: spec.defaultMode,
44
+ skills: spec.skills,
45
+ verifyGates: spec.verifyGates,
46
+ hasGenesis: spec.hasGenesis,
47
+ },
48
+ };
49
+ }
50
+ function registerHelpers() {
51
+ Handlebars.registerHelper("eq", function (a, b, options) {
52
+ return a === b ? options.fn(this) : options.inverse(this);
53
+ });
54
+ Handlebars.registerHelper("unlessEq", function (a, b, options) {
55
+ return a !== b ? options.fn(this) : options.inverse(this);
56
+ });
57
+ Handlebars.registerHelper("includes", function (arr, item, options) {
58
+ return Array.isArray(arr) && arr.includes(item) ? options.fn(this) : options.inverse(this);
59
+ });
60
+ Handlebars.registerHelper("toUpperCase", (str) => str?.toUpperCase?.() ?? "");
61
+ Handlebars.registerHelper("toLowerCase", (str) => str?.toLowerCase?.() ?? "");
62
+ Handlebars.registerHelper("toKebabCase", (str) => str?.replace(/[^a-z0-9]+/gi, "-").toLowerCase() ?? "");
63
+ Handlebars.registerHelper("toPascalCase", (str) => str?.replace(/[-_\s]+(.)?/g, (_, c) => c?.toUpperCase() ?? "") ?? "");
64
+ Handlebars.registerHelper("default", (value, fallback) => value ?? fallback);
65
+ Handlebars.registerHelper("json", (obj) => JSON.stringify(obj, null, 2));
66
+ Handlebars.registerHelper("yaml", (obj) => {
67
+ if (Array.isArray(obj))
68
+ return obj.map(v => ` - ${v}`).join("\n");
69
+ if (typeof obj === "object" && obj !== null)
70
+ return JSON.stringify(obj, null, 2).replace(/^/gm, " ");
71
+ return String(obj);
72
+ });
73
+ }
74
+ registerHelpers();
75
+ export async function renderTemplate(spec, context, targetDir, options = {}) {
76
+ const files = await collectTemplateFiles(spec.templateDir);
77
+ const hbsContext = createHandlebarsContext(context, spec);
78
+ const created = [];
79
+ let manifest = {};
80
+ for (const tf of files) {
81
+ const targetPath = join(targetDir, tf.path);
82
+ let content;
83
+ if (tf.isTemplate) {
84
+ const template = Handlebars.compile(tf.content, { noEscape: true });
85
+ content = template(hbsContext);
86
+ }
87
+ else {
88
+ content = tf.content;
89
+ }
90
+ if (!options.dryRun) {
91
+ await mkdir(dirname(targetPath), { recursive: true });
92
+ await writeFile(targetPath, content);
93
+ }
94
+ created.push(tf.path);
95
+ if (basename(tf.path) === "task.yaml") {
96
+ try {
97
+ manifest = parseTaskYaml(content);
98
+ }
99
+ catch {
100
+ // ignora erro de parse
101
+ }
102
+ }
103
+ }
104
+ if (!options.dryRun && spec.skills.length > 0) {
105
+ await copyBuiltinSkills(targetDir, spec.skills);
106
+ }
107
+ return { files: created, manifest };
108
+ }
109
+ function parseTaskYaml(content) {
110
+ const result = {};
111
+ const lines = content.split("\n");
112
+ let currentKey = null;
113
+ let currentArray = null;
114
+ for (const line of lines) {
115
+ const trimmed = line.trim();
116
+ if (!trimmed || trimmed.startsWith("#"))
117
+ continue;
118
+ const kvMatch = line.match(/^(\S+):\s*(.*)$/);
119
+ if (kvMatch) {
120
+ const key = kvMatch[1];
121
+ const value = kvMatch[2];
122
+ if (key) {
123
+ if (value && (value.startsWith("|") || value.startsWith(">"))) {
124
+ currentKey = key;
125
+ currentArray = [];
126
+ result[key] = "";
127
+ }
128
+ else if (value) {
129
+ result[key] = value.replace(/^["']|["']$/g, "");
130
+ currentKey = null;
131
+ currentArray = null;
132
+ }
133
+ else {
134
+ currentKey = key;
135
+ currentArray = [];
136
+ result[key] = currentArray;
137
+ }
138
+ }
139
+ continue;
140
+ }
141
+ const arrMatch = line.match(/^\s*-\s*(.+)$/);
142
+ if (arrMatch && currentKey && currentArray !== null && arrMatch[1]) {
143
+ currentArray.push(arrMatch[1].replace(/^["']|["']$/g, ""));
144
+ continue;
145
+ }
146
+ if (currentKey && currentArray === null && line.match(/^\s+/)) {
147
+ const existing = result[currentKey];
148
+ result[currentKey] = (typeof existing === "string" ? existing + "\n" : "") + line.trimStart();
149
+ continue;
150
+ }
151
+ currentKey = null;
152
+ currentArray = null;
153
+ }
154
+ return result;
155
+ }
156
+ async function copyBuiltinSkills(targetDir, skillNames) {
157
+ const skillsSrc = join(resolve(import.meta.dirname), "../templates/skills");
158
+ const skillsDest = join(targetDir, "skills");
159
+ for (const skill of skillNames) {
160
+ const src = join(skillsSrc, skill, "SKILL.md");
161
+ const dest = join(skillsDest, skill, "SKILL.md");
162
+ try {
163
+ await mkdir(dirname(dest), { recursive: true });
164
+ await cp(src, dest);
165
+ }
166
+ catch {
167
+ // skill não existe — ignora
168
+ }
169
+ }
170
+ }
171
+ export function validateVariables(spec, provided) {
172
+ const required = spec.variables.filter(v => v.required).map(v => v.key);
173
+ const providedKeys = Object.keys(provided);
174
+ const missing = required.filter(k => !providedKeys.includes(k));
175
+ const extra = providedKeys.filter(k => !spec.variables.some(v => v.key === k));
176
+ return { valid: missing.length === 0, missing, extra };
177
+ }
178
+ export async function promptVariables(spec, provided = {}) {
179
+ const result = { ...provided };
180
+ for (const v of spec.variables) {
181
+ if (!(v.key in result) && v.default !== undefined) {
182
+ result[v.key] = v.default;
183
+ }
184
+ }
185
+ return result;
186
+ }
187
+ //# sourceMappingURL=template-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../src/template-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface TemplateVariable {
2
+ key: string;
3
+ label: string;
4
+ type: "string" | "select" | "boolean";
5
+ required: boolean;
6
+ default?: string;
7
+ options?: string[];
8
+ description?: string;
9
+ }
10
+ export interface TemplateSpec {
11
+ id: string;
12
+ name: string;
13
+ description: string;
14
+ category: "general" | "coding" | "ops" | "research" | "harness" | "custom";
15
+ entry: string;
16
+ defaultModel: string;
17
+ defaultMode: "build" | "research" | "test" | "review" | "deploy" | "harness";
18
+ skills: string[];
19
+ verifyGates: {
20
+ name: string;
21
+ cmd: string;
22
+ }[];
23
+ hasGenesis: boolean;
24
+ genesisPrompt?: string;
25
+ variables: TemplateVariable[];
26
+ source: "builtin" | "custom";
27
+ templateDir: string;
28
+ }
29
+ export interface TemplateRegistry {
30
+ list(): Promise<TemplateSpec[]>;
31
+ get(id: string): Promise<TemplateSpec | undefined>;
32
+ getByCategory(category: TemplateSpec["category"]): Promise<TemplateSpec[]>;
33
+ reload(): Promise<void>;
34
+ }
35
+ export declare function createTemplateRegistry(): Promise<TemplateRegistry>;
36
+ export declare function getTemplateRegistry(): Promise<TemplateRegistry>;