mirror of
https://github.com/coleam00/bolt.new-any-llm
synced 2024-12-28 06:42:56 +00:00
81 lines
2.2 KiB
TypeScript
81 lines
2.2 KiB
TypeScript
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(),
|
|
};
|
|
}
|