ai-expert
Version:
AI Expert CLI - Advanced management system for specialized Claude assistants
143 lines • 5.48 kB
JavaScript
export class ExpertBuilder {
storage;
constructor(storage) {
this.storage = storage;
}
async buildExpertPrompt(expert) {
let systemPrompt = '';
// 1. Get base system from context or expert
if (expert.baseSystemId) {
const system = await this.storage.getSystem(expert.baseSystemId);
if (system) {
systemPrompt = system.content;
}
}
else if (expert.baseContextId) {
const context = await this.storage.getContext(expert.baseContextId);
if (context?.systemTemplateId) {
const system = await this.storage.getSystem(context.systemTemplateId);
if (system) {
systemPrompt = system.content;
}
}
}
// 2. Apply context rules and content
if (expert.baseContextId) {
const context = await this.storage.getContext(expert.baseContextId);
if (context) {
systemPrompt = await this.applyContext(systemPrompt, context);
}
}
// 3. Apply expert-specific rules
if (expert.additionalRules.length > 0) {
systemPrompt += '\n\nREGRAS ESPECÍFICAS DO ESPECIALISTA:';
for (const rule of expert.additionalRules) {
systemPrompt += `\n- ${rule.content}`;
}
}
// 4. Add expert-specific context
if (expert.additionalContext) {
systemPrompt = this.addAdditionalContext(systemPrompt, expert.additionalContext);
}
return systemPrompt;
}
async applyContext(basePrompt, context) {
let prompt = basePrompt;
// Add rules
if (context.rules.length > 0) {
prompt += '\n\nREGRAS DO CONTEXTO:';
for (const rule of context.rules) {
prompt += `\n- [${rule.category.toUpperCase()}] ${rule.content}`;
}
}
// Add concepts
if (context.concepts.length > 0) {
prompt += '\n\nCONCEITOS:';
for (const concept of context.concepts) {
prompt += `\n- ${concept}`;
}
}
// Add patterns
if (context.patterns.length > 0) {
prompt += '\n\nPADRÕES:';
for (const pattern of context.patterns) {
prompt += `\n- ${pattern}`;
}
}
// Add examples
if (context.examples.length > 0) {
prompt += '\n\nEXEMPLOS:';
for (const example of context.examples) {
prompt += `\n\n### ${example.name}`;
if (example.description) {
prompt += `\n${example.description}`;
}
prompt += `\n\`\`\`${example.language || ''}\n${example.code}\n\`\`\``;
}
}
// Add custom variables
if (context.customVariables && Object.keys(context.customVariables).length > 0) {
prompt += `\n\nVARIÁVEIS CUSTOMIZADAS:\n${JSON.stringify(context.customVariables, null, 2)}`;
}
return prompt;
}
addAdditionalContext(prompt, additionalContext) {
let result = prompt;
if (additionalContext.concepts.length > 0) {
result += '\n\nCONCEITOS ADICIONAIS:';
for (const concept of additionalContext.concepts) {
result += `\n- ${concept}`;
}
}
if (additionalContext.patterns.length > 0) {
result += '\n\nPADRÕES ADICIONAIS:';
for (const pattern of additionalContext.patterns) {
result += `\n- ${pattern}`;
}
}
if (additionalContext.examples.length > 0) {
result += '\n\nEXEMPLOS ADICIONAIS:';
for (const example of additionalContext.examples) {
result += `\n\n### ${example.name}`;
if (example.description) {
result += `\n${example.description}`;
}
result += `\n\`\`\`${example.language || ''}\n${example.code}\n\`\`\``;
}
}
if (additionalContext.customVariables && Object.keys(additionalContext.customVariables).length > 0) {
result += `\n\nVARIÁVEIS ADICIONAIS:\n${JSON.stringify(additionalContext.customVariables, null, 2)}`;
}
return result;
}
async createExpert(name, description, options = {}) {
const slug = name.toLowerCase().replace(/\s+/g, '-');
const id = `${slug}-${Date.now()}`;
const expert = {
id,
name,
slug,
description,
baseContextId: options.baseContextId,
baseSystemId: options.baseSystemId,
systemPrompt: '', // Will be computed
additionalRules: options.additionalRules || [],
additionalContext: {
concepts: [],
patterns: [],
examples: [],
customVariables: {}
},
category: options.category || 'custom',
tags: options.tags || [],
created: new Date().toISOString(),
usageCount: 0
};
// Build the system prompt
expert.systemPrompt = await this.buildExpertPrompt(expert);
// Save the expert
await this.storage.saveExpert(expert);
return expert;
}
}
//# sourceMappingURL=expert-builder.js.map