@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
package/SPEC.md ADDED
@@ -0,0 +1,159 @@
1
+ # Agent Kit Specification
2
+
3
+ This is the public preview Agent Kit package specification for AgentKitForge Core.
4
+
5
+ ## What Is an Agent Kit?
6
+
7
+ An Agent Kit is a portable package of AI-agent skills, workflows, policies, references, templates, examples, evals, adapters, scripts, assets, prepared prompts, and exports.
8
+
9
+ AgentKitForge Core validates, renders, packages, exports, and builds AI-ready context from Agent Kits. It does not call AI providers and does not execute scripts.
10
+
11
+ ## Canonical Package Structure
12
+
13
+ Required for `local-valid`:
14
+
15
+ ```text
16
+ agentkit.yaml
17
+ AGENTKIT.md
18
+ START_HERE.md
19
+ skills/
20
+ skills/<skill-id>/SKILL.md
21
+ ```
22
+
23
+ Optional or profile-specific files and folders:
24
+
25
+ ```text
26
+ README.md
27
+ LICENSE
28
+ CHANGELOG.md
29
+ workflows/
30
+ policies/
31
+ references/
32
+ templates/
33
+ examples/
34
+ examples/prompts/
35
+ examples/inputs/
36
+ examples/outputs/
37
+ evals/
38
+ adapters/
39
+ scripts/
40
+ assets/
41
+ exports/
42
+ prompts/
43
+ prompts/<prompt-id>.yaml
44
+ ```
45
+
46
+ ## Manifest
47
+
48
+ `agentkit.yaml` is the package manifest.
49
+
50
+ Required fields:
51
+
52
+ - `schemaVersion`
53
+ - `kind`
54
+ - `id`
55
+ - `name`
56
+ - `version`
57
+ - `description`
58
+ - `author.name`
59
+ - `license`
60
+ - `entrypoints.human`
61
+ - `entrypoints.agent`
62
+ - `userExperience.setupLevel`
63
+ - `compatibility.targets`
64
+ - `risk.level`
65
+ - `skills[]`
66
+ - `skills[].id`
67
+ - `skills[].path`
68
+ - `skills[].description`
69
+ - `skills[].triggers`
70
+
71
+ Current public preview schema:
72
+
73
+ ```yaml
74
+ schemaVersion: "0.1"
75
+ ```
76
+
77
+ ## Skills
78
+
79
+ Each manifest skill points to a `SKILL.md` file.
80
+
81
+ Required frontmatter:
82
+
83
+ - `id`
84
+ - `name`
85
+ - `description`
86
+ - `triggers`
87
+ - `riskLevel`
88
+
89
+ Required Markdown sections:
90
+
91
+ - `# Title`
92
+ - `## Use when`
93
+ - `## Procedure`
94
+ - `## Output`
95
+
96
+ ## Prepared Prompts
97
+
98
+ Prepared Prompts are reusable prompt templates stored under:
99
+
100
+ ```text
101
+ prompts/<prompt-id>.yaml
102
+ ```
103
+
104
+ Manifest entries are optional:
105
+
106
+ ```yaml
107
+ prompts:
108
+ - id: financial-review
109
+ path: prompts/financial-review.yaml
110
+ description: Review a financial workbook and produce a summary.
111
+ ```
112
+
113
+ Canonical variable syntax is `{{variable_name}}`. The simple `{variable_name}` form is tolerated for compatibility. Core validates inputs and blocks unresolved variables before a rendered prompt is considered valid.
114
+
115
+ Supported input types:
116
+
117
+ - `short-text`
118
+ - `long-text`
119
+ - `choice`
120
+ - `multi-choice`
121
+ - `date`
122
+ - `number`
123
+ - `boolean`
124
+
125
+ ## Validation Profiles
126
+
127
+ `local-valid` requires:
128
+
129
+ - `agentkit.yaml`
130
+ - `AGENTKIT.md`
131
+ - `START_HERE.md`
132
+ - `skills/`
133
+ - At least one `skills/<skill-id>/SKILL.md`
134
+
135
+ `publishable` requires all `local-valid` requirements plus:
136
+
137
+ - `README.md`
138
+ - `LICENSE`
139
+
140
+ `trusted` requires all `publishable` requirements plus:
141
+
142
+ - `CHANGELOG.md`
143
+ - `policies/`
144
+ - `examples/`
145
+
146
+ `verified` requires all `trusted` requirements plus:
147
+
148
+ - `evals/`
149
+
150
+ ## Security Notes
151
+
152
+ Agent Kits are untrusted input.
153
+
154
+ - Manifest paths must be safe relative paths that resolve inside the kit root.
155
+ - IDs used in filesystem paths must be path-safe kebab-case identifiers.
156
+ - Path traversal, absolute paths, Windows drive-root paths, and null bytes are invalid.
157
+ - Core does not execute files in `scripts/`.
158
+ - Packaging, context building, and target exports reject symbolic links and apply conservative file-count and byte limits.
159
+ - Generated and dependency-heavy folders such as `exports/`, `.git`, `node_modules`, `dist`, and `build` are skipped by package/export safety traversal.
package/VERSIONING.md ADDED
@@ -0,0 +1,45 @@
1
+ # Versioning
2
+
3
+ AgentKitForge Core uses Semantic Versioning.
4
+
5
+ Version format:
6
+
7
+ ```text
8
+ MAJOR.MINOR.PATCH
9
+ ```
10
+
11
+ ## Pre-1.0 Policy
12
+
13
+ Before `1.0.0`, the public API and Agent Kit schema are still stabilizing.
14
+
15
+ - Minor versions, such as `0.2.0`, may include breaking changes.
16
+ - Patch versions, such as `0.1.1`, are for fixes, security fixes, documentation corrections, and compatible improvements.
17
+ - Breaking changes should be documented clearly in release notes.
18
+
19
+ Release Please uses Conventional Commits to determine version bumps:
20
+
21
+ - `feat:` creates a minor release.
22
+ - `fix:` creates a patch release.
23
+ - `security:` creates a patch release.
24
+ - Breaking changes before `1.0.0` create a minor release, but must be documented in release notes and any affected spec docs.
25
+
26
+ ## Agent Kit Schema Compatibility
27
+
28
+ Agent Kit manifests include `schemaVersion`.
29
+
30
+ Current public preview schema:
31
+
32
+ ```yaml
33
+ schemaVersion: "0.1"
34
+ ```
35
+
36
+ Compatibility policy during public preview:
37
+
38
+ - `schemaVersion: "0.1"` is the v0.1 public preview schema.
39
+ - Compatible validator improvements may ship in patch releases.
40
+ - Breaking schema changes should use a new schema version and be documented in `SPEC.md`, `CHANGELOG.md`, and release notes.
41
+ - Deprecated fields should receive a migration note when practical.
42
+
43
+ ## Release Target
44
+
45
+ The current release target is `v0.1.0 Public Preview`.
@@ -0,0 +1,11 @@
1
+ export interface ClaudeCodeExportOptions {
2
+ force?: boolean;
3
+ }
4
+ export interface ClaudeCodeExportResult {
5
+ destinationDir: string;
6
+ pluginFolder: string;
7
+ exportedSkillFolders: string[];
8
+ pluginManifestPath: string;
9
+ warnings: string[];
10
+ }
11
+ export declare function exportAgentKitToClaudeCode(kitPath: string, destinationDir: string, options?: ClaudeCodeExportOptions): Promise<ClaudeCodeExportResult>;
@@ -0,0 +1,120 @@
1
+ import { copyFile, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { readAgentKit } from "../package/reader.js";
4
+ import { assertSafeDestinationDirectory, assertSafeId, resolveInside, safeCopyDirectory } from "../fs/safety.js";
5
+ const MARKER_FILE = ".agentkitforge-export.json";
6
+ const SUPPORTING_DIRECTORIES = ["policies", "templates", "workflows", "references"];
7
+ export async function exportAgentKitToClaudeCode(kitPath, destinationDir, options = {}) {
8
+ const kit = await readAgentKit(kitPath);
9
+ if (!kit.manifest) {
10
+ throw new Error("Unable to export to Claude Code because agentkit.yaml is invalid.");
11
+ }
12
+ const resolvedDestination = path.resolve(destinationDir);
13
+ assertSafeId(kit.manifest.id, "kit id");
14
+ for (const skill of kit.manifest.skills) {
15
+ assertSafeId(skill.id, "skill id");
16
+ }
17
+ await assertSafeDestinationDirectory(resolvedDestination);
18
+ await mkdir(resolvedDestination, { recursive: true });
19
+ const pluginFolder = resolveInside(resolvedDestination, pluginFolderName(kit.manifest));
20
+ await preparePluginFolder(pluginFolder, options.force === true);
21
+ await mkdir(pluginFolder, { recursive: true });
22
+ await writePluginManifest(pluginFolder, kit.manifest);
23
+ await writeMarker(pluginFolder, kit.manifest);
24
+ await copyIfPresent(resolveInside(kit.rootPath, "AGENTKIT.md"), resolveInside(pluginFolder, "AGENTKIT.md"));
25
+ await copyIfPresent(resolveInside(kit.rootPath, "README.md"), resolveInside(pluginFolder, "README.md"));
26
+ const exportedSkillFolders = [];
27
+ for (const skill of [...kit.manifest.skills].sort((left, right) => left.id.localeCompare(right.id))) {
28
+ const sourceSkillDir = path.dirname(resolveInside(kit.rootPath, skill.path));
29
+ const destinationSkillDir = resolveInside(pluginFolder, `skills/${skill.id}`);
30
+ await mkdir(path.dirname(destinationSkillDir), { recursive: true });
31
+ await safeCopyDirectory(sourceSkillDir, destinationSkillDir);
32
+ exportedSkillFolders.push(destinationSkillDir);
33
+ }
34
+ for (const directory of SUPPORTING_DIRECTORIES) {
35
+ await copyDirectoryIfPresent(resolveInside(kit.rootPath, directory), resolveInside(pluginFolder, directory));
36
+ }
37
+ return {
38
+ destinationDir: resolvedDestination,
39
+ pluginFolder,
40
+ exportedSkillFolders,
41
+ pluginManifestPath: resolveInside(pluginFolder, ".claude-plugin/plugin.json"),
42
+ warnings: [
43
+ "Claude Code plugin schema support is an initial AgentKitForge adapter; verify loading behavior with your Claude Code version."
44
+ ]
45
+ };
46
+ }
47
+ async function preparePluginFolder(pluginFolder, force) {
48
+ if (!(await exists(pluginFolder))) {
49
+ return;
50
+ }
51
+ if (!force) {
52
+ throw new Error(`Refusing to overwrite existing Claude Code plugin folder: ${pluginFolder}. Use --force to replace the AgentKitForge-generated plugin folder.`);
53
+ }
54
+ await assertAgentKitForgeGeneratedPlugin(pluginFolder);
55
+ await rm(pluginFolder, { recursive: true, force: true });
56
+ }
57
+ async function assertAgentKitForgeGeneratedPlugin(pluginFolder) {
58
+ const markerPath = resolveInside(pluginFolder, MARKER_FILE);
59
+ if (!(await exists(markerPath))) {
60
+ throw new Error(`Refusing to remove non-AgentKitForge plugin folder: ${pluginFolder}`);
61
+ }
62
+ const marker = JSON.parse(await readFile(markerPath, "utf8"));
63
+ if (marker.generatedBy !== "agentkitforge" || marker.target !== "claude-code") {
64
+ throw new Error(`Refusing to remove plugin folder without Claude Code AgentKitForge marker: ${pluginFolder}`);
65
+ }
66
+ }
67
+ async function writePluginManifest(pluginFolder, manifest) {
68
+ const pluginManifestPath = resolveInside(pluginFolder, ".claude-plugin/plugin.json");
69
+ await mkdir(path.dirname(pluginManifestPath), { recursive: true });
70
+ await writeFile(pluginManifestPath, `${JSON.stringify({
71
+ generatedBy: "agentkitforge",
72
+ target: "claude-code",
73
+ schemaVersion: "0.1",
74
+ name: manifest.name,
75
+ id: manifest.id,
76
+ version: manifest.version,
77
+ description: manifest.description,
78
+ author: manifest.author?.name,
79
+ skills: manifest.skills.map((skill) => ({
80
+ id: skill.id,
81
+ path: `skills/${skill.id}/SKILL.md`,
82
+ description: skill.description,
83
+ triggers: skill.triggers
84
+ }))
85
+ }, null, 2)}\n`, "utf8");
86
+ }
87
+ async function writeMarker(pluginFolder, manifest) {
88
+ await writeFile(resolveInside(pluginFolder, MARKER_FILE), `${JSON.stringify({
89
+ generatedBy: "agentkitforge",
90
+ target: "claude-code",
91
+ kitId: manifest.id
92
+ }, null, 2)}\n`, "utf8");
93
+ }
94
+ async function copyIfPresent(source, destination) {
95
+ if (!(await exists(source))) {
96
+ return;
97
+ }
98
+ await mkdir(path.dirname(destination), { recursive: true });
99
+ await mkdir(path.dirname(destination), { recursive: true });
100
+ await copyFile(source, destination);
101
+ }
102
+ async function copyDirectoryIfPresent(source, destination) {
103
+ if (!(await exists(source))) {
104
+ return;
105
+ }
106
+ await safeCopyDirectory(source, destination);
107
+ }
108
+ function pluginFolderName(manifest) {
109
+ return `${manifest.id}-claude-code-plugin`;
110
+ }
111
+ async function exists(filePath) {
112
+ try {
113
+ await stat(filePath);
114
+ return true;
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ //# sourceMappingURL=claudeCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudeCode.js","sourceRoot":"","sources":["../../src/adapters/claudeCode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type AgentKitTarget = "codex" | "claude-code";
2
+ export interface CodexExportOptions {
3
+ force?: boolean;
4
+ createIndexSkill?: boolean;
5
+ }
6
+ export interface CodexExportResult {
7
+ destinationSkillsDir: string;
8
+ exportedSkillFolders: string[];
9
+ generatedIndexFolder?: string;
10
+ warnings: string[];
11
+ }
12
+ export declare function exportAgentKitToCodex(kitPath: string, destinationSkillsDir: string, options?: CodexExportOptions): Promise<CodexExportResult>;
@@ -0,0 +1,141 @@
1
+ import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { readAgentKit } from "../package/reader.js";
4
+ import { assertSafeDestinationDirectory, assertSafeId, resolveInside, safeCopyDirectory } from "../fs/safety.js";
5
+ const MARKER_FILE = ".agentkitforge-export.json";
6
+ export async function exportAgentKitToCodex(kitPath, destinationSkillsDir, options = {}) {
7
+ const kit = await readAgentKit(kitPath);
8
+ if (!kit.manifest) {
9
+ throw new Error("Unable to export to Codex because agentkit.yaml is invalid.");
10
+ }
11
+ const destinationRoot = path.resolve(destinationSkillsDir);
12
+ assertSafeId(kit.manifest.id, "kit id");
13
+ for (const skill of kit.manifest.skills) {
14
+ assertSafeId(skill.id, "skill id");
15
+ }
16
+ await assertSafeDestinationDirectory(destinationRoot);
17
+ await mkdir(destinationRoot, { recursive: true });
18
+ const createIndexSkill = options.createIndexSkill !== false;
19
+ const plannedFolders = [
20
+ ...kit.manifest.skills.map((skill) => folderNameForSkill(kit.manifest, skill)),
21
+ ...(createIndexSkill ? [folderNameForIndex(kit.manifest)] : [])
22
+ ];
23
+ await prepareDestinationFolders(destinationRoot, plannedFolders, options.force === true);
24
+ const exportedSkillFolders = [];
25
+ for (const skill of [...kit.manifest.skills].sort((left, right) => left.id.localeCompare(right.id))) {
26
+ const folderName = folderNameForSkill(kit.manifest, skill);
27
+ const destinationFolder = resolveInside(destinationRoot, folderName);
28
+ await mkdir(destinationFolder, { recursive: true });
29
+ await exportSkillFolder(kit.rootPath, kit.manifest, skill, destinationFolder);
30
+ exportedSkillFolders.push(destinationFolder);
31
+ }
32
+ let generatedIndexFolder;
33
+ if (createIndexSkill) {
34
+ const folderName = folderNameForIndex(kit.manifest);
35
+ const destinationFolder = resolveInside(destinationRoot, folderName);
36
+ await mkdir(destinationFolder, { recursive: true });
37
+ await writeFile(resolveInside(destinationFolder, "SKILL.md"), renderIndexSkill(kit.manifest), "utf8");
38
+ await writeMarker(destinationFolder, kit.manifest, "index");
39
+ generatedIndexFolder = destinationFolder;
40
+ }
41
+ return {
42
+ destinationSkillsDir: destinationRoot,
43
+ exportedSkillFolders,
44
+ generatedIndexFolder,
45
+ warnings: []
46
+ };
47
+ }
48
+ async function exportSkillFolder(kitRoot, manifest, skill, destinationFolder) {
49
+ const sourceSkillFile = resolveInside(kitRoot, skill.path);
50
+ const sourceSkillDir = path.dirname(sourceSkillFile);
51
+ await safeCopyDirectory(sourceSkillDir, destinationFolder);
52
+ await writeFile(resolveInside(destinationFolder, "AGENTKIT.md"), renderSkillAgentKitReadme(manifest, skill), "utf8");
53
+ await writeMarker(destinationFolder, manifest, skill.id);
54
+ }
55
+ async function prepareDestinationFolders(destinationRoot, plannedFolders, force) {
56
+ const existingFolders = [];
57
+ for (const folderName of plannedFolders) {
58
+ const folderPath = resolveInside(destinationRoot, folderName);
59
+ if (await exists(folderPath)) {
60
+ existingFolders.push(folderPath);
61
+ }
62
+ }
63
+ if (existingFolders.length > 0 && !force) {
64
+ throw new Error(`Refusing to overwrite existing Codex skill export folders: ${existingFolders.join(", ")}. Use --force to replace AgentKitForge-generated folders.`);
65
+ }
66
+ for (const folderPath of existingFolders) {
67
+ await assertAgentKitForgeGeneratedFolder(folderPath);
68
+ await rm(folderPath, { recursive: true, force: true });
69
+ }
70
+ }
71
+ async function assertAgentKitForgeGeneratedFolder(folderPath) {
72
+ const markerPath = resolveInside(folderPath, MARKER_FILE);
73
+ if (!(await exists(markerPath))) {
74
+ throw new Error(`Refusing to remove non-AgentKitForge folder: ${folderPath}`);
75
+ }
76
+ const marker = JSON.parse(await readFile(markerPath, "utf8"));
77
+ if (marker.generatedBy !== "agentkitforge") {
78
+ throw new Error(`Refusing to remove folder without AgentKitForge marker: ${folderPath}`);
79
+ }
80
+ }
81
+ async function writeMarker(destinationFolder, manifest, skillId) {
82
+ await writeFile(resolveInside(destinationFolder, MARKER_FILE), `${JSON.stringify({
83
+ generatedBy: "agentkitforge",
84
+ target: "codex",
85
+ kitId: manifest.id,
86
+ skillId
87
+ }, null, 2)}\n`, "utf8");
88
+ }
89
+ function renderSkillAgentKitReadme(manifest, skill) {
90
+ return `# ${manifest.name}: ${skill.id}
91
+
92
+ This Codex skill was exported from Agent Kit \`${manifest.id}\`.
93
+
94
+ ${skill.description}
95
+ `;
96
+ }
97
+ function renderIndexSkill(manifest) {
98
+ return `---
99
+ id: ${manifest.id}-index
100
+ name: ${manifest.name} Index
101
+ description: Overview of the ${manifest.name} Agent Kit and its exported Codex skills.
102
+ triggers:
103
+ - ${manifest.name}
104
+ - ${manifest.id}
105
+ riskLevel: ${manifest.risk.level}
106
+ ---
107
+
108
+ # ${manifest.name} Index
109
+
110
+ ## Use when
111
+
112
+ Use this skill when a user asks what the ${manifest.name} Agent Kit contains or which exported skill to use.
113
+
114
+ ## Procedure
115
+
116
+ Review the Agent Kit description and choose the most relevant exported skill.
117
+
118
+ Included skills:
119
+ ${manifest.skills.map((skill) => `- ${skill.id}: ${skill.description}`).join("\n")}
120
+
121
+ ## Output
122
+
123
+ Return the recommended skill and a short reason.
124
+ `;
125
+ }
126
+ function folderNameForSkill(manifest, skill) {
127
+ return `${manifest.id}-${skill.id}`;
128
+ }
129
+ function folderNameForIndex(manifest) {
130
+ return `${manifest.id}-index`;
131
+ }
132
+ async function exists(filePath) {
133
+ try {
134
+ await stat(filePath);
135
+ return true;
136
+ }
137
+ catch {
138
+ return false;
139
+ }
140
+ }
141
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type ExampleInputDocumentKind = "text" | "markdown" | "csv" | "spreadsheet";
2
+ export interface ExampleInputDocument {
3
+ id: string;
4
+ name: string;
5
+ filename: string;
6
+ mediaType?: string;
7
+ kind: ExampleInputDocumentKind;
8
+ extractedText?: string;
9
+ tablePreview?: string[][];
10
+ notes?: string;
11
+ }
12
+ export interface ExampleInputDocumentSummary {
13
+ id: string;
14
+ name: string;
15
+ filename: string;
16
+ kind: ExampleInputDocumentKind;
17
+ notes?: string;
18
+ }
19
+ export declare function isSupportedExampleInputDocument(filename: string): boolean;
20
+ export declare function inferExampleInputDocumentKind(filename: string): ExampleInputDocumentKind | undefined;
21
+ export declare function summarizeExampleInputDocument(document: ExampleInputDocument): ExampleInputDocumentSummary;
@@ -0,0 +1,24 @@
1
+ const EXTENSION_TO_KIND = {
2
+ ".txt": "text",
3
+ ".md": "markdown",
4
+ ".csv": "csv",
5
+ ".xlsx": "spreadsheet",
6
+ ".xls": "spreadsheet"
7
+ };
8
+ export function isSupportedExampleInputDocument(filename) {
9
+ return inferExampleInputDocumentKind(filename) !== undefined;
10
+ }
11
+ export function inferExampleInputDocumentKind(filename) {
12
+ const extension = filename.slice(filename.lastIndexOf(".")).toLowerCase();
13
+ return EXTENSION_TO_KIND[extension];
14
+ }
15
+ export function summarizeExampleInputDocument(document) {
16
+ return {
17
+ id: document.id,
18
+ name: document.name,
19
+ filename: document.filename,
20
+ kind: document.kind,
21
+ notes: document.notes
22
+ };
23
+ }
24
+ //# sourceMappingURL=exampleInputDocuments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exampleInputDocuments.js","sourceRoot":"","sources":["../../src/app/exampleInputDocuments.ts"],"names":[],"mappings":"AAqBA,MAAM,iBAAiB,GAA6C;IAClE,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,aAAa;CACtB,CAAC;AAEF,MAAM,UAAU,+BAA+B,CAAC,QAAgB;IAC9D,OAAO,6BAA6B,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAgB;IAEhB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAA8B;IAE9B,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ValidationReport } from "../types.js";
2
+ export interface AgentKitCandidateInspection {
3
+ path: string;
4
+ exists: boolean;
5
+ isDirectory: boolean;
6
+ looksLikeAgentKit: boolean;
7
+ missingRequiredFiles: string[];
8
+ missingRequiredFolders: string[];
9
+ foundFiles: string[];
10
+ foundSkills: string[];
11
+ recommendedFixes: string[];
12
+ validationReport?: ValidationReport;
13
+ friendlySummary: string;
14
+ }
15
+ export declare function inspectAgentKitCandidate(inputPath: string): Promise<AgentKitCandidateInspection>;
@@ -0,0 +1,96 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { validateAgentKit } from "../validation/validator.js";
4
+ export async function inspectAgentKitCandidate(inputPath) {
5
+ const rootPath = path.resolve(inputPath);
6
+ if (!(await exists(rootPath))) {
7
+ return {
8
+ path: rootPath,
9
+ exists: false,
10
+ isDirectory: false,
11
+ looksLikeAgentKit: false,
12
+ missingRequiredFiles: ["agentkit.yaml", "AGENTKIT.md", "START_HERE.md", "skills/<skill-id>/SKILL.md"],
13
+ missingRequiredFolders: ["skills"],
14
+ foundFiles: [],
15
+ foundSkills: [],
16
+ recommendedFixes: ["Select an existing Agent Kit folder."],
17
+ friendlySummary: `This folder does not exist: ${rootPath}`
18
+ };
19
+ }
20
+ const stats = await stat(rootPath);
21
+ if (!stats.isDirectory()) {
22
+ return {
23
+ path: rootPath,
24
+ exists: true,
25
+ isDirectory: false,
26
+ looksLikeAgentKit: false,
27
+ missingRequiredFiles: ["agentkit.yaml", "AGENTKIT.md", "START_HERE.md", "skills/<skill-id>/SKILL.md"],
28
+ missingRequiredFolders: ["skills"],
29
+ foundFiles: [],
30
+ foundSkills: [],
31
+ recommendedFixes: ["Select a folder that contains the Agent Kit files."],
32
+ friendlySummary: "This path exists but is not a directory."
33
+ };
34
+ }
35
+ const foundFiles = await findRootFiles(rootPath);
36
+ const foundSkills = await findSkills(rootPath);
37
+ const missingRequiredFiles = ["agentkit.yaml", "AGENTKIT.md", "START_HERE.md"].filter((file) => !foundFiles.includes(file));
38
+ const missingRequiredFolders = (await exists(path.join(rootPath, "skills"))) ? [] : ["skills"];
39
+ if (foundSkills.length === 0) {
40
+ missingRequiredFiles.push("skills/<skill-id>/SKILL.md");
41
+ }
42
+ const looksLikeAgentKit = missingRequiredFiles.length === 0 && missingRequiredFolders.length === 0;
43
+ const validationReport = looksLikeAgentKit ? await validateAgentKit(rootPath, "local-valid") : undefined;
44
+ const missing = [...missingRequiredFiles, ...missingRequiredFolders];
45
+ return {
46
+ path: rootPath,
47
+ exists: true,
48
+ isDirectory: true,
49
+ looksLikeAgentKit,
50
+ missingRequiredFiles,
51
+ missingRequiredFolders,
52
+ foundFiles,
53
+ foundSkills,
54
+ recommendedFixes: looksLikeAgentKit
55
+ ? []
56
+ : ["Place the Agent Kit files at the repository root or select a subfolder that contains the kit."],
57
+ validationReport,
58
+ friendlySummary: looksLikeAgentKit
59
+ ? "This folder looks like an Agent Kit."
60
+ : `This repository does not look like an Agent Kit. It is missing ${joinFriendly(missing)}. Place the Agent Kit files at the repository root or select a subfolder that contains the kit.`
61
+ };
62
+ }
63
+ async function findRootFiles(rootPath) {
64
+ const entries = await readdir(rootPath, { withFileTypes: true });
65
+ return entries.filter((entry) => entry.isFile()).map((entry) => entry.name).sort();
66
+ }
67
+ async function findSkills(rootPath) {
68
+ const skillsPath = path.join(rootPath, "skills");
69
+ if (!(await exists(skillsPath))) {
70
+ return [];
71
+ }
72
+ const entries = await readdir(skillsPath, { withFileTypes: true });
73
+ const skills = [];
74
+ for (const entry of entries) {
75
+ if (entry.isDirectory() && (await exists(path.join(skillsPath, entry.name, "SKILL.md")))) {
76
+ skills.push(entry.name);
77
+ }
78
+ }
79
+ return skills.sort();
80
+ }
81
+ async function exists(filePath) {
82
+ try {
83
+ await stat(filePath);
84
+ return true;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ function joinFriendly(values) {
91
+ if (values.length <= 1) {
92
+ return values[0] ?? "required Agent Kit files";
93
+ }
94
+ return `${values.slice(0, -1).join(", ")}, and ${values[values.length - 1]}`;
95
+ }
96
+ //# sourceMappingURL=inspect.js.map