claude-space 2.0.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.
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ const electron = require("electron");
3
+ const preload = require("@electron-toolkit/preload");
4
+ const api = {
5
+ // File selection
6
+ selectFile: () => electron.ipcRenderer.invoke("select-file"),
7
+ // Open path in system file manager
8
+ openPath: (path) => electron.ipcRenderer.invoke("open-path", path),
9
+ // Memory Panel file operations
10
+ listMarkdownFiles: (folderPath) => electron.ipcRenderer.invoke("list-markdown-files", folderPath),
11
+ addMarkdownFile: (folderPath, sourcePath, fileName) => electron.ipcRenderer.invoke("add-markdown-file", folderPath, sourcePath, fileName),
12
+ deleteMarkdownFile: (filePath) => electron.ipcRenderer.invoke("delete-markdown-file", filePath),
13
+ // Skills Panel operations
14
+ skills: {
15
+ initialize: (projectPath, skillName) => electron.ipcRenderer.invoke("initialize-skill", projectPath, skillName),
16
+ load: (projectPath, skillName) => electron.ipcRenderer.invoke("load-skill", projectPath, skillName),
17
+ saveMd: (projectPath, skillName, content) => electron.ipcRenderer.invoke("save-skill-md", projectPath, skillName, content),
18
+ addFile: (projectPath, skillName, sourcePath, fileName, fileType) => electron.ipcRenderer.invoke("add-skill-file", projectPath, skillName, sourcePath, fileName, fileType),
19
+ deleteFile: (filePath) => electron.ipcRenderer.invoke("delete-skill-file", filePath),
20
+ deleteFolder: (projectPath, skillName) => electron.ipcRenderer.invoke("delete-skill-folder", projectPath, skillName),
21
+ scanFolder: (projectPath) => electron.ipcRenderer.invoke("scan-skills-folder", projectPath)
22
+ },
23
+ // Context Drive operations
24
+ context: {
25
+ listFiles: (projectPath) => electron.ipcRenderer.invoke("list-context-files", projectPath),
26
+ addFile: (projectPath, sourcePath, fileName, title, description) => electron.ipcRenderer.invoke("add-context-file", projectPath, sourcePath, fileName, title, description),
27
+ renameFile: (projectPath, oldName, newName) => electron.ipcRenderer.invoke("rename-context-file", projectPath, oldName, newName),
28
+ updateMetadata: (projectPath, fileName, title, description) => electron.ipcRenderer.invoke("update-context-metadata", projectPath, fileName, title, description),
29
+ deleteFile: (projectPath, fileName) => electron.ipcRenderer.invoke("delete-context-file", projectPath, fileName),
30
+ readFile: (projectPath, fileName) => electron.ipcRenderer.invoke("read-context-file", projectPath, fileName)
31
+ },
32
+ // Memory Node operations
33
+ memoryNode: {
34
+ listFiles: (projectPath, memoryFolderName) => electron.ipcRenderer.invoke("list-memory-node-files", projectPath, memoryFolderName),
35
+ addFile: (projectPath, memoryFolderName, sourcePath, fileName, title, description) => electron.ipcRenderer.invoke("add-memory-node-file", projectPath, memoryFolderName, sourcePath, fileName, title, description),
36
+ renameFile: (projectPath, memoryFolderName, oldName, newName) => electron.ipcRenderer.invoke("rename-memory-node-file", projectPath, memoryFolderName, oldName, newName),
37
+ updateMetadata: (projectPath, memoryFolderName, fileName, title, description) => electron.ipcRenderer.invoke("update-memory-node-metadata", projectPath, memoryFolderName, fileName, title, description),
38
+ deleteFile: (projectPath, memoryFolderName, fileName) => electron.ipcRenderer.invoke("delete-memory-node-file", projectPath, memoryFolderName, fileName),
39
+ readFile: (projectPath, memoryFolderName, fileName) => electron.ipcRenderer.invoke("read-memory-node-file", projectPath, memoryFolderName, fileName),
40
+ deleteFolder: (projectPath, memoryFolderName) => electron.ipcRenderer.invoke("delete-memory-node-folder", projectPath, memoryFolderName)
41
+ },
42
+ // SubAgent operations
43
+ subagent: {
44
+ listFiles: (projectPath) => electron.ipcRenderer.invoke("list-subagent-files", projectPath),
45
+ readFile: (projectPath, fileName) => electron.ipcRenderer.invoke("read-subagent-file", projectPath, fileName),
46
+ writeFile: (projectPath, fileName, frontmatter, markdown) => electron.ipcRenderer.invoke("write-subagent-file", projectPath, fileName, frontmatter, markdown),
47
+ renameFile: (projectPath, oldFileName, newFileName) => electron.ipcRenderer.invoke("rename-subagent-file", projectPath, oldFileName, newFileName),
48
+ deleteFile: (projectPath, fileName) => electron.ipcRenderer.invoke("delete-subagent-file", projectPath, fileName),
49
+ scanFolder: (projectPath) => electron.ipcRenderer.invoke("scan-agents-folder", projectPath)
50
+ },
51
+ // Command operations
52
+ command: {
53
+ listFiles: (projectPath) => electron.ipcRenderer.invoke("list-command-files", projectPath),
54
+ readFile: (projectPath, fileName) => electron.ipcRenderer.invoke("read-command-file", projectPath, fileName),
55
+ writeFile: (projectPath, fileName, frontmatter, markdown) => electron.ipcRenderer.invoke("write-command-file", projectPath, fileName, frontmatter, markdown),
56
+ renameFile: (projectPath, oldFileName, newFileName) => electron.ipcRenderer.invoke("rename-command-file", projectPath, oldFileName, newFileName),
57
+ deleteFile: (projectPath, fileName) => electron.ipcRenderer.invoke("delete-command-file", projectPath, fileName),
58
+ scanFolder: (projectPath) => electron.ipcRenderer.invoke("scan-commands-folder", projectPath)
59
+ },
60
+ // Hook operations
61
+ hook: {
62
+ listFiles: (projectPath) => electron.ipcRenderer.invoke("list-hook-files", projectPath),
63
+ readFile: (projectPath, fileName) => electron.ipcRenderer.invoke("read-hook-file", projectPath, fileName),
64
+ writeFile: (projectPath, fileName, content) => electron.ipcRenderer.invoke("write-hook-file", projectPath, fileName, content),
65
+ renameFile: (projectPath, oldFileName, newFileName) => electron.ipcRenderer.invoke("rename-hook-file", projectPath, oldFileName, newFileName),
66
+ deleteFile: (projectPath, fileName) => electron.ipcRenderer.invoke("delete-hook-file", projectPath, fileName),
67
+ scanFolder: (projectPath) => electron.ipcRenderer.invoke("scan-hooks-folder", projectPath)
68
+ },
69
+ // Workspace operations (kept for migration only)
70
+ workspace: {
71
+ listProjects: (workspacePath) => electron.ipcRenderer.invoke("list-projects", workspacePath)
72
+ },
73
+ // Project operations
74
+ project: {
75
+ selectFolder: () => electron.ipcRenderer.invoke("select-project-folder"),
76
+ validate: (projectPath) => electron.ipcRenderer.invoke("validate-project", projectPath),
77
+ checkClaudeFolder: (projectPath) => electron.ipcRenderer.invoke("check-claude-folder", projectPath),
78
+ createAt: (targetPath, projectName) => electron.ipcRenderer.invoke("create-project-at", targetPath, projectName),
79
+ save: (projectPath, workflowData) => electron.ipcRenderer.invoke("save-project", projectPath, workflowData),
80
+ load: (projectPath) => electron.ipcRenderer.invoke("load-project", projectPath),
81
+ delete: (projectPath) => electron.ipcRenderer.invoke("delete-project", projectPath),
82
+ selectExportLocation: () => electron.ipcRenderer.invoke("select-export-location"),
83
+ exportClaudeFolder: (exportPath, projectName, exportData) => electron.ipcRenderer.invoke("export-claude-folder", exportPath, projectName, exportData),
84
+ selectImportFolder: () => electron.ipcRenderer.invoke("select-import-folder"),
85
+ importClaudeFolder: (claudeFolderPath) => electron.ipcRenderer.invoke("import-claude-folder", claudeFolderPath),
86
+ listSourceFiles: (projectPath) => electron.ipcRenderer.invoke("list-project-files", projectPath)
87
+ },
88
+ // Settings.local operations
89
+ settingsLocal: {
90
+ load: (projectPath) => electron.ipcRenderer.invoke("load-settings-local", projectPath),
91
+ save: (projectPath, settings) => electron.ipcRenderer.invoke("save-settings-local", projectPath, settings)
92
+ },
93
+ // .mcp.json operations (MCP servers at project root)
94
+ mcpJson: {
95
+ load: (projectPath) => electron.ipcRenderer.invoke("load-mcp-json", projectPath),
96
+ save: (projectPath, mcpJson) => electron.ipcRenderer.invoke("save-mcp-json", projectPath, mcpJson)
97
+ },
98
+ // Agent operations
99
+ agent: {
100
+ startSession: (projectPath, apiKey, authMethod, sdkSessionId, permissionMode, agentFolderName) => electron.ipcRenderer.invoke("agent:start-session", projectPath, apiKey, authMethod, sdkSessionId, permissionMode, agentFolderName),
101
+ sendMessage: (sessionId, message) => electron.ipcRenderer.invoke("agent:send-message", sessionId, message),
102
+ stopSession: (sessionId) => electron.ipcRenderer.invoke("agent:stop-session", sessionId),
103
+ isSessionActive: (sessionId) => electron.ipcRenderer.invoke("agent:is-session-active", sessionId),
104
+ setPermissionMode: (sessionId, mode) => electron.ipcRenderer.invoke("agent:set-permission-mode", sessionId, mode),
105
+ respondToApproval: (sessionId, requestId, approved) => electron.ipcRenderer.invoke("agent:respond-to-approval", sessionId, requestId, approved),
106
+ onMessageChunk: (callback) => {
107
+ const listener = (_, sessionId, chunk) => callback(sessionId, chunk);
108
+ electron.ipcRenderer.on("agent:message-chunk", listener);
109
+ return listener;
110
+ },
111
+ onMessageComplete: (callback) => {
112
+ const listener = (_, sessionId) => callback(sessionId);
113
+ electron.ipcRenderer.on("agent:message-complete", listener);
114
+ return listener;
115
+ },
116
+ removeMessageChunkListener: (listener) => electron.ipcRenderer.removeListener("agent:message-chunk", listener),
117
+ removeMessageCompleteListener: (listener) => electron.ipcRenderer.removeListener("agent:message-complete", listener)
118
+ },
119
+ // API Key management operations
120
+ keys: {
121
+ hasAnthropicKey: (projectPath) => electron.ipcRenderer.invoke("keys:has-anthropic", projectPath),
122
+ getAnthropicKey: (projectPath) => electron.ipcRenderer.invoke("keys:get-anthropic", projectPath),
123
+ setAnthropicKey: (apiKey, projectPath) => electron.ipcRenderer.invoke("keys:set-anthropic", apiKey, projectPath),
124
+ deleteAnthropicKey: (projectPath) => electron.ipcRenderer.invoke("keys:delete-anthropic", projectPath)
125
+ },
126
+ // Authentication management operations
127
+ auth: {
128
+ checkCliStatus: () => electron.ipcRenderer.invoke("auth:check-cli-status"),
129
+ getPreferredMethod: (projectPath) => electron.ipcRenderer.invoke("auth:get-preferred-method", projectPath),
130
+ setPreferredMethod: (method, projectPath) => electron.ipcRenderer.invoke("auth:set-preferred-method", method, projectPath),
131
+ getAutoFallback: () => electron.ipcRenderer.invoke("auth:get-auto-fallback"),
132
+ setAutoFallback: (enabled) => electron.ipcRenderer.invoke("auth:set-auto-fallback", enabled),
133
+ getCustomCliCommand: () => electron.ipcRenderer.invoke("auth:get-custom-cli-command"),
134
+ setCustomCliCommand: (command) => electron.ipcRenderer.invoke("auth:set-custom-cli-command", command),
135
+ clearCustomCliCommand: () => electron.ipcRenderer.invoke("auth:clear-custom-cli-command")
136
+ },
137
+ // Logs operations
138
+ logs: {
139
+ load: (projectPath) => electron.ipcRenderer.invoke("logs:load", projectPath),
140
+ save: (projectPath, logs) => electron.ipcRenderer.invoke("logs:save", projectPath, logs)
141
+ },
142
+ // Music (offline, workspace-aware)
143
+ music: {
144
+ listTracks: (workspacePath) => electron.ipcRenderer.invoke("music:list-tracks", workspacePath),
145
+ selectTracks: () => electron.ipcRenderer.invoke("music:select-tracks"),
146
+ addTracks: (workspacePath, sourcePaths) => electron.ipcRenderer.invoke("music:add-tracks", workspacePath, sourcePaths),
147
+ ensureWorkspaceMusic: (workspacePath) => electron.ipcRenderer.invoke("music:ensure-workspace-music", workspacePath),
148
+ getWorkspaceMusicPath: (workspacePath) => electron.ipcRenderer.invoke("music:get-workspace-music-path", workspacePath),
149
+ readTrack: (filePath) => electron.ipcRenderer.invoke("music:read-track", filePath)
150
+ },
151
+ // Icon Management operations (Global Storage)
152
+ icons: {
153
+ list: () => electron.ipcRenderer.invoke("icons:list"),
154
+ add: (sourcePath) => electron.ipcRenderer.invoke("icons:add", sourcePath),
155
+ delete: (fileName) => electron.ipcRenderer.invoke("icons:delete", fileName),
156
+ selectFiles: () => electron.ipcRenderer.invoke("icons:select-files"),
157
+ readFile: (filePath) => electron.ipcRenderer.invoke("icons:read-file", filePath)
158
+ },
159
+ // Global Node Library operations
160
+ nodeLibrary: {
161
+ // MCP operations
162
+ mcp: {
163
+ list: () => electron.ipcRenderer.invoke("nodeLibrary:mcp:list"),
164
+ get: (id) => electron.ipcRenderer.invoke("nodeLibrary:mcp:get", id),
165
+ create: (data) => electron.ipcRenderer.invoke("nodeLibrary:mcp:create", data),
166
+ update: (id, data) => electron.ipcRenderer.invoke("nodeLibrary:mcp:update", id, data),
167
+ delete: (id) => electron.ipcRenderer.invoke("nodeLibrary:mcp:delete", id)
168
+ },
169
+ // Hook operations (legacy)
170
+ hook: {
171
+ list: () => electron.ipcRenderer.invoke("nodeLibrary:hook:list"),
172
+ get: (id) => electron.ipcRenderer.invoke("nodeLibrary:hook:get", id),
173
+ create: (data) => electron.ipcRenderer.invoke("nodeLibrary:hook:create", data),
174
+ update: (id, data) => electron.ipcRenderer.invoke("nodeLibrary:hook:update", id, data),
175
+ delete: (id) => electron.ipcRenderer.invoke("nodeLibrary:hook:delete", id)
176
+ },
177
+ // Hook Config operations (new Claude Code format)
178
+ hookconfig: {
179
+ list: () => electron.ipcRenderer.invoke("nodeLibrary:hookconfig:list"),
180
+ get: (id) => electron.ipcRenderer.invoke("nodeLibrary:hookconfig:get", id),
181
+ create: (data) => electron.ipcRenderer.invoke("nodeLibrary:hookconfig:create", data),
182
+ update: (id, data) => electron.ipcRenderer.invoke("nodeLibrary:hookconfig:update", id, data),
183
+ delete: (id) => electron.ipcRenderer.invoke("nodeLibrary:hookconfig:delete", id)
184
+ },
185
+ // SubAgent operations
186
+ subagent: {
187
+ list: () => electron.ipcRenderer.invoke("nodeLibrary:subagent:list"),
188
+ get: (id) => electron.ipcRenderer.invoke("nodeLibrary:subagent:get", id),
189
+ create: (data) => electron.ipcRenderer.invoke("nodeLibrary:subagent:create", data),
190
+ update: (id, data) => electron.ipcRenderer.invoke("nodeLibrary:subagent:update", id, data),
191
+ delete: (id) => electron.ipcRenderer.invoke("nodeLibrary:subagent:delete", id)
192
+ },
193
+ // Command operations
194
+ command: {
195
+ list: () => electron.ipcRenderer.invoke("nodeLibrary:command:list"),
196
+ get: (id) => electron.ipcRenderer.invoke("nodeLibrary:command:get", id),
197
+ create: (data) => electron.ipcRenderer.invoke("nodeLibrary:command:create", data),
198
+ update: (id, data) => electron.ipcRenderer.invoke("nodeLibrary:command:update", id, data),
199
+ delete: (id) => electron.ipcRenderer.invoke("nodeLibrary:command:delete", id)
200
+ },
201
+ // Skill operations (folder-based)
202
+ skill: {
203
+ list: () => electron.ipcRenderer.invoke("nodeLibrary:skill:list"),
204
+ get: (id) => electron.ipcRenderer.invoke("nodeLibrary:skill:get", id),
205
+ create: (data) => electron.ipcRenderer.invoke("nodeLibrary:skill:create", data),
206
+ update: (id, data) => electron.ipcRenderer.invoke("nodeLibrary:skill:update", id, data),
207
+ delete: (id) => electron.ipcRenderer.invoke("nodeLibrary:skill:delete", id),
208
+ addFile: (id, fileType, sourcePath, fileName) => electron.ipcRenderer.invoke("nodeLibrary:skill:addFile", id, fileType, sourcePath, fileName),
209
+ deleteFile: (id, fileType, fileName) => electron.ipcRenderer.invoke("nodeLibrary:skill:deleteFile", id, fileType, fileName),
210
+ copyToProject: (skillId, projectPath, forceSync, targetFolderName) => electron.ipcRenderer.invoke("nodeLibrary:skill:copyToProject", skillId, projectPath, forceSync, targetFolderName)
211
+ },
212
+ // Memory operations (folder-based)
213
+ memory: {
214
+ list: () => electron.ipcRenderer.invoke("nodeLibrary:memory:list"),
215
+ get: (id) => electron.ipcRenderer.invoke("nodeLibrary:memory:get", id),
216
+ create: (data) => electron.ipcRenderer.invoke("nodeLibrary:memory:create", data),
217
+ update: (id, data) => electron.ipcRenderer.invoke("nodeLibrary:memory:update", id, data),
218
+ delete: (id) => electron.ipcRenderer.invoke("nodeLibrary:memory:delete", id),
219
+ addFile: (id, sourcePath, fileName, title, description) => electron.ipcRenderer.invoke("nodeLibrary:memory:addFile", id, sourcePath, fileName, title, description),
220
+ deleteFile: (id, fileName) => electron.ipcRenderer.invoke("nodeLibrary:memory:deleteFile", id, fileName),
221
+ copyToProject: (memoryId, projectPath, forceSync, targetFolderName) => electron.ipcRenderer.invoke(
222
+ "nodeLibrary:memory:copyToProject",
223
+ memoryId,
224
+ projectPath,
225
+ forceSync,
226
+ targetFolderName
227
+ )
228
+ },
229
+ // Migration
230
+ migrate: {
231
+ fromNodeData: () => electron.ipcRenderer.invoke("nodeLibrary:migrate:fromNodeData")
232
+ }
233
+ },
234
+ // App management
235
+ app: {
236
+ clearCache: () => electron.ipcRenderer.invoke("app:clear-cache"),
237
+ restart: () => electron.ipcRenderer.invoke("app:restart")
238
+ }
239
+ };
240
+ if (process.contextIsolated) {
241
+ try {
242
+ electron.contextBridge.exposeInMainWorld("electron", preload.electronAPI);
243
+ electron.contextBridge.exposeInMainWorld("api", api);
244
+ } catch (error) {
245
+ console.error(error);
246
+ }
247
+ } else {
248
+ window.electron = preload.electronAPI;
249
+ window.api = api;
250
+ }
@@ -0,0 +1,179 @@
1
+ function generateClaudeFolder(nodes, edges, _projectName) {
2
+ const mainCard = nodes.find((n) => n.id === "main-card");
3
+ if (!mainCard) {
4
+ throw new Error("Main agent card not found in workflow");
5
+ }
6
+ const connections = categorizeConnections(nodes, edges);
7
+ const mainAgent = buildMainAgent(mainCard);
8
+ const settings = {
9
+ version: "1.0",
10
+ agents: [mainAgent],
11
+ skills: connections.skills.map((skill) => ({
12
+ id: skill.id,
13
+ path: `skills/${skill.fileName}`,
14
+ enabled: true
15
+ })),
16
+ memory: connections.memory.map((mem) => ({
17
+ id: mem.id,
18
+ path: `memory/${mem.fileName}`,
19
+ type: mem.type || "markdown"
20
+ }))
21
+ };
22
+ const agents = /* @__PURE__ */ new Map();
23
+ agents.set("main", generateAgentFile(mainAgent));
24
+ connections.subagents.forEach((subagent) => {
25
+ const subagentDef = buildSubagent(subagent);
26
+ agents.set(subagent.id, generateAgentFile(subagentDef));
27
+ settings.agents.push(subagentDef);
28
+ });
29
+ const skills = /* @__PURE__ */ new Map();
30
+ connections.skills.forEach((skill) => {
31
+ skills.set(skill.fileName, skill.content || "");
32
+ });
33
+ const memory = /* @__PURE__ */ new Map();
34
+ connections.memory.forEach((mem) => {
35
+ memory.set(mem.fileName, mem.content || "");
36
+ });
37
+ const settingsLocal = {
38
+ ...mainCard.data.claudeSettings || {}
39
+ };
40
+ delete settingsLocal.mcpServers;
41
+ delete settingsLocal.enableAllProjectMcpServers;
42
+ if (connections.hooks.length > 0) {
43
+ const mergedHooks = {};
44
+ connections.hooks.forEach((hookNode) => {
45
+ if (hookNode.hooks && typeof hookNode.hooks === "object") {
46
+ Object.entries(hookNode.hooks).forEach(([eventType, entries]) => {
47
+ if (!mergedHooks[eventType]) {
48
+ mergedHooks[eventType] = [];
49
+ }
50
+ if (Array.isArray(entries)) {
51
+ mergedHooks[eventType].push(...entries);
52
+ }
53
+ });
54
+ }
55
+ });
56
+ if (Object.keys(mergedHooks).length > 0) {
57
+ settingsLocal.hooks = mergedHooks;
58
+ }
59
+ }
60
+ const mcpJson = connections.mcp.length > 0 ? {
61
+ mcpServers: connections.mcp.reduce((acc, mcp) => {
62
+ acc[mcp.name || mcp.label || mcp.id] = {
63
+ command: mcp.command || "",
64
+ args: mcp.args || [],
65
+ ...mcp.env && { env: mcp.env }
66
+ };
67
+ return acc;
68
+ }, {})
69
+ } : void 0;
70
+ return {
71
+ settings,
72
+ settingsLocal,
73
+ mcpJson,
74
+ agents,
75
+ skills,
76
+ memory
77
+ };
78
+ }
79
+ function categorizeConnections(nodes, edges) {
80
+ const connections = {
81
+ interface: [],
82
+ memory: [],
83
+ skills: [],
84
+ mcp: [],
85
+ subagents: [],
86
+ hooks: []
87
+ };
88
+ const mainCardEdges = edges.filter((edge) => edge.source === "main-card");
89
+ mainCardEdges.forEach((edge) => {
90
+ const targetNode = nodes.find((n) => n.id === edge.target);
91
+ if (!targetNode) return;
92
+ switch (edge.sourceHandle) {
93
+ case "top-left":
94
+ connections.hooks.push(extractNodeData(targetNode));
95
+ break;
96
+ case "bottom-left":
97
+ connections.memory.push(extractNodeData(targetNode));
98
+ break;
99
+ case "right-center":
100
+ connections.skills.push(extractNodeData(targetNode));
101
+ break;
102
+ case "top-right":
103
+ connections.mcp.push(extractNodeData(targetNode));
104
+ break;
105
+ case "bottom-center":
106
+ connections.subagents.push(extractNodeData(targetNode));
107
+ break;
108
+ }
109
+ });
110
+ return connections;
111
+ }
112
+ function extractNodeData(node) {
113
+ const { label: _originalLabel, ...restData } = node.data;
114
+ return {
115
+ id: node.id,
116
+ type: node.type,
117
+ label: node.data.label || node.id,
118
+ ...restData
119
+ };
120
+ }
121
+ function buildMainAgent(mainCard, _connections) {
122
+ const data = mainCard.data;
123
+ return {
124
+ id: "main",
125
+ name: data.name || data.label || "Main Agent",
126
+ description: data.description || "Main agent for this workflow",
127
+ systemPrompt: data.systemPrompt || data.agentDefinition || "",
128
+ temperature: data.temperature || 0.7,
129
+ maxTokens: data.maxTokens || 4096,
130
+ tools: Array.isArray(data.tools) ? data.tools : data.tools ? [data.tools] : []
131
+ };
132
+ }
133
+ function buildSubagent(subagentData) {
134
+ return {
135
+ id: subagentData.id,
136
+ name: subagentData.label || subagentData.name || subagentData.id,
137
+ description: subagentData.description || "",
138
+ systemPrompt: subagentData.systemPrompt || subagentData.agentDefinition || "",
139
+ temperature: subagentData.temperature || 0.7,
140
+ maxTokens: subagentData.maxTokens || 4096,
141
+ tools: subagentData.tools || []
142
+ };
143
+ }
144
+ function generateAgentFile(agent) {
145
+ return `# ${agent.name}
146
+
147
+ ${agent.description || ""}
148
+
149
+ ## System Prompt
150
+
151
+ ${agent.systemPrompt || "No system prompt defined."}
152
+
153
+ ## Configuration
154
+
155
+ - Temperature: ${agent.temperature}
156
+ - Max Tokens: ${agent.maxTokens}
157
+ - Tools: ${agent.tools?.join(", ") || "None"}
158
+ `;
159
+ }
160
+ function validateExportData(exportData) {
161
+ const errors = [];
162
+ if (!exportData.settings) {
163
+ errors.push("Missing settings");
164
+ }
165
+ if (!exportData.settings.agents || exportData.settings.agents.length === 0) {
166
+ errors.push("No agents defined");
167
+ }
168
+ if (!exportData.agents.has("main")) {
169
+ errors.push("Main agent file not generated");
170
+ }
171
+ return {
172
+ valid: errors.length === 0,
173
+ errors
174
+ };
175
+ }
176
+ export {
177
+ generateClaudeFolder,
178
+ validateExportData
179
+ };