|
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 || {}; |
|
|
|
|
|
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(), |
|
}; |
|
} |
|
|