Skip to content

Commit

Permalink
🎨 style: Fix cosmetic issues
Browse files Browse the repository at this point in the history
  • Loading branch information
thibaultyou committed Oct 30, 2024
1 parent 78a2648 commit 9fdeef9
Show file tree
Hide file tree
Showing 20 changed files with 181 additions and 144 deletions.
6 changes: 3 additions & 3 deletions src/app/utils/yaml-operations.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as yaml from 'js-yaml';

import { PromptMetadata, Variable } from '../../shared/types';
import { PromptMetadata, PromptVariable } from '../../shared/types';
import logger from '../../shared/utils/logger';
import { appConfig } from '../config/app-config';

Expand Down Expand Up @@ -73,8 +73,8 @@ export function isValidMetadata(obj: unknown): obj is PromptMetadata {
return true;
}

function isValidVariable(obj: unknown): obj is Variable {
const variable = obj as Partial<Variable>;
function isValidVariable(obj: unknown): obj is PromptVariable {
const variable = obj as Partial<PromptVariable>;
return (
typeof variable === 'object' &&
variable !== null &&
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/config-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class ConfigCommand extends BaseCommand {
console.log(chalk.yellow('The configuration is empty.'));
} else {
Object.entries(currentConfig).forEach(([key, value]) => {
console.log(chalk.green(`${key}:`), chalk.yellow(key === 'ANTHROPIC_API_KEY' ? '********' : value));
console.log(`${key} -->`, chalk.green(key === 'ANTHROPIC_API_KEY' ? '********' : value));
});
}
}
Expand Down
25 changes: 15 additions & 10 deletions src/cli/commands/env-command.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import chalk from 'chalk';

import { BaseCommand } from './base-command';
import { EnvVar, Fragment } from '../../shared/types';
import { EnvVariable, PromptFragment } from '../../shared/types';
import { formatTitleCase, formatSnakeCase } from '../../shared/utils/string-formatter';
import { FRAGMENT_PREFIX } from '../constants';
import { createEnvVar, readEnvVars, updateEnvVar, deleteEnvVar } from '../utils/env-vars';
Expand Down Expand Up @@ -39,7 +39,7 @@ class EnvCommand extends BaseCommand {

private formatVariableChoices(
allVariables: Array<{ name: string; role: string }>,
envVars: EnvVar[]
envVars: EnvVariable[]
): Array<{ name: string; value: { name: string; role: string } }> {
const maxNameLength = Math.max(...allVariables.map((v) => formatSnakeCase(v.name).length));
return allVariables.map((variable) => {
Expand All @@ -48,17 +48,19 @@ class EnvCommand extends BaseCommand {
const envVar = envVars.find((v) => formatSnakeCase(v.name) === formattedName);
const status = this.getVariableStatus(envVar);
return {
name: `${chalk.cyan(paddedName)}: ${status}`,
name: `${paddedName} --> ${status}`,
value: variable
};
});
}

private getVariableStatus(envVar: EnvVar | undefined): string {
private getVariableStatus(envVar: EnvVariable | undefined): string {
if (!envVar) return chalk.yellow('Not Set');

if (envVar.value.startsWith('Fragment:')) return chalk.blue(envVar.value);
return chalk.green(`Set: ${envVar.value.substring(0, 20)}${envVar.value.length > 20 ? '...' : ''}`);
const trimmedValue = envVar.value.trim();
return trimmedValue.startsWith(FRAGMENT_PREFIX)
? chalk.blue(trimmedValue)
: chalk.green(`Set: ${trimmedValue.substring(0, 20)}${trimmedValue.length > 20 ? '...' : ''}`);
}

private async manageEnvVar(variable: { name: string; role: string }): Promise<void> {
Expand Down Expand Up @@ -94,7 +96,7 @@ class EnvCommand extends BaseCommand {

private async enterValueForVariable(
variable: { name: string; role: string },
envVar: EnvVar | undefined
envVar: EnvVariable | undefined
): Promise<void> {
try {
const currentValue = envVar?.value || '';
Expand Down Expand Up @@ -128,10 +130,10 @@ class EnvCommand extends BaseCommand {

if (!fragments) return;

const selectedFragment = await this.showMenu<Fragment | 'back'>(
const selectedFragment = await this.showMenu<PromptFragment | 'back'>(
'Select a fragment: ',
fragments.map((f) => ({
name: `${formatTitleCase(f.category)} / ${chalk.blue(f.name)}`,
name: `${formatTitleCase(f.category)} > ${chalk.blue(f.name)}`,
value: f
}))
);
Expand Down Expand Up @@ -182,7 +184,10 @@ class EnvCommand extends BaseCommand {
}
}

private async unsetVariable(variable: { name: string; role: string }, envVar: EnvVar | undefined): Promise<void> {
private async unsetVariable(
variable: { name: string; role: string },
envVar: EnvVariable | undefined
): Promise<void> {
try {
if (envVar) {
const deleteResult = await deleteEnvVar(envVar.id);
Expand Down
107 changes: 66 additions & 41 deletions src/cli/commands/execute-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ import fs from 'fs-extra';
import yaml from 'js-yaml';

import { BaseCommand } from './base-command';
import { PromptMetadata, Variable } from '../../shared/types';
import { PromptMetadata } from '../../shared/types';
import { processPromptContent, updatePromptWithVariables } from '../../shared/utils/prompt-processing';
import { formatSnakeCase } from '../../shared/utils/string-formatter';
import { getPromptFiles, viewPromptDetails } from '../utils/prompts';

class ExecuteCommand extends BaseCommand {
Expand Down Expand Up @@ -129,7 +130,10 @@ Note:
fileInputs: Record<string, string>
): Promise<void> {
try {
const promptFiles = await this.handleApiResult(await getPromptFiles(promptId), 'Fetched prompt files');
const promptFiles = await this.handleApiResult(
await getPromptFiles(promptId, { cleanVariables: true }),
'Fetched prompt files'
);

if (!promptFiles) return;

Expand Down Expand Up @@ -177,7 +181,7 @@ Note:
description: metadata.description,
tags: metadata.tags,
variables: metadata.variables
} as PromptMetadata & { variables: Variable[] },
} as PromptMetadata,
true
);
} catch (error) {
Expand All @@ -190,53 +194,74 @@ Note:
metadata: PromptMetadata,
dynamicOptions: Record<string, string>,
fileInputs: Record<string, string>
): Promise<void> {
try {
const userInputs: Record<string, string> = {};

for (const variable of metadata.variables) {
if (!variable.optional_for_user && !variable.value) {
const snakeCaseName = variable.name.replace(/[{}]/g, '').toLowerCase();
const hasValue =
(dynamicOptions && snakeCaseName in dynamicOptions) ||
(fileInputs && snakeCaseName in fileInputs);

if (!hasValue) {
throw new Error(`Required variable ${snakeCaseName} is not set`);
}
}
): Promise<string> {
const userInputs: Record<string, string> = {};
const missingVariables: string[] = [];

for (const variable of metadata.variables) {
const variableName = variable.name.replace(/[{}]/g, '');
const snakeCaseName = variableName.toLowerCase();

if (variable.value) {
userInputs[variable.name] = variable.value;
continue;
}

for (const variable of metadata.variables) {
const snakeCaseName = variable.name.replace(/[{}]/g, '').toLowerCase();
let value = dynamicOptions[snakeCaseName];

if (fileInputs[snakeCaseName]) {
try {
value = await fs.readFile(fileInputs[snakeCaseName], 'utf-8');
console.log(chalk.green(`Loaded file content for ${snakeCaseName}`));
} catch (error) {
console.error(chalk.red(`Error reading file for ${snakeCaseName}:`, error));
throw new Error(`Failed to read file for ${snakeCaseName}`);
}
}
if (!variable.optional_for_user) {
const hasValue =
(dynamicOptions && snakeCaseName in dynamicOptions) || (fileInputs && snakeCaseName in fileInputs);

if (value) {
userInputs[variable.name] = value;
if (!hasValue) {
missingVariables.push(snakeCaseName);
}
}
}

if (missingVariables.length > 0) {
throw new Error(`Missing required variables: ${missingVariables.join(', ')}`);
}

const updatedPromptContent = updatePromptWithVariables(promptContent, userInputs);
const result = await processPromptContent([{ role: 'user', content: updatedPromptContent }], false, false);
for (const variable of metadata.variables) {
const variableName = variable.name.replace(/[{}]/g, '');
const snakeCaseName = variableName.toLowerCase();

if (typeof result === 'string') {
console.log(result);
} else {
console.error(chalk.red('Unexpected result format from prompt processing'));
if (variable.name in userInputs) {
continue;
}

let value = dynamicOptions[snakeCaseName];

if (fileInputs[snakeCaseName]) {
try {
value = await fs.readFile(fileInputs[snakeCaseName], 'utf-8');
// console.log(chalk.green(`Loaded file content for ${snakeCaseName}`));
} catch (error) {
console.error(chalk.red(`Error reading file for ${snakeCaseName}:`, error));
throw new Error(`Failed to read file for ${snakeCaseName}`);
}
}

if (value !== undefined) {
userInputs[variable.name] = value;
} else if (!variable.optional_for_user) {
throw new Error(`Required variable ${snakeCaseName} is not set`);
}
} catch (error) {
this.handleError(error, 'executing prompt with metadata');
}

console.log(chalk.cyan('\nUsing variables:'));
Object.entries(userInputs).forEach(([key, value]) => {
console.log(` ${formatSnakeCase(key)}: ${value.length > 50 ? value.substring(0, 50) + '...' : value}`);
});

const updatedPromptContent = updatePromptWithVariables(promptContent, userInputs);
const result = await processPromptContent([{ role: 'user', content: updatedPromptContent }], false, false);

if (typeof result !== 'string') {
throw new Error('Unexpected result format from prompt processing');
}

console.log(result);
return result;
}
}

Expand Down
14 changes: 7 additions & 7 deletions src/cli/commands/fragments-command.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import chalk from 'chalk';

import { BaseCommand } from './base-command';
import { Fragment } from '../../shared/types';
import { PromptFragment } from '../../shared/types';
import { formatTitleCase } from '../../shared/utils/string-formatter';
import { listFragments, viewFragmentContent } from '../utils/fragments';

Expand Down Expand Up @@ -41,14 +41,14 @@ class FragmentsCommand extends BaseCommand {
}
}

private async viewAllFragments(fragments: Fragment[]): Promise<void> {
private async viewAllFragments(fragments: PromptFragment[]): Promise<void> {
const sortedFragments = fragments.sort((a, b) =>
`${a.category}/${a.name}`.localeCompare(`${b.category}/${b.name}`)
);
await this.viewFragmentMenu(sortedFragments);
}

private async viewFragmentsByCategory(fragments: Fragment[]): Promise<void> {
private async viewFragmentsByCategory(fragments: PromptFragment[]): Promise<void> {
const categories = [...new Set(fragments.map((f) => f.category))].sort();
while (true) {
const category = await this.showMenu<string | 'back'>(
Expand All @@ -65,12 +65,12 @@ class FragmentsCommand extends BaseCommand {
}
}

private async viewFragmentMenu(fragments: Fragment[]): Promise<void> {
private async viewFragmentMenu(fragments: PromptFragment[]): Promise<void> {
while (true) {
const selectedFragment = await this.showMenu<Fragment | 'back'>(
const selectedFragment = await this.showMenu<PromptFragment | 'back'>(
'Select a fragment to view:',
fragments.map((f) => ({
name: `${formatTitleCase(f.category)} / ${chalk.green(f.name)}`,
name: `${formatTitleCase(f.category)} > ${chalk.green(f.name)}`,
value: f
}))
);
Expand All @@ -83,7 +83,7 @@ class FragmentsCommand extends BaseCommand {
}
}

private async displayFragmentContent(fragment: Fragment): Promise<void> {
private async displayFragmentContent(fragment: PromptFragment): Promise<void> {
try {
const content = await this.handleApiResult(
await viewFragmentContent(fragment.category, fragment.name),
Expand Down
5 changes: 2 additions & 3 deletions src/cli/commands/menu-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,10 @@ class MenuCommand extends BaseCommand {
{ name: 'Settings', value: 'settings' }
);

// console.clear();
console.clear();

const action = await this.showMenu<MenuAction>(
`${chalk.reset(chalk.italic(chalk.cyan('Want to manage AI prompts with ease ?')))}
${chalk.bold(`${chalk.yellow('Welcome to the Prompt Library !')}
`${chalk.bold(`${chalk.cyan('Welcome to the Prompt Library !')}
Select an action:`)}`,
choices,
{ goBackLabel: 'Exit' }
Expand Down
Loading

0 comments on commit 9fdeef9

Please sign in to comment.