@agentkitforge/core 0.1.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 (107) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/CLI.md +177 -0
  3. package/LICENSE +69 -0
  4. package/README.md +326 -0
  5. package/SECURITY.md +33 -0
  6. package/SPEC.md +159 -0
  7. package/VERSIONING.md +45 -0
  8. package/dist/adapters/claudeCode.d.ts +11 -0
  9. package/dist/adapters/claudeCode.js +120 -0
  10. package/dist/adapters/claudeCode.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +12 -0
  12. package/dist/adapters/codex.js +141 -0
  13. package/dist/adapters/codex.js.map +1 -0
  14. package/dist/app/exampleInputDocuments.d.ts +21 -0
  15. package/dist/app/exampleInputDocuments.js +24 -0
  16. package/dist/app/exampleInputDocuments.js.map +1 -0
  17. package/dist/app/inspect.d.ts +15 -0
  18. package/dist/app/inspect.js +96 -0
  19. package/dist/app/inspect.js.map +1 -0
  20. package/dist/app/loadAsDraft.d.ts +7 -0
  21. package/dist/app/loadAsDraft.js +148 -0
  22. package/dist/app/loadAsDraft.js.map +1 -0
  23. package/dist/app/summary.d.ts +17 -0
  24. package/dist/app/summary.js +89 -0
  25. package/dist/app/summary.js.map +1 -0
  26. package/dist/artifacts/naming.d.ts +8 -0
  27. package/dist/artifacts/naming.js +26 -0
  28. package/dist/artifacts/naming.js.map +1 -0
  29. package/dist/builder/draftRequest.d.ts +24 -0
  30. package/dist/builder/draftRequest.js +87 -0
  31. package/dist/builder/draftRequest.js.map +1 -0
  32. package/dist/builder/instructions.d.ts +1 -0
  33. package/dist/builder/instructions.js +30 -0
  34. package/dist/builder/instructions.js.map +1 -0
  35. package/dist/builder/revisionRequest.d.ts +24 -0
  36. package/dist/builder/revisionRequest.js +94 -0
  37. package/dist/builder/revisionRequest.js.map +1 -0
  38. package/dist/cli/index.d.ts +2 -0
  39. package/dist/cli/index.js +5 -0
  40. package/dist/cli/index.js.map +1 -0
  41. package/dist/cli/program.d.ts +2 -0
  42. package/dist/cli/program.js +273 -0
  43. package/dist/cli/program.js.map +1 -0
  44. package/dist/context/builder.d.ts +2 -0
  45. package/dist/context/builder.js +159 -0
  46. package/dist/context/builder.js.map +1 -0
  47. package/dist/context/types.d.ts +23 -0
  48. package/dist/context/types.js +2 -0
  49. package/dist/context/types.js.map +1 -0
  50. package/dist/domains/catalog.d.ts +7 -0
  51. package/dist/domains/catalog.js +45 -0
  52. package/dist/domains/catalog.js.map +1 -0
  53. package/dist/draft/render.d.ts +13 -0
  54. package/dist/draft/render.js +207 -0
  55. package/dist/draft/render.js.map +1 -0
  56. package/dist/draft/schema.d.ts +107 -0
  57. package/dist/draft/schema.js +78 -0
  58. package/dist/draft/schema.js.map +1 -0
  59. package/dist/draft/session.d.ts +56 -0
  60. package/dist/draft/session.js +115 -0
  61. package/dist/draft/session.js.map +1 -0
  62. package/dist/export/onefile.d.ts +1 -0
  63. package/dist/export/onefile.js +109 -0
  64. package/dist/export/onefile.js.map +1 -0
  65. package/dist/fs/safety.d.ts +26 -0
  66. package/dist/fs/safety.js +187 -0
  67. package/dist/fs/safety.js.map +1 -0
  68. package/dist/index.d.ts +45 -0
  69. package/dist/index.js +26 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/init/create.d.ts +14 -0
  72. package/dist/init/create.js +48 -0
  73. package/dist/init/create.js.map +1 -0
  74. package/dist/init/templates.d.ts +12 -0
  75. package/dist/init/templates.js +202 -0
  76. package/dist/init/templates.js.map +1 -0
  77. package/dist/package/packager.d.ts +5 -0
  78. package/dist/package/packager.js +30 -0
  79. package/dist/package/packager.js.map +1 -0
  80. package/dist/package/reader.d.ts +3 -0
  81. package/dist/package/reader.js +21 -0
  82. package/dist/package/reader.js.map +1 -0
  83. package/dist/prompts/prompts.d.ts +35 -0
  84. package/dist/prompts/prompts.js +206 -0
  85. package/dist/prompts/prompts.js.map +1 -0
  86. package/dist/prompts/schema.d.ts +71 -0
  87. package/dist/prompts/schema.js +46 -0
  88. package/dist/prompts/schema.js.map +1 -0
  89. package/dist/providers/catalog.d.ts +15 -0
  90. package/dist/providers/catalog.js +211 -0
  91. package/dist/providers/catalog.js.map +1 -0
  92. package/dist/providers/types.d.ts +30 -0
  93. package/dist/providers/types.js +2 -0
  94. package/dist/providers/types.js.map +1 -0
  95. package/dist/schema/agentkit.d.ts +54 -0
  96. package/dist/schema/agentkit.js +63 -0
  97. package/dist/schema/agentkit.js.map +1 -0
  98. package/dist/types.d.ts +69 -0
  99. package/dist/types.js +2 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/validation/skill.d.ts +3 -0
  102. package/dist/validation/skill.js +83 -0
  103. package/dist/validation/skill.js.map +1 -0
  104. package/dist/validation/validator.d.ts +2 -0
  105. package/dist/validation/validator.js +247 -0
  106. package/dist/validation/validator.js.map +1 -0
  107. package/package.json +57 -0
@@ -0,0 +1,109 @@
1
+ import { readdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { listPreparedPrompts } from "../prompts/prompts.js";
4
+ const TOP_LEVEL_FILES = ["START_HERE.md", "AGENTKIT.md"];
5
+ const OPTIONAL_DIRECTORIES = ["workflows", "policies", "templates"];
6
+ export async function exportOneFile(rootPath, outFile) {
7
+ const resolvedRoot = path.resolve(rootPath);
8
+ const sections = [];
9
+ for (const file of TOP_LEVEL_FILES) {
10
+ await appendFileSection(sections, resolvedRoot, file);
11
+ }
12
+ for (const skillFile of await listSkillFiles(path.join(resolvedRoot, "skills"))) {
13
+ await appendFileSection(sections, resolvedRoot, path.relative(resolvedRoot, skillFile));
14
+ }
15
+ for (const directory of OPTIONAL_DIRECTORIES) {
16
+ await appendDirectorySections(sections, resolvedRoot, directory);
17
+ }
18
+ await appendPreparedPromptSections(sections, resolvedRoot);
19
+ const resolvedOut = path.resolve(outFile);
20
+ await writeFile(resolvedOut, sections.join("\n\n"), "utf8");
21
+ return resolvedOut;
22
+ }
23
+ async function appendPreparedPromptSections(sections, rootPath) {
24
+ const prompts = await listPreparedPrompts(rootPath);
25
+ if (prompts.length === 0) {
26
+ return;
27
+ }
28
+ sections.push(`## Prepared Prompts\n\n${prompts.map(renderPromptSection).join("\n\n")}`);
29
+ }
30
+ function renderPromptSection(prompt) {
31
+ const inputs = prompt.inputs.length === 0
32
+ ? "None"
33
+ : prompt.inputs
34
+ .map((input) => `- ${input.id} (${input.type}${input.required ? ", required" : ", optional"}): ${input.label}`)
35
+ .join("\n");
36
+ return `### ${prompt.name}
37
+
38
+ ${prompt.description}
39
+
40
+ **Template**
41
+
42
+ \`\`\`text
43
+ ${prompt.template}
44
+ \`\`\`
45
+
46
+ **Inputs**
47
+
48
+ ${inputs}`;
49
+ }
50
+ async function appendDirectorySections(sections, rootPath, relativeDirectory) {
51
+ const directoryPath = path.join(rootPath, relativeDirectory);
52
+ if (!(await exists(directoryPath))) {
53
+ return;
54
+ }
55
+ for (const file of await listMarkdownFiles(directoryPath)) {
56
+ await appendFileSection(sections, rootPath, path.relative(rootPath, file));
57
+ }
58
+ }
59
+ async function appendFileSection(sections, rootPath, relativePath) {
60
+ const normalizedRelativePath = relativePath.replaceAll("\\", "/");
61
+ const content = await readFile(path.join(rootPath, relativePath), "utf8");
62
+ sections.push(`<!-- BEGIN ${normalizedRelativePath} -->\n\n${content.trim()}\n\n<!-- END ${normalizedRelativePath} -->`);
63
+ }
64
+ async function listSkillFiles(skillsRoot) {
65
+ if (!(await exists(skillsRoot))) {
66
+ return [];
67
+ }
68
+ const entries = await readdir(skillsRoot, { withFileTypes: true });
69
+ const skillFiles = [];
70
+ for (const entry of entries) {
71
+ if (entry.isDirectory()) {
72
+ const skillFile = path.join(skillsRoot, entry.name, "SKILL.md");
73
+ if (await exists(skillFile)) {
74
+ skillFiles.push(skillFile);
75
+ }
76
+ }
77
+ }
78
+ return skillFiles.sort();
79
+ }
80
+ async function listMarkdownFiles(rootPath) {
81
+ const entries = await readdir(rootPath, { withFileTypes: true });
82
+ const files = [];
83
+ for (const entry of entries) {
84
+ const entryPath = path.join(rootPath, entry.name);
85
+ if (entry.isDirectory()) {
86
+ files.push(...(await listMarkdownFiles(entryPath)));
87
+ }
88
+ else if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) {
89
+ files.push(entryPath);
90
+ }
91
+ }
92
+ return files.sort();
93
+ }
94
+ async function exists(filePath) {
95
+ try {
96
+ await readdir(filePath);
97
+ return true;
98
+ }
99
+ catch {
100
+ try {
101
+ await readFile(filePath);
102
+ return true;
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=onefile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onefile.js","sourceRoot":"","sources":["../../src/export/onefile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,eAAe,GAAG,CAAC,eAAe,EAAE,aAAa,CAAU,CAAC;AAClE,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAe;IACnE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,uBAAuB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,4BAA4B,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAE3D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,QAAkB,EAAE,QAAgB;IAC9E,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAsB;IACjD,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QACxB,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,MAAM,CAAC,MAAM;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;aAC9G,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpB,OAAO,OAAO,MAAM,CAAC,IAAI;;EAEzB,MAAM,CAAC,WAAW;;;;;EAKlB,MAAM,CAAC,QAAQ;;;;;EAKf,MAAM,EAAE,CAAC;AACX,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,QAAkB,EAClB,QAAgB,EAChB,iBAAyB;IAEzB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1D,MAAM,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,QAAkB,EAClB,QAAgB,EAChB,YAAoB;IAEpB,MAAM,sBAAsB,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,cAAc,sBAAsB,WAAW,OAAO,CAAC,IAAI,EAAE,gBAAgB,sBAAsB,MAAM,CAAC,CAAC;AAC3H,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,UAAkB;IAC9C,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAChE,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface SafeTraversalOptions {
2
+ maxFiles?: number;
3
+ maxBytes?: number;
4
+ excludeDirs?: string[];
5
+ excludePaths?: string[];
6
+ onWarning?: (warning: string) => void;
7
+ }
8
+ export interface SafeFileEntry {
9
+ absolutePath: string;
10
+ relativePath: string;
11
+ size: number;
12
+ }
13
+ export declare const DEFAULT_MAX_FILES = 1000;
14
+ export declare const DEFAULT_MAX_BYTES: number;
15
+ export declare function assertSafeId(id: string, label?: string): void;
16
+ export declare function isSafeId(id: string): boolean;
17
+ export declare function sanitizePathSegment(value: string): string;
18
+ export declare function assertSafeRelativePath(relativePath: string): void;
19
+ export declare function resolveInside(root: string, relativePath: string): string;
20
+ export declare function assertSafeDirectoryForCleanup(targetPath: string): Promise<void>;
21
+ export declare function safeRemoveDirectoryContents(targetPath: string): Promise<void>;
22
+ export declare function assertSafeDestinationDirectory(destinationRoot: string): Promise<void>;
23
+ export declare function safeListFilesRecursive(root: string, options?: SafeTraversalOptions): Promise<SafeFileEntry[]>;
24
+ export declare function safeCopyDirectory(sourceRoot: string, destinationRoot: string, options?: SafeTraversalOptions): Promise<void>;
25
+ export declare function isInsideOrEqual(root: string, candidate: string): boolean;
26
+ export declare function normalizePath(input: string): string;
@@ -0,0 +1,187 @@
1
+ import { cp, lstat, mkdir, readdir, rm, stat } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ export const DEFAULT_MAX_FILES = 1000;
5
+ export const DEFAULT_MAX_BYTES = 25 * 1024 * 1024;
6
+ const DEFAULT_EXCLUDED_DIRS = new Set([".git", "node_modules", "dist", "build"]);
7
+ const DEFAULT_EXCLUDED_PATHS = ["exports/"];
8
+ export function assertSafeId(id, label = "id") {
9
+ if (!/^[a-z0-9][a-z0-9-]*$/.test(id)) {
10
+ throw new Error(`${label} must use lowercase letters, numbers, and hyphens`);
11
+ }
12
+ }
13
+ export function isSafeId(id) {
14
+ try {
15
+ assertSafeId(id);
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ export function sanitizePathSegment(value) {
23
+ const sanitized = value
24
+ .trim()
25
+ .toLowerCase()
26
+ .replace(/[^a-z0-9-]+/g, "-")
27
+ .replace(/-+/g, "-")
28
+ .replace(/^-+|-+$/g, "");
29
+ return sanitized || "agentkit";
30
+ }
31
+ export function assertSafeRelativePath(relativePath) {
32
+ if (!relativePath || relativePath.includes("\0")) {
33
+ throw new Error("Path must not be empty or contain null bytes");
34
+ }
35
+ if (path.isAbsolute(relativePath) || /^[a-zA-Z]:[\\/]/.test(relativePath)) {
36
+ throw new Error(`Path must be relative: ${relativePath}`);
37
+ }
38
+ const normalized = relativePath.replaceAll("\\", "/");
39
+ if (normalized.split("/").some((part) => part === "..")) {
40
+ throw new Error(`Path must not contain '..': ${relativePath}`);
41
+ }
42
+ }
43
+ export function resolveInside(root, relativePath) {
44
+ assertSafeRelativePath(relativePath);
45
+ const resolvedRoot = path.resolve(root);
46
+ const resolvedPath = path.resolve(resolvedRoot, relativePath);
47
+ if (!isInsideOrEqual(resolvedRoot, resolvedPath)) {
48
+ throw new Error(`Path escapes root: ${relativePath}`);
49
+ }
50
+ return resolvedPath;
51
+ }
52
+ export async function assertSafeDirectoryForCleanup(targetPath) {
53
+ if (!targetPath) {
54
+ throw new Error("Refusing to clean empty path");
55
+ }
56
+ const resolvedTarget = path.resolve(targetPath);
57
+ const parsed = path.parse(resolvedTarget);
58
+ const home = path.resolve(os.homedir());
59
+ const cwd = path.resolve(process.cwd());
60
+ const key = comparablePath(resolvedTarget);
61
+ if (key === comparablePath(parsed.root)) {
62
+ throw new Error(`Refusing to clean filesystem root: ${resolvedTarget}`);
63
+ }
64
+ if (key === comparablePath(home)) {
65
+ throw new Error(`Refusing to clean user home directory: ${resolvedTarget}`);
66
+ }
67
+ if (key === comparablePath(cwd)) {
68
+ throw new Error(`Refusing to clean current repository root: ${resolvedTarget}`);
69
+ }
70
+ const stats = await lstat(resolvedTarget);
71
+ if (!stats.isDirectory()) {
72
+ throw new Error(`Refusing to clean non-directory path: ${resolvedTarget}`);
73
+ }
74
+ if (stats.isSymbolicLink()) {
75
+ throw new Error(`Refusing to clean symbolic link: ${resolvedTarget}`);
76
+ }
77
+ }
78
+ export async function safeRemoveDirectoryContents(targetPath) {
79
+ await assertSafeDirectoryForCleanup(targetPath);
80
+ for (const entry of await readdir(targetPath)) {
81
+ const entryPath = path.join(targetPath, entry);
82
+ const entryStats = await lstat(entryPath);
83
+ await rm(entryPath, { recursive: !entryStats.isSymbolicLink(), force: true });
84
+ }
85
+ }
86
+ export async function assertSafeDestinationDirectory(destinationRoot) {
87
+ const resolved = path.resolve(destinationRoot);
88
+ const parsed = path.parse(resolved);
89
+ const home = path.resolve(os.homedir());
90
+ const key = comparablePath(resolved);
91
+ if (key === comparablePath(parsed.root)) {
92
+ throw new Error(`Refusing to use filesystem root: ${resolved}`);
93
+ }
94
+ if (key === comparablePath(home)) {
95
+ throw new Error(`Refusing to use user home directory: ${resolved}`);
96
+ }
97
+ if (await exists(resolved)) {
98
+ const stats = await lstat(resolved);
99
+ if (!stats.isDirectory()) {
100
+ throw new Error(`Refusing to use non-directory path: ${resolved}`);
101
+ }
102
+ if (stats.isSymbolicLink()) {
103
+ throw new Error(`Refusing to use symbolic link: ${resolved}`);
104
+ }
105
+ }
106
+ }
107
+ export async function safeListFilesRecursive(root, options = {}) {
108
+ const resolvedRoot = path.resolve(root);
109
+ const rootStats = await lstat(resolvedRoot);
110
+ if (rootStats.isSymbolicLink()) {
111
+ throw new Error(`Refusing to traverse symbolic link: ${resolvedRoot}`);
112
+ }
113
+ if (!rootStats.isDirectory()) {
114
+ throw new Error(`Refusing to traverse non-directory path: ${resolvedRoot}`);
115
+ }
116
+ const maxFiles = options.maxFiles ?? DEFAULT_MAX_FILES;
117
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
118
+ const excludedDirs = new Set([...DEFAULT_EXCLUDED_DIRS, ...(options.excludeDirs ?? [])]);
119
+ const excludedPaths = [...DEFAULT_EXCLUDED_PATHS, ...(options.excludePaths ?? [])];
120
+ const files = [];
121
+ let totalBytes = 0;
122
+ async function walk(directory) {
123
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
124
+ if (excludedDirs.has(entry.name)) {
125
+ continue;
126
+ }
127
+ const absolutePath = path.join(directory, entry.name);
128
+ const stats = await lstat(absolutePath);
129
+ const relativePath = normalizePath(path.relative(resolvedRoot, absolutePath));
130
+ if (excludedPaths.some((excluded) => relativePath === excluded || relativePath.startsWith(excluded))) {
131
+ continue;
132
+ }
133
+ if (stats.isSymbolicLink()) {
134
+ throw new Error(`Refusing to traverse symbolic link: ${relativePath}`);
135
+ }
136
+ if (stats.isDirectory()) {
137
+ await walk(absolutePath);
138
+ continue;
139
+ }
140
+ if (!stats.isFile()) {
141
+ continue;
142
+ }
143
+ files.push({ absolutePath, relativePath, size: stats.size });
144
+ totalBytes += stats.size;
145
+ if (files.length > maxFiles) {
146
+ throw new Error(`File count limit exceeded: ${files.length} > ${maxFiles}`);
147
+ }
148
+ if (totalBytes > maxBytes) {
149
+ throw new Error(`Total byte limit exceeded: ${totalBytes} > ${maxBytes}`);
150
+ }
151
+ }
152
+ }
153
+ await walk(resolvedRoot);
154
+ return files.sort((left, right) => left.relativePath.localeCompare(right.relativePath));
155
+ }
156
+ export async function safeCopyDirectory(sourceRoot, destinationRoot, options = {}) {
157
+ const source = path.resolve(sourceRoot);
158
+ const destination = path.resolve(destinationRoot);
159
+ const files = await safeListFilesRecursive(source, options);
160
+ await mkdir(destination, { recursive: true });
161
+ for (const file of files) {
162
+ const destinationFile = resolveInside(destination, file.relativePath);
163
+ await mkdir(path.dirname(destinationFile), { recursive: true });
164
+ await cp(file.absolutePath, destinationFile);
165
+ }
166
+ }
167
+ export function isInsideOrEqual(root, candidate) {
168
+ const relative = path.relative(path.resolve(root), path.resolve(candidate));
169
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
170
+ }
171
+ export function normalizePath(input) {
172
+ return input.replaceAll("\\", "/");
173
+ }
174
+ async function exists(filePath) {
175
+ try {
176
+ await stat(filePath);
177
+ return true;
178
+ }
179
+ catch {
180
+ return false;
181
+ }
182
+ }
183
+ function comparablePath(input) {
184
+ const normalized = path.resolve(input);
185
+ return process.platform === "win32" ? normalized.toLowerCase() : normalized;
186
+ }
187
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/fs/safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export { agentKitManifestSchema, agentKitSkillSchema } from "./schema/agentkit.js";
2
+ export { createAgentKitDraftRequest } from "./builder/draftRequest.js";
3
+ export { createAgentKitDraftRevisionRequest } from "./builder/revisionRequest.js";
4
+ export { inferExampleInputDocumentKind, isSupportedExampleInputDocument, summarizeExampleInputDocument } from "./app/exampleInputDocuments.js";
5
+ export { inspectAgentKitCandidate } from "./app/inspect.js";
6
+ export { getAgentKitSummary } from "./app/summary.js";
7
+ export { loadAgentKitAsDraft } from "./app/loadAsDraft.js";
8
+ export { createAgentKitBuilderInstructions } from "./builder/instructions.js";
9
+ export { exportAgentKitToClaudeCode } from "./adapters/claudeCode.js";
10
+ export { exportAgentKitToCodex } from "./adapters/codex.js";
11
+ export { buildAgentKitContext } from "./context/builder.js";
12
+ export { agentKitDraftSchema, exampleDraftSchema, policyDraftSchema, skillDraftSchema, templateDraftSchema } from "./draft/schema.js";
13
+ export { AgentKitDraftValidationError, renderAgentKitDraft } from "./draft/render.js";
14
+ export { addDraftRevision, agentKitDraftRevisionSchema, agentKitDraftSessionSchema, createDraftSession, getCurrentDraftRevision, restoreDraftRevision, validateDraftSession } from "./draft/session.js";
15
+ export { findMatchingDomains, getKnownDomains, knownDomains } from "./domains/catalog.js";
16
+ export { getDefaultOneFileName, getDefaultOutputName, getDefaultPackageName, sanitizeArtifactName } from "./artifacts/naming.js";
17
+ export { exportOneFile } from "./export/onefile.js";
18
+ export { createAgentKit } from "./init/create.js";
19
+ export { packageAgentKit } from "./package/packager.js";
20
+ export { aiProviderTypes, getDefaultModelForProvider, getKnownModelsForProvider, getProviderCapabilities, isApiKeyRequiredForProvider, isBaseUrlRequiredForProvider, modelCatalog, normalizeBaseUrl, providerSupportsStructuredJson, structuredOutputGuidance } from "./providers/catalog.js";
21
+ export { extractPromptVariables, findUnresolvedPromptVariables, getDefaultArtifactNames, getDefaultArtifactNamesForManifest, listPreparedPrompts, loadPreparedPrompt, renderPreparedPrompt, renderPreparedPromptWithValidation, validatePreparedPromptInputs } from "./prompts/prompts.js";
22
+ export { preparedPromptInputSchema, preparedPromptInputTypeSchema, preparedPromptOutputModeSchema, preparedPromptSchema } from "./prompts/schema.js";
23
+ export { readAgentKit, readYamlFile } from "./package/reader.js";
24
+ export { validateAgentKit } from "./validation/validator.js";
25
+ export { parseSkillMarkdown, validateSkillFile } from "./validation/skill.js";
26
+ export type { AgentKitTemplateName } from "./init/templates.js";
27
+ export type { CreateAgentKitOptions, CreateAgentKitResult } from "./init/create.js";
28
+ export type { PackageAgentKitOptions } from "./package/packager.js";
29
+ export type { AgentKitDraft, ExampleDraft, PolicyDraft, SkillDraft, TemplateDraft } from "./draft/schema.js";
30
+ export type { AgentKitDraftRequest, CreateAgentKitDraftRequestInput } from "./builder/draftRequest.js";
31
+ export type { ExampleInputDocument, ExampleInputDocumentKind, ExampleInputDocumentSummary } from "./app/exampleInputDocuments.js";
32
+ export type { AgentKitCandidateInspection } from "./app/inspect.js";
33
+ export type { AgentKitSummary } from "./app/summary.js";
34
+ export type { LoadAgentKitAsDraftResult } from "./app/loadAsDraft.js";
35
+ export type { ArtifactNameMetadata } from "./artifacts/naming.js";
36
+ export type { AgentKitDraftRevisionRequest, CreateAgentKitDraftRevisionRequestInput } from "./builder/revisionRequest.js";
37
+ export type { AddDraftRevisionInput, AgentKitDraftChangeRequest, AgentKitDraftRevision, AgentKitDraftSession, CreateDraftSessionInput } from "./draft/session.js";
38
+ export type { AgentKitContextBuildMode, AgentKitContextRequest, AgentKitContextResult, AgentKitContextTarget } from "./context/types.js";
39
+ export type { ClaudeCodeExportOptions, ClaudeCodeExportResult } from "./adapters/claudeCode.js";
40
+ export type { AgentKitTarget, CodexExportOptions, CodexExportResult } from "./adapters/codex.js";
41
+ export type { AiProviderConfigBase, AiProviderConfigShape, AiProviderType, KnownModel, ModelRecommendationTag, ProviderCapabilities } from "./providers/types.js";
42
+ export type { KnownDomain } from "./domains/catalog.js";
43
+ export type { PreparedPrompt, PreparedPromptInput, PreparedPromptInputType, PreparedPromptOutputMode } from "./prompts/schema.js";
44
+ export type { PreparedPromptInputValidationReport, PreparedPromptInputValues, PreparedPromptRenderResult } from "./prompts/prompts.js";
45
+ export type { AgentKitManifest, AgentKitSkillManifest, AgentKitValidationProfile, LoadedAgentKit, SkillDocument, ValidationIssue, ValidationIssueSeverity, ValidationReport } from "./types.js";
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ export { agentKitManifestSchema, agentKitSkillSchema } from "./schema/agentkit.js";
2
+ export { createAgentKitDraftRequest } from "./builder/draftRequest.js";
3
+ export { createAgentKitDraftRevisionRequest } from "./builder/revisionRequest.js";
4
+ export { inferExampleInputDocumentKind, isSupportedExampleInputDocument, summarizeExampleInputDocument } from "./app/exampleInputDocuments.js";
5
+ export { inspectAgentKitCandidate } from "./app/inspect.js";
6
+ export { getAgentKitSummary } from "./app/summary.js";
7
+ export { loadAgentKitAsDraft } from "./app/loadAsDraft.js";
8
+ export { createAgentKitBuilderInstructions } from "./builder/instructions.js";
9
+ export { exportAgentKitToClaudeCode } from "./adapters/claudeCode.js";
10
+ export { exportAgentKitToCodex } from "./adapters/codex.js";
11
+ export { buildAgentKitContext } from "./context/builder.js";
12
+ export { agentKitDraftSchema, exampleDraftSchema, policyDraftSchema, skillDraftSchema, templateDraftSchema } from "./draft/schema.js";
13
+ export { AgentKitDraftValidationError, renderAgentKitDraft } from "./draft/render.js";
14
+ export { addDraftRevision, agentKitDraftRevisionSchema, agentKitDraftSessionSchema, createDraftSession, getCurrentDraftRevision, restoreDraftRevision, validateDraftSession } from "./draft/session.js";
15
+ export { findMatchingDomains, getKnownDomains, knownDomains } from "./domains/catalog.js";
16
+ export { getDefaultOneFileName, getDefaultOutputName, getDefaultPackageName, sanitizeArtifactName } from "./artifacts/naming.js";
17
+ export { exportOneFile } from "./export/onefile.js";
18
+ export { createAgentKit } from "./init/create.js";
19
+ export { packageAgentKit } from "./package/packager.js";
20
+ export { aiProviderTypes, getDefaultModelForProvider, getKnownModelsForProvider, getProviderCapabilities, isApiKeyRequiredForProvider, isBaseUrlRequiredForProvider, modelCatalog, normalizeBaseUrl, providerSupportsStructuredJson, structuredOutputGuidance } from "./providers/catalog.js";
21
+ export { extractPromptVariables, findUnresolvedPromptVariables, getDefaultArtifactNames, getDefaultArtifactNamesForManifest, listPreparedPrompts, loadPreparedPrompt, renderPreparedPrompt, renderPreparedPromptWithValidation, validatePreparedPromptInputs } from "./prompts/prompts.js";
22
+ export { preparedPromptInputSchema, preparedPromptInputTypeSchema, preparedPromptOutputModeSchema, preparedPromptSchema } from "./prompts/schema.js";
23
+ export { readAgentKit, readYamlFile } from "./package/reader.js";
24
+ export { validateAgentKit } from "./validation/validator.js";
25
+ export { parseSkillMarkdown, validateSkillFile } from "./validation/skill.js";
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EACL,6BAA6B,EAC7B,+BAA+B,EAC/B,6BAA6B,EAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACtI,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,EAC1B,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,EAC3B,4BAA4B,EAC5B,YAAY,EACZ,gBAAgB,EAChB,8BAA8B,EAC9B,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,kCAAkC,EAClC,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,kCAAkC,EAClC,4BAA4B,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type AgentKitTemplateName } from "./templates.js";
2
+ export interface CreateAgentKitOptions {
3
+ template: AgentKitTemplateName;
4
+ id: string;
5
+ name: string;
6
+ description: string;
7
+ force?: boolean;
8
+ }
9
+ export interface CreateAgentKitResult {
10
+ rootPath: string;
11
+ template: AgentKitTemplateName;
12
+ files: string[];
13
+ }
14
+ export declare function createAgentKit(targetPath: string, options: CreateAgentKitOptions): Promise<CreateAgentKitResult>;
@@ -0,0 +1,48 @@
1
+ import { mkdir, readdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { resolveInside, safeRemoveDirectoryContents } from "../fs/safety.js";
4
+ import { templates, renderTemplate } from "./templates.js";
5
+ export async function createAgentKit(targetPath, options) {
6
+ const template = templates[options.template];
7
+ if (!template) {
8
+ throw new Error(`Unknown Agent Kit template: ${options.template}`);
9
+ }
10
+ const resolvedRoot = path.resolve(targetPath);
11
+ await assertCanWriteTarget(resolvedRoot, options.force === true);
12
+ const files = Object.entries(template.files);
13
+ for (const [relativePath, content] of files) {
14
+ const filePath = resolveInside(resolvedRoot, relativePath);
15
+ await mkdir(path.dirname(filePath), { recursive: true });
16
+ await writeFile(filePath, renderTemplate(content, options), "utf8");
17
+ }
18
+ return {
19
+ rootPath: resolvedRoot,
20
+ template: options.template,
21
+ files: files.map(([relativePath]) => relativePath)
22
+ };
23
+ }
24
+ async function assertCanWriteTarget(targetPath, force) {
25
+ try {
26
+ const entries = await readdir(targetPath);
27
+ if (entries.length > 0 && !force) {
28
+ throw new Error(`Refusing to initialize Agent Kit in non-empty directory: ${targetPath}. Use --force to overwrite template files.`);
29
+ }
30
+ if (entries.length > 0) {
31
+ await safeRemoveDirectoryContents(targetPath);
32
+ }
33
+ }
34
+ catch (error) {
35
+ if (isNotFoundError(error)) {
36
+ await mkdir(targetPath, { recursive: true });
37
+ return;
38
+ }
39
+ throw error;
40
+ }
41
+ }
42
+ function isNotFoundError(error) {
43
+ return (typeof error === "object" &&
44
+ error !== null &&
45
+ "code" in error &&
46
+ error.code === "ENOENT");
47
+ }
48
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/init/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,cAAc,EAA6B,MAAM,gBAAgB,CAAC;AAgBtF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB,EAClB,OAA8B;IAE9B,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,oBAAoB,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAEjE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,UAAkB,EAAE,KAAc;IACpE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,4DAA4D,UAAU,4CAA4C,CACnH,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACd,KAA2B,CAAC,IAAI,KAAK,QAAQ,CAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type AgentKitTemplateName = "blank" | "financial-review";
2
+ export interface AgentKitTemplateVariables {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ }
7
+ export interface AgentKitTemplate {
8
+ name: AgentKitTemplateName;
9
+ files: Record<string, string>;
10
+ }
11
+ export declare const templates: Record<AgentKitTemplateName, AgentKitTemplate>;
12
+ export declare function renderTemplate(input: string, variables: AgentKitTemplateVariables): string;