Spaces:
Running
Running
| import type { Message } from 'ai'; | |
| import { generateId } from './fileUtils'; | |
| export interface ProjectCommands { | |
| type: string; | |
| setupCommand: string; | |
| followupMessage: string; | |
| } | |
| interface FileContent { | |
| content: string; | |
| path: string; | |
| } | |
| export async function detectProjectCommands(files: FileContent[]): Promise<ProjectCommands> { | |
| const hasFile = (name: string) => files.some((f) => f.path.endsWith(name)); | |
| if (hasFile('package.json')) { | |
| const packageJsonFile = files.find((f) => f.path.endsWith('package.json')); | |
| if (!packageJsonFile) { | |
| return { type: '', setupCommand: '', followupMessage: '' }; | |
| } | |
| try { | |
| const packageJson = JSON.parse(packageJsonFile.content); | |
| const scripts = packageJson?.scripts || {}; | |
| // Check for preferred commands in priority order | |
| const preferredCommands = ['dev', 'start', 'preview']; | |
| const availableCommand = preferredCommands.find((cmd) => scripts[cmd]); | |
| if (availableCommand) { | |
| return { | |
| type: 'Node.js', | |
| setupCommand: `npm install && npm run ${availableCommand}`, | |
| followupMessage: `Found "${availableCommand}" script in package.json. Running "npm run ${availableCommand}" after installation.`, | |
| }; | |
| } | |
| return { | |
| type: 'Node.js', | |
| setupCommand: 'npm install', | |
| followupMessage: | |
| 'Would you like me to inspect package.json to determine the available scripts for running this project?', | |
| }; | |
| } catch (error) { | |
| console.error('Error parsing package.json:', error); | |
| return { type: '', setupCommand: '', followupMessage: '' }; | |
| } | |
| } | |
| if (hasFile('index.html')) { | |
| return { | |
| type: 'Static', | |
| setupCommand: 'npx --yes serve', | |
| followupMessage: '', | |
| }; | |
| } | |
| return { type: '', setupCommand: '', followupMessage: '' }; | |
| } | |
| export function createCommandsMessage(commands: ProjectCommands): Message | null { | |
| if (!commands.setupCommand) { | |
| return null; | |
| } | |
| return { | |
| role: 'assistant', | |
| content: ` | |
| <boltArtifact id="project-setup" title="Project Setup"> | |
| <boltAction type="shell"> | |
| ${commands.setupCommand} | |
| </boltAction> | |
| </boltArtifact>${commands.followupMessage ? `\n\n${commands.followupMessage}` : ''}`, | |
| id: generateId(), | |
| createdAt: new Date(), | |
| }; | |
| } | |