Skip to content

Commit

Permalink
🚚 refactor: Reorganize file structure and rename utils
Browse files Browse the repository at this point in the history
  • Loading branch information
thibaultyou committed Oct 21, 2024
1 parent 0ee0c8e commit ef06f96
Show file tree
Hide file tree
Showing 32 changed files with 326 additions and 355 deletions.
8 changes: 4 additions & 4 deletions src/app/core/update_metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ import {
removeDirectory,
renameFile,
writeFileContent
} from '../../shared/utils/file_operations';
import logger from '../../shared/utils/logger';
} from '../../shared/utils/file_system.util';
import logger from '../../shared/utils/logger.util';
import { appConfig } from '../config/app.config';
import { processMetadataGeneration } from '../utils/analyzer_operations';
import { dumpYamlContent, sanitizeYamlContent } from '../utils/yaml_operations';
import { processMetadataGeneration } from '../utils/prompt_analyzer.util';
import { dumpYamlContent, sanitizeYamlContent } from '../utils/yaml_operations.util';

export async function generateMetadata(promptContent: string): Promise<Metadata> {
logger.info('Starting metadata generation');
Expand Down
8 changes: 4 additions & 4 deletions src/app/core/update_views.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import * as nunjucks from 'nunjucks';

import { commonConfig } from '../../shared/config/common.config';
import { CategoryItem, Metadata } from '../../shared/types';
import { isDirectory, readDirectory, readFileContent, writeFileContent } from '../../shared/utils/file_operations';
import logger from '../../shared/utils/logger';
import { formatTitleCase } from '../../shared/utils/string_formatter';
import { isDirectory, readDirectory, readFileContent, writeFileContent } from '../../shared/utils/file_system.util';
import logger from '../../shared/utils/logger.util';
import { formatTitleCase } from '../../shared/utils/string_formatter.util';
import { appConfig } from '../config/app.config';
import { parseYamlContent } from '../utils/yaml_operations';
import { parseYamlContent } from '../utils/yaml_operations.util';

async function processPromptDirectory(promptDir: string, categories: Record<string, CategoryItem[]>): Promise<void> {
const promptPath = path.join(appConfig.PROMPTS_DIR, promptDir);
Expand Down
31 changes: 31 additions & 0 deletions src/app/utils/fragment_manager.util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import path from 'path';

import { isDirectory, readDirectory } from '../../shared/utils/file_system.util';
import logger from '../../shared/utils/logger.util';
import { appConfig } from '../config/app.config';

export async function listAvailableFragments(): Promise<string> {
try {
logger.info('Listing available fragments');
const fragmentsDir = path.join(appConfig.FRAGMENTS_DIR);
const categories = await readDirectory(fragmentsDir);
const fragments: Record<string, string[]> = {};
await Promise.all(
categories.map(async (category) => {
const categoryPath = path.join(fragmentsDir, category);

if (await isDirectory(categoryPath)) {
const categoryFragments = await readDirectory(categoryPath);
fragments[category] = categoryFragments.map((f) => path.parse(f).name);
logger.debug(`Found ${fragments[category].length} fragments in category ${category}`);
}
})
);

logger.info(`Listed fragments from ${Object.keys(fragments).length} categories`);
return JSON.stringify(fragments, null, 2);
} catch (error) {
logger.error('Error listing available fragments:', error);
throw error;
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import * as path from 'path';

import { listAvailableFragments } from './fragment_manager.util';
import { parseYamlContent } from './yaml_operations.util';
import { Metadata } from '../../shared/types';
import { readFileContent, readDirectory, isDirectory } from '../../shared/utils/file_operations';
import logger from '../../shared/utils/logger';
import { processPromptContent } from '../../shared/utils/prompt_operations';
import { readFileContent } from '../../shared/utils/file_system.util';
import logger from '../../shared/utils/logger.util';
import { processPromptContent } from '../../shared/utils/prompt_processing.util';
import { appConfig } from '../config/app.config';
import { parseYamlContent } from '../utils/yaml_operations';

export async function loadAnalyzerPrompt(): Promise<string> {
try {
Expand Down Expand Up @@ -68,32 +67,6 @@ function extractOutputContent(content: string): string {
return content.slice(outputStart + 8, outputEnd).trim();
}

export async function listAvailableFragments(): Promise<string> {
try {
logger.info('Listing available fragments');
const fragmentsDir = path.join(appConfig.FRAGMENTS_DIR);
const categories = await readDirectory(fragmentsDir);
const fragments: Record<string, string[]> = {};
await Promise.all(
categories.map(async (category) => {
const categoryPath = path.join(fragmentsDir, category);

if (await isDirectory(categoryPath)) {
const categoryFragments = await readDirectory(categoryPath);
fragments[category] = categoryFragments.map((f) => path.parse(f).name);
logger.debug(`Found ${fragments[category].length} fragments in category ${category}`);
}
})
);

logger.info(`Listed fragments from ${Object.keys(fragments).length} categories`);
return JSON.stringify(fragments, null, 2);
} catch (error) {
logger.error('Error listing available fragments:', error);
throw error;
}
}

function isValidMetadata(metadata: Metadata): boolean {
if (!metadata.title || !metadata.description || !metadata.primary_category) {
logger.warn('Missing one or more required fields in metadata: title, description, or primary_category');
Expand Down
56 changes: 0 additions & 56 deletions src/app/utils/prompt_operations.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as yaml from 'js-yaml';

import { Metadata, Variable } from '../../shared/types';
import logger from '../../shared/utils/logger';
import logger from '../../shared/utils/logger.util';
import { appConfig } from '../config/app.config';

/**
Expand Down
2 changes: 1 addition & 1 deletion src/cli/config/cli.config.ts → src/cli/cli.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as path from 'path';

import { CONFIG_DIR } from '../../shared/config/config.constants';
import { CONFIG_DIR } from '../shared/config/config.constants';

export interface CliConfig {
PROMPTS_DIR: string;
Expand Down
3 changes: 3 additions & 0 deletions src/cli/cli.constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const FRAGMENT_PREFIX = 'Fragment: ';

export const ENV_PREFIX = 'Env: ';
10 changes: 7 additions & 3 deletions src/cli/commands/base.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import { Command } from 'commander';
import fs from 'fs-extra';

import { ApiResult } from '../../shared/types';
import { cliConfig } from '../config/cli.config';
import { cliConfig } from '../cli.config';
import { ENV_PREFIX, FRAGMENT_PREFIX } from '../cli.constants';
import { handleApiResult } from '../utils/database.util';
import { handleError } from '../utils/error.util';

Expand Down Expand Up @@ -75,10 +76,13 @@ export class BaseCommand extends Command {
const tempFilePath = path.join(tempDir, 'input.txt');

try {
await fs.writeFile(tempFilePath, initialValue);
const cleanedInitialValue =
initialValue.startsWith(FRAGMENT_PREFIX) || initialValue.startsWith(ENV_PREFIX) ? '' : initialValue;
await fs.writeFile(tempFilePath, cleanedInitialValue);
const input = await editor({
message: 'Edit your input',
default: initialValue,
default: cleanedInitialValue,
waitForUseInput: false,
postfix: '.txt'
});
return input;
Expand Down
14 changes: 9 additions & 5 deletions src/cli/commands/env.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import chalk from 'chalk';

import { BaseCommand } from './base.command';
import { EnvVar, Fragment } from '../../shared/types';
import { formatTitleCase, formatSnakeCase } from '../../shared/utils/string_formatter';
import { formatTitleCase, formatSnakeCase } from '../../shared/utils/string_formatter.util';
import { FRAGMENT_PREFIX } from '../cli.constants';
import { createEnvVar, readEnvVars, updateEnvVar, deleteEnvVar } from '../utils/env.util';
import { listFragments, viewFragmentContent } from '../utils/fragment.util';
import { listPrompts, getPromptFiles } from '../utils/prompt.util';
import { listFragments, viewFragmentContent } from '../utils/fragment_operations.util';
import { listPrompts, getPromptFiles } from '../utils/prompt_crud.util';

class EnvCommand extends BaseCommand {
constructor() {
Expand Down Expand Up @@ -36,7 +37,10 @@ class EnvCommand extends BaseCommand {
}
}

private formatVariableChoices(allVariables: Array<{ name: string; role: string }>, envVars: EnvVar[]): Array<{ name: string; value: { name: string; role: string } }> {
private formatVariableChoices(
allVariables: Array<{ name: string; role: string }>,
envVars: EnvVar[]
): Array<{ name: string; value: { name: string; role: string } }> {
const maxNameLength = Math.max(...allVariables.map((v) => formatSnakeCase(v.name).length));
return allVariables.map((variable) => {
const formattedName = formatSnakeCase(variable.name);
Expand Down Expand Up @@ -137,7 +141,7 @@ class EnvCommand extends BaseCommand {
return;
}

const fragmentRef = `Fragment: ${selectedFragment.category}/${selectedFragment.name}`;
const fragmentRef = `${FRAGMENT_PREFIX}${selectedFragment.category}/${selectedFragment.name}`;
const envVars = await this.handleApiResult(await readEnvVars(), 'Fetched environment variables');

if (!envVars) return;
Expand Down
5 changes: 3 additions & 2 deletions src/cli/commands/execute.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import yaml from 'js-yaml';

import { BaseCommand } from './base.command';
import { Metadata, Prompt, Variable } from '../../shared/types';
import { processPromptContent } from '../../shared/utils/prompt_operations';
import { getPromptFiles, viewPromptDetails } from '../utils/prompt.util';
import { processPromptContent } from '../../shared/utils/prompt_processing.util';
import { getPromptFiles } from '../utils/prompt_crud.util';
import { viewPromptDetails } from '../utils/prompt_display.util';

class ExecuteCommand extends BaseCommand {
constructor() {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/fragments.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import chalk from 'chalk';

import { BaseCommand } from './base.command';
import { Fragment } from '../../shared/types';
import { formatTitleCase } from '../../shared/utils/string_formatter';
import { listFragments, viewFragmentContent } from '../utils/fragment.util';
import { formatTitleCase } from '../../shared/utils/string_formatter.util';
import { listFragments, viewFragmentContent } from '../utils/fragment_operations.util';

type FragmentMenuAction = 'all' | 'category' | 'back';

Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/menu.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { Command } from 'commander';

import { BaseCommand } from './base.command';
import { getConfig } from '../../shared/config';
import { hasFragments, hasPrompts } from '../utils/content.util';
import { handleError } from '../utils/error.util';
import { hasFragments, hasPrompts } from '../utils/file_system.util';

type MenuAction = 'sync' | 'prompts' | 'fragments' | 'settings' | 'env' | 'back';

Expand Down
19 changes: 10 additions & 9 deletions src/cli/commands/prompts.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ import chalk from 'chalk';

import { BaseCommand } from './base.command';
import { CategoryItem, EnvVar, Fragment, Prompt, Variable } from '../../shared/types';
import { formatTitleCase, formatSnakeCase } from '../../shared/utils/string_formatter';
import { ConversationManager } from '../utils/conversation.util';
import { formatTitleCase, formatSnakeCase } from '../../shared/utils/string_formatter.util';
import { ENV_PREFIX, FRAGMENT_PREFIX } from '../cli.constants';
import { ConversationManager } from '../utils/conversation_manager.util';
import { fetchCategories, getPromptDetails, updatePromptVariable } from '../utils/database.util';
import { readEnvVars } from '../utils/env.util';
import { listFragments, viewFragmentContent } from '../utils/fragment.util';
import { viewPromptDetails } from '../utils/prompt.util';
import { listFragments, viewFragmentContent } from '../utils/fragment_operations.util';
import { viewPromptDetails } from '../utils/prompt_display.util';

type PromptMenuAction = 'all' | 'category' | 'id' | 'back';
type SelectPromptMenuAction = Variable | 'execute' | 'unset_all' | 'back';
Expand Down Expand Up @@ -216,9 +217,9 @@ class PromptCommand extends BaseCommand {

private getVariableNameColor(v: Variable): (text: string) => string {
if (v.value) {
if (v.value.startsWith('Fragment: ')) return chalk.blue;
if (v.value.startsWith(FRAGMENT_PREFIX)) return chalk.blue;

if (v.value.startsWith('Env: ')) return chalk.magenta;
if (v.value.startsWith(ENV_PREFIX)) return chalk.magenta;
return chalk.green;
}
return v.optional_for_user ? chalk.yellow : chalk.red;
Expand Down Expand Up @@ -297,7 +298,7 @@ class PromptCommand extends BaseCommand {
if (!fragmentsResult) return;

const selectedFragment = await this.showMenu<Fragment | 'back'>(
'Select a Fragment: ',
'Select a fragment: ',
fragmentsResult.map((f) => ({
name: `${f.category}/${f.name}`,
value: f
Expand All @@ -309,7 +310,7 @@ class PromptCommand extends BaseCommand {
return;
}

const fragmentRef = `Fragment: ${selectedFragment.category}/${selectedFragment.name}`;
const fragmentRef = `${FRAGMENT_PREFIX}${selectedFragment.category}/${selectedFragment.name}`;
const updateResult = await updatePromptVariable(promptId, variable.name, fragmentRef);

if (!updateResult.success) {
Expand Down Expand Up @@ -361,7 +362,7 @@ class PromptCommand extends BaseCommand {
return;
}

const envVarRef = `Env: ${selectedEnvVar.name}`;
const envVarRef = `${ENV_PREFIX}${selectedEnvVar.name}`;
const updateResult = await updatePromptVariable(promptId, variable.name, envVarRef);

if (!updateResult.success) {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/sync.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import simpleGit, { SimpleGit } from 'simple-git';

import { BaseCommand } from './base.command';
import { getConfig, setConfig } from '../../shared/config';
import logger from '../../shared/utils/logger';
import { cliConfig } from '../config/cli.config';
import logger from '../../shared/utils/logger.util';
import { cliConfig } from '../cli.config';
import { syncPromptsWithDatabase, cleanupOrphanedData } from '../utils/database.util';

class SyncCommand extends BaseCommand {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { handleError } from './error.util';
import { processCliPromptContent, resolveCliInputs } from './prompt.cli.util';
import { getPromptFiles } from './prompt.util';
import { resolveCliInputs } from './input_processing.util';
import { processCliPromptContent } from './input_resolution.util';
import { getPromptFiles } from './prompt_crud.util';
import { ApiResult } from '../../shared/types';
import { processPromptContent, processPromptWithVariables } from '../../shared/utils/prompt_operations';
import { processPromptContent, processPromptWithVariables } from '../../shared/utils/prompt_processing.util';

interface ConversationMessage {
role: 'human' | 'assistant';
Expand Down
8 changes: 4 additions & 4 deletions src/cli/utils/database.util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ import NodeCache from 'node-cache';
import sqlite3, { RunResult } from 'sqlite3';

import { AppError, handleError } from './error.util';
import { createPrompt } from './prompt.util';
import { createPrompt } from './prompt_crud.util';
import { commonConfig } from '../../shared/config/common.config';
import { ApiResult, CategoryItem, Metadata, Prompt, Variable } from '../../shared/types';
import { fileExists, readDirectory, readFileContent } from '../../shared/utils/file_operations';
import logger from '../../shared/utils/logger';
import { cliConfig } from '../config/cli.config';
import { fileExists, readDirectory, readFileContent } from '../../shared/utils/file_system.util';
import logger from '../../shared/utils/logger.util';
import { cliConfig } from '../cli.config';

const db = new sqlite3.Database(cliConfig.DB_PATH);
const cache = new NodeCache({ stdTTL: 600 });
Expand Down
2 changes: 1 addition & 1 deletion src/cli/utils/error.util.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import chalk from 'chalk';

import logger from '../../shared/utils/logger';
import logger from '../../shared/utils/logger.util';

export class AppError extends Error {
constructor(
Expand Down
Loading

0 comments on commit ef06f96

Please sign in to comment.