prompter-framework
Version:
Meta-framework for generating structured AI agent prompts with built-in context switching, validation checkpoints, and failure recovery strategies
149 lines (136 loc) • 5.04 kB
JavaScript
import React from 'react';
import { taskTypes, priorityLevels, complexityLevels } from './src/data/taskTypes.js';
const TaskForm = ({ formData, setFormData, onGenerate }) => {
const handleInputChange = (field, value, index = null) => {
if (index !== null) {
const newArray = [...formData[field]];
newArray[index] = value;
setFormData(prev => ({ ...prev, [field]: newArray }));
} else {
setFormData(prev => ({ ...prev, [field]: value }));
}
};
const addArrayItem = (field) => {
setFormData(prev => ({ ...prev, [field]: [...prev[field], ''] }));
};
const removeArrayItem = (field, index) => {
setFormData(prev => ({
...prev,
[field]: prev[field].filter((_, i) => i !== index)
}));
};
const ArrayInput = ({ field, label, placeholder }) => (
<div>
<label className="block text-sm font-medium text-gray-700 mb-2">{label}</label>
{formData[field].map((item, index) => (
<div key={index} className="flex gap-2 mb-2">
<input
type="text"
value={item}
onChange={(e) => handleInputChange(field, e.target.value, index)}
placeholder={`${placeholder} ${index + 1}`}
className="flex-1 p-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500"
/>
{formData[field].length > 1 && (
<button
onClick={() => removeArrayItem(field, index)}
className="px-3 py-2 bg-red-500 text-white rounded-md hover:bg-red-600"
>
×
</button>
)}
</div>
))}
<button
onClick={() => addArrayItem(field)}
className="text-blue-600 hover:text-blue-800 text-sm"
>
+ Add {placeholder}
</button>
</div>
);
return (
<div className="space-y-6">
<div>
<label className="block text-sm font-medium text-gray-700 mb-2">Task Type</label>
<select
value={formData.taskType}
onChange={(e) => handleInputChange('taskType', e.target.value)}
className="w-full p-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500"
>
{Object.entries(taskTypes).map(([key, value]) => (
<option key={key} value={key}>{value}</option>
))}
</select>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-2">Task Title</label>
<input
type="text"
value={formData.taskTitle}
onChange={(e) => handleInputChange('taskTitle', e.target.value)}
placeholder="e.g., Implement user authentication API"
className="w-full p-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500"
/>
</div>
<div className="grid grid-cols-2 gap-4">
<div>
<label className="block text-sm font-medium text-gray-700 mb-2">Task ID</label>
<input
type="text"
value={formData.taskId}
onChange={(e) => handleInputChange('taskId', e.target.value)}
placeholder="e.g., #617"
className="w-full p-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500"
/>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-2">Priority</label>
<select
value={formData.priority}
onChange={(e) => handleInputChange('priority', e.target.value)}
className="w-full p-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500"
>
{priorityLevels.map(level => (
<option key={level} value={level}>{level.charAt(0).toUpperCase() + level.slice(1)}</option>
))}
</select>
</div>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-2">Complexity</label>
<select
value={formData.complexity}
onChange={(e) => handleInputChange('complexity', e.target.value)}
className="w-full p-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500"
>
{complexityLevels.map(level => (
<option key={level} value={level}>{level.charAt(0).toUpperCase() + level.slice(1)}</option>
))}
</select>
</div>
<ArrayInput
field="requirements"
label="Core Requirements"
placeholder="Requirement"
/>
<ArrayInput
field="constraints"
label="Technical Constraints"
placeholder="Constraint"
/>
<ArrayInput
field="resources"
label="Key Resources/Files"
placeholder="Resource"
/>
<button
onClick={onGenerate}
className="w-full bg-blue-600 text-white py-3 px-4 rounded-md hover:bg-blue-700"
>
Generate Prompt
</button>
</div>
);
};
export default TaskForm;