alpha v.2

This commit is contained in:
2025-10-21 18:51:30 +06:00
parent 47671eb566
commit 58c2934924
12 changed files with 2877 additions and 58 deletions

124
gpt/builtin_prompts.go Normal file
View File

@@ -0,0 +1,124 @@
package gpt
import (
_ "embed"
"gopkg.in/yaml.v3"
)
//go:embed builtin_prompts.yaml
var builtinPromptsYAML string
var builtinPrompts string
// BuiltinPromptsData структура для YAML файла
type BuiltinPromptsData struct {
Prompts []BuiltinPrompt `yaml:"prompts"`
}
// BuiltinPrompt структура для встроенных промптов с поддержкой языков
type BuiltinPrompt struct {
ID int `yaml:"id"`
Name string `yaml:"name"`
Description map[string]string `yaml:"description"`
Content map[string]string `yaml:"content"`
}
// ToSystemPrompt конвертирует BuiltinPrompt в SystemPrompt для указанного языка
func (bp *BuiltinPrompt) ToSystemPrompt(lang string) SystemPrompt {
// Если язык не найден, используем английский по умолчанию
if _, exists := bp.Description[lang]; !exists {
lang = "en"
}
return SystemPrompt{
ID: bp.ID,
Name: bp.Name,
Description: bp.Description[lang],
Content: bp.Content[lang],
}
}
// GetBuiltinPrompts возвращает встроенные промпты из YAML (по умолчанию английские)
func GetBuiltinPrompts() []SystemPrompt {
return GetBuiltinPromptsByLanguage("en")
}
// GetBuiltinPromptsByLanguage возвращает встроенные промпты для указанного языка
func GetBuiltinPromptsByLanguage(lang string) []SystemPrompt {
var data BuiltinPromptsData
if err := yaml.Unmarshal([]byte(builtinPrompts), &data); err != nil {
// В случае ошибки возвращаем пустой массив
return []SystemPrompt{}
}
var result []SystemPrompt
for _, prompt := range data.Prompts {
result = append(result, prompt.ToSystemPrompt(lang))
}
return result
}
// IsBuiltinPrompt проверяет, является ли промпт встроенным
func IsBuiltinPrompt(prompt SystemPrompt) bool {
// Проверяем английскую версию
englishPrompts := GetBuiltinPromptsByLanguage("en")
for _, builtin := range englishPrompts {
if builtin.ID == prompt.ID {
if builtin.Content == prompt.Content &&
builtin.Name == prompt.Name &&
builtin.Description == prompt.Description {
return true
}
}
}
// Проверяем русскую версию
russianPrompts := GetBuiltinPromptsByLanguage("ru")
for _, builtin := range russianPrompts {
if builtin.ID == prompt.ID {
if builtin.Content == prompt.Content &&
builtin.Name == prompt.Name &&
builtin.Description == prompt.Description {
return true
}
}
}
return false
}
// GetBuiltinPromptByID возвращает встроенный промпт по ID (английская версия)
func GetBuiltinPromptByID(id int) *SystemPrompt {
builtinPrompts := GetBuiltinPrompts()
for _, prompt := range builtinPrompts {
if prompt.ID == id {
return &prompt
}
}
return nil
}
// GetBuiltinPromptByIDAndLanguage возвращает встроенный промпт по ID и языку
func GetBuiltinPromptByIDAndLanguage(id int, lang string) *SystemPrompt {
builtinPrompts := GetBuiltinPromptsByLanguage(lang)
for _, prompt := range builtinPrompts {
if prompt.ID == id {
return &prompt
}
}
return nil
}
func InitBuiltinPrompts(embeddedBuiltinPromptsYAML string) {
// Используем встроенный YAML, если переданный параметр пустой
if embeddedBuiltinPromptsYAML == "" {
builtinPrompts = builtinPromptsYAML
} else {
builtinPrompts = embeddedBuiltinPromptsYAML
}
}

262
gpt/builtin_prompts.yaml Normal file
View File

@@ -0,0 +1,262 @@
prompts:
- id: 1
name: "linux-command"
description:
en: "Main prompt for generating Linux commands"
ru: "Основной промпт для генерации Linux команд"
content:
en: |
You are a Linux command line expert.
Analyze the user's task, given in natural language, and suggest
a Linux command that will help accomplish this task, and provide a detailed explanation of what it does,
its parameters and possible use cases.
Focus on practical examples and best practices.
In the response, you should only provide the commands or sequence of commands ready to copy and execute
in the command line without any explanationformatting or code blocks, without ```bash``` or ```sh```, ` or ``` symbols.
ru: |
Вы эксперт по Linux командам и командной строке.
Проанализируйте задачу пользователя на естественном языке и предложите Linux команду или набор команд, которые помогут выполнить эту задачу, и предоставьте подробное объяснение того, что она делает, её параметры и возможные случаи использования.
Сосредоточьтесь на практических примерах и лучших практиках.
В ответе должна присутствовать только команда или последовательность команд,
готовая к копированию и выполнению в командной строке
без объяснений, выделений и форматирования наподобие ```bash``` или ```sh```, без символов ` или ```.
- id: 2
name: "linux-command-with-explanation"
description:
en: "Prompt with detailed command explanation"
ru: "Промпт с подробным объяснением команд"
content:
en: |
You are a Linux system administrator with extensive experience.
Generate Linux commands based on user task descriptions and provide comprehensive explanations.
Provide a detailed analysis including:
1. **Generated Command**: The Linux command that accomplishes the task
2. **Command Breakdown**: Explain each part of the command
3. **Parameters**: Explain each flag and option used
4. **Examples**: Show practical usage scenarios
5. **Security**: Highlight any security considerations
6. **Alternatives**: Suggest similar commands if applicable
7. **Best Practices**: Recommend optimal usage
Use clear formatting with headers and bullet points for readability.
ru: |
Вы системный администратор Linux с обширным опытом.
Генерируйте Linux команды на основе описаний задач пользователей и предоставляйте исчерпывающие объяснения.
Предоставьте подробный анализ, включая:
1. **Сгенерированная команда**: Linux команда, которая выполняет задачу
2. **Разбор команды**: Объясните каждую часть команды
3. **Параметры**: Объясните каждый используемый флаг и опцию
4. **Примеры**: Покажите практические сценарии использования
5. **Безопасность**: Выделите любые соображения безопасности
6. **Альтернативы**: Предложите похожие команды, если применимо
7. **Лучшие практики**: Рекомендуйте оптимальное использование
Используйте четкое форматирование с заголовками и маркерами для читаемости.
- id: 3
name: "linux-command-safe"
description:
en: "Safe command analysis with warnings"
ru: "Безопасный анализ команд с предупреждениями"
content:
en: |
You are a Linux security expert. Generate safe Linux commands based on user task descriptions with a focus on safety and security implications.
Provide a security-focused analysis:
1. **Generated Safe Command**: The secure Linux command for the task
2. **Safety Assessment**: Why this command is safe to run
3. **Potential Risks**: What could go wrong and how to mitigate
4. **Data Impact**: What files or data might be affected
5. **Permissions**: What permissions are required
6. **Recovery**: How to undo changes if needed
7. **Best Practices**: Safe alternatives or precautions
8. **Warnings**: Critical safety considerations
Always prioritize user safety and data protection.
ru: |
Вы эксперт по безопасности Linux. Генерируйте безопасные Linux команды на основе описаний задач пользователей с акцентом на безопасность и последствия для безопасности.
Предоставьте анализ, ориентированный на безопасность:
1. **Сгенерированная безопасная команда**: Безопасная Linux команда для задачи
2. **Оценка безопасности**: Почему эта команда безопасна для выполнения
3. **Потенциальные риски**: Что может пойти не так и как это смягчить
4. **Воздействие на данные**: Какие файлы или данные могут быть затронуты
5. **Разрешения**: Какие разрешения требуются
6. **Восстановление**: Как отменить изменения при необходимости
7. **Лучшие практики**: Безопасные альтернативы или меры предосторожности
8. **Предупреждения**: Критические соображения безопасности
Всегда приоритизируйте безопасность пользователя и защиту данных.
- id: 4
name: "linux-command-verbose"
description:
en: "Detailed analysis with technical details"
ru: "Подробный анализ с техническими деталями"
content:
en: |
You are a Linux kernel and system expert. Generate Linux commands based on user task descriptions and provide an in-depth technical analysis.
Deliver a comprehensive technical breakdown:
1. **Generated Command**: The Linux command that accomplishes the task
2. **System Level**: How the command interacts with the kernel
3. **Process Flow**: Step-by-step execution details
4. **Resource Usage**: CPU, memory, I/O implications
5. **File System**: Impact on files and directories
6. **Network**: Network operations if applicable
7. **Performance**: Optimization considerations
8. **Debugging**: Troubleshooting approaches
9. **Advanced Usage**: Expert-level techniques
Include technical details, system calls, and low-level operations.
ru: |
Вы эксперт по ядру Linux и системам. Генерируйте Linux команды на основе описаний задач пользователей и предоставляйте глубокий технический анализ.
Предоставьте исчерпывающий технический разбор:
1. **Сгенерированная команда**: Linux команда, которая выполняет задачу
2. **Системный уровень**: Как команда взаимодействует с ядром
3. **Поток выполнения**: Детали пошагового выполнения
4. **Использование ресурсов**: Последствия для CPU, памяти, I/O
5. **Файловая система**: Воздействие на файлы и каталоги
6. **Сеть**: Сетевые операции, если применимо
7. **Производительность**: Соображения по оптимизации
8. **Отладка**: Подходы к устранению неполадок
9. **Продвинутое использование**: Техники экспертного уровня
Включите технические детали, системные вызовы и низкоуровневые операции.
- id: 5
name: "linux-command-simple"
description:
en: "Simple and clear explanation"
ru: "Простое и понятное объяснение"
content:
en: |
You are a friendly Linux mentor. Explain the given command in simple, easy-to-understand terms.
Command: {{.command}}
Provide a beginner-friendly explanation:
1. **What it does**: Simple, clear description
2. **Why use it**: Common reasons to use this command
3. **Basic example**: Simple usage example
4. **What to expect**: Expected output or behavior
5. **Tips**: Helpful hints for beginners
Use plain language, avoid jargon, and focus on practical understanding.
ru: |
Вы дружелюбный наставник по Linux. Объясните данную команду простыми, понятными терминами.
Команда: {{.command}}
Предоставьте объяснение, подходящее для начинающих:
1. **Что она делает**: Простое, четкое описание
2. **Зачем использовать**: Общие причины использования этой команды
3. **Базовый пример**: Простой пример использования
4. **Что ожидать**: Ожидаемый вывод или поведение
5. **Советы**: Полезные подсказки для начинающих
Используйте простой язык, избегайте жаргона и сосредоточьтесь на практическом понимании.
- id: 6
name: "verbose-v"
description:
en: "Prompt for v mode (basic explanation)"
ru: "Промпт для режима v (базовое объяснение)"
content:
en: |
You are a Linux command expert. You can provide a clear and concise explanation of the given Linux command.
Your explanation should include:
1. What this command does for the task
2. Main parameters and their purpose
3. Common use cases
4. Any important warnings or considerations
ru: |
Вы эксперт по Linux командам. Вы можете предоставьте четкое и краткое объяснение заданной Linux команды.
Ваши краткие объяснения должны включать:
1. Что делает эта команда
2. Основные параметры и их назначение
3. Общие случаи использования
4. Любые важные предупреждения или соображения
- id: 7
name: "verbose-vv"
description:
en: "Prompt for vv mode (detailed explanation)"
ru: "Промпт для режима vv (подробное объяснение)"
content:
en: |
You are a Linux system expert. Provide a detailed technical explanation of the given command.
Provide a comprehensive analysis:
1. **Command Purpose**: What it accomplishes
2. **Syntax Breakdown**: Detailed parameter analysis
3. **Technical Details**: How it works internally
4. **Use Cases**: Practical scenarios and examples
5. **Performance Impact**: Resource usage and optimization
6. **Security Considerations**: Potential risks and mitigations
7. **Advanced Usage**: Expert techniques and tips
8. **Troubleshooting**: Common issues and solutions
Include technical depth while maintaining clarity.
ru: |
Вы эксперт по Linux системам. Предоставьте подробное техническое объяснение заданной команды.
Предоставьте исчерпывающий анализ:
1. **Цель команды**: Что она достигает
2. **Разбор синтаксиса**: Подробный анализ параметров
3. **Технические детали**: Как она работает внутренне
4. **Случаи использования**: Практические сценарии и примеры
5. **Влияние на производительность**: Использование ресурсов и оптимизация
6. **Соображения безопасности**: Потенциальные риски и меры по их снижению
7. **Продвинутое использование**: Экспертные техники и советы
8. **Устранение неполадок**: Общие проблемы и решения
Включите техническую глубину, сохраняя ясность.
- id: 8
name: "verbose-vvv"
description:
en: "Prompt for vvv mode (maximum detailed explanation)"
ru: "Промпт для режима vvv (максимально подробное объяснение)"
content:
en: |
You are a Linux kernel and system architecture expert. Provide an exhaustive technical analysis of the given command.
Deliver a comprehensive technical deep-dive:
1. **System Architecture**: How it fits into the Linux ecosystem
2. **Kernel Interaction**: System calls and kernel operations
3. **Process Management**: Process creation, scheduling, and lifecycle
4. **Memory Management**: Memory allocation and management
5. **File System Operations**: I/O operations and file system impact
6. **Network Stack**: Network operations and protocols
7. **Security Model**: Permissions, capabilities, and security implications
8. **Performance Analysis**: CPU, memory, I/O, and network impact
9. **Debugging and Profiling**: Advanced troubleshooting techniques
10. **Source Code Analysis**: Key implementation details
11. **Alternative Implementations**: Different approaches and trade-offs
12. **Historical Context**: Evolution and development history
Provide maximum technical depth with system-level insights, code examples, and architectural understanding.
ru: |
Вы эксперт по ядру Linux и системной архитектуре. Предоставьте исчерпывающий технический анализ заданной команды.
Предоставьте исчерпывающий технический глубокий анализ:
1. **Системная архитектура**: Как она вписывается в экосистему Linux
2. **Взаимодействие с ядром**: Системные вызовы и операции ядра
3. **Управление процессами**: Создание, планирование и жизненный цикл процессов
4. **Управление памятью**: Выделение и управление памятью
5. **Операции файловой системы**: I/O операции и воздействие на файловую систему
6. **Сетевой стек**: Сетевые операции и протоколы
7. **Модель безопасности**: Разрешения, возможности и последствия безопасности
8. **Анализ производительности**: Воздействие на CPU, память, I/O и сеть
9. **Отладка и профилирование**: Продвинутые техники устранения неполадок
10. **Анализ исходного кода**: Ключевые детали реализации
11. **Альтернативные реализации**: Разные подходы и компромиссы
12. **Исторический контекст**: Эволюция и история разработки
Предоставьте максимальную техническую глубину с системными инсайтами, примерами кода и архитектурным пониманием.

View File

@@ -6,6 +6,8 @@ import (
"os"
"path/filepath"
"strings"
"github.com/direct-dev-ru/linux-command-gpt/config"
)
// SystemPrompt представляет системный промпт
@@ -21,28 +23,50 @@ type PromptManager struct {
Prompts []SystemPrompt
ConfigFile string
HomeDir string
Language string // Текущий язык для файла sys_prompts (en/ru)
}
// NewPromptManager создает новый менеджер промптов
func NewPromptManager(homeDir string) *PromptManager {
configFile := filepath.Join(homeDir, ".lcg_prompts.json")
// Используем конфигурацию из модуля config
promptFolder := config.AppConfig.PromptFolder
// Путь к файлу sys_prompts
sysPromptsFile := filepath.Join(promptFolder, "sys_prompts")
pm := &PromptManager{
ConfigFile: configFile,
ConfigFile: sysPromptsFile,
HomeDir: homeDir,
}
// Загружаем предустановленные промпты
pm.loadDefaultPrompts()
// Проверяем, существует ли файл sys_prompts
if _, err := os.Stat(sysPromptsFile); os.IsNotExist(err) {
// Если файла нет, создаем его с системными промптами и промптами подробности
pm.createInitialPromptsFile()
}
// Загружаем пользовательские промпты
pm.loadCustomPrompts()
// Загружаем все промпты из файла
pm.loadAllPrompts()
return pm
}
// createInitialPromptsFile создает начальный файл с системными промптами и промптами подробности
func (pm *PromptManager) createInitialPromptsFile() {
// Загружаем все встроенные промпты из YAML (английские по умолчанию)
pm.Prompts = GetBuiltinPrompts()
// Фикс: при первичном сохранении явно выставляем язык файла
if pm.Language == "" {
pm.Language = "en"
}
// Сохраняем все промпты в файл
pm.saveAllPrompts()
}
// loadDefaultPrompts загружает предустановленные промпты
func (pm *PromptManager) loadDefaultPrompts() {
func (pm *PromptManager) LoadDefaultPrompts() {
defaultPrompts := []SystemPrompt{
{
ID: 1,
@@ -79,8 +103,8 @@ func (pm *PromptManager) loadDefaultPrompts() {
pm.Prompts = defaultPrompts
}
// loadCustomPrompts загружает пользовательские промпты из файла
func (pm *PromptManager) loadCustomPrompts() {
// loadAllPrompts загружает все промпты из файла sys_prompts
func (pm *PromptManager) loadAllPrompts() {
if _, err := os.Stat(pm.ConfigFile); os.IsNotExist(err) {
return
}
@@ -90,18 +114,60 @@ func (pm *PromptManager) loadCustomPrompts() {
return
}
var customPrompts []SystemPrompt
if err := json.Unmarshal(data, &customPrompts); err != nil {
// Новый формат: объект с полями language и prompts
var pf promptsFile
if err := json.Unmarshal(data, &pf); err == nil && len(pf.Prompts) > 0 {
pm.Language = pf.Language
pm.Prompts = pf.Prompts
return
}
// Добавляем пользовательские промпты с новыми ID
for i, prompt := range customPrompts {
prompt.ID = len(pm.Prompts) + i + 1
pm.Prompts = append(pm.Prompts, prompt)
// Старый формат: просто массив промптов
var prompts []SystemPrompt
if err := json.Unmarshal(data, &prompts); err == nil {
pm.Prompts = prompts
pm.Language = "en"
// Миграция в новый формат при следующем сохранении
}
}
// saveAllPrompts сохраняет все промпты в файл sys_prompts
// внутренний формат хранения файла sys_prompts
type promptsFile struct {
Language string `json:"language,omitempty"`
Prompts []SystemPrompt `json:"prompts"`
}
func (pm *PromptManager) saveAllPrompts() error {
pf := promptsFile{
Language: pm.Language,
Prompts: pm.Prompts,
}
data, err := json.MarshalIndent(pf, "", " ")
if err != nil {
return err
}
return os.WriteFile(pm.ConfigFile, data, 0644)
}
// SaveAllPrompts экспортированная версия saveAllPrompts
func (pm *PromptManager) SaveAllPrompts() error {
return pm.saveAllPrompts()
}
// GetCurrentLanguage возвращает текущий язык из файла промптов
func (pm *PromptManager) GetCurrentLanguage() string {
if pm.Language == "" {
return "en"
}
return pm.Language
}
// SetLanguage устанавливает язык для всех промптов
func (pm *PromptManager) SetLanguage(lang string) {
pm.Language = lang
}
// saveCustomPrompts сохраняет пользовательские промпты
func (pm *PromptManager) saveCustomPrompts() error {
// Находим пользовательские промпты (ID > 5)
@@ -140,24 +206,136 @@ func (pm *PromptManager) GetPromptByName(name string) (*SystemPrompt, error) {
return nil, fmt.Errorf("промпт с именем '%s' не найден", name)
}
// AddPrompt добавляет новый промпт
func (pm *PromptManager) AddPrompt(name, description, content string) error {
// Находим максимальный ID
maxID := 0
for _, prompt := range pm.Prompts {
if prompt.ID > maxID {
maxID = prompt.ID
}
}
newPrompt := SystemPrompt{
ID: maxID + 1,
Name: name,
Description: description,
Content: content,
}
pm.Prompts = append(pm.Prompts, newPrompt)
return pm.saveAllPrompts()
}
// UpdatePrompt обновляет существующий промпт
func (pm *PromptManager) UpdatePrompt(id int, name, description, content string) error {
for i, prompt := range pm.Prompts {
if prompt.ID == id {
pm.Prompts[i].Name = name
pm.Prompts[i].Description = description
pm.Prompts[i].Content = content
return pm.saveAllPrompts()
}
}
return fmt.Errorf("промпт с ID %d не найден", id)
}
// DeletePrompt удаляет промпт по ID
func (pm *PromptManager) DeletePrompt(id int) error {
for i, prompt := range pm.Prompts {
if prompt.ID == id {
pm.Prompts = append(pm.Prompts[:i], pm.Prompts[i+1:]...)
return pm.saveAllPrompts()
}
}
return fmt.Errorf("промпт с ID %d не найден", id)
}
// ListPrompts выводит список всех доступных промптов
func (pm *PromptManager) ListPrompts() {
fmt.Println("Available system prompts:")
fmt.Println("ID | Name | Description")
fmt.Println("---+---------------------------+--------------------------------")
pm.ListPromptsWithFull(false)
}
for _, prompt := range pm.Prompts {
description := prompt.Description
if len(description) > 80 {
description = description[:77] + "..."
// ListPromptsWithFull выводит список промптов с опцией полного вывода
func (pm *PromptManager) ListPromptsWithFull(full bool) {
fmt.Println("📝 Доступные системные промпты:")
fmt.Println()
for i, prompt := range pm.Prompts {
// Разделитель между промптами
if i > 0 {
fmt.Println("─" + strings.Repeat("─", 60))
}
fmt.Printf("%-2d | %-25s | %s\n",
prompt.ID,
truncateString(prompt.Name, 25),
description)
// Проверяем, является ли промпт встроенным и неизмененным
isDefault := pm.isDefaultPrompt(prompt)
// Заголовок промпта
if isDefault {
fmt.Printf("🔹 ID: %d | Название: %s | Встроенный\n", prompt.ID, prompt.Name)
} else {
fmt.Printf("🔹 ID: %d | Название: %s\n", prompt.ID, prompt.Name)
}
// Описание
if prompt.Description != "" {
fmt.Printf("📋 Описание: %s\n", prompt.Description)
}
// Содержимое промпта
fmt.Println("📄 Содержимое:")
fmt.Println("┌" + strings.Repeat("─", 58) + "┐")
// Разбиваем содержимое на строки и выводим с отступами
lines := strings.Split(prompt.Content, "\n")
for _, line := range lines {
if full {
// Полный вывод без обрезки - разбиваем длинные строки
if len(line) > 56 {
// Разбиваем длинную строку на части
for i := 0; i < len(line); i += 56 {
end := i + 56
if end > len(line) {
end = len(line)
}
fmt.Printf("│ %-56s │\n", line[i:end])
}
} else {
fmt.Printf("│ %-56s │\n", line)
}
} else {
// Обычный вывод с обрезкой
fmt.Printf("│ %-56s │\n", truncateString(line, 56))
}
}
fmt.Println("└" + strings.Repeat("─", 58) + "┘")
fmt.Println()
}
}
// isDefaultPrompt проверяет, является ли промпт встроенным и неизмененным
func (pm *PromptManager) isDefaultPrompt(prompt SystemPrompt) bool {
// Используем новую функцию из builtin_prompts.go
return IsBuiltinPrompt(prompt)
}
// IsDefaultPromptByID проверяет, является ли промпт встроенным только по ID (игнорирует содержимое)
func (pm *PromptManager) IsDefaultPromptByID(prompt SystemPrompt) bool {
// Проверяем, что ID находится в диапазоне встроенных промптов (1-8)
return prompt.ID >= 1 && prompt.ID <= 8
}
// GetRussianDefaultPrompts возвращает русские версии встроенных промптов
func GetRussianDefaultPrompts() []SystemPrompt {
return GetBuiltinPromptsByLanguage("ru")
}
// getDefaultPrompts возвращает оригинальные встроенные промпты
func (pm *PromptManager) GetDefaultPrompts() []SystemPrompt {
return GetBuiltinPrompts()
}
// AddCustomPrompt добавляет новый пользовательский промпт
func (pm *PromptManager) AddCustomPrompt(name, description, content string) error {
// Проверяем, что имя уникально