Skip to content
Merged

Cli #349

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
385bd2c
Add store limits validation API and integrate into backend
Stivenjs Oct 11, 2025
331866e
Update auth middleware test to expect null response on authentication…
Stivenjs Oct 11, 2025
34b0f79
Enhance image selector functionality with filters and sorting options
Stivenjs Oct 12, 2025
051c2b9
Enhance AI chat functionality with new features and improvements
Stivenjs Oct 12, 2025
fa174a6
Remove deprecated layout and page components from main layout and pri…
Stivenjs Oct 12, 2025
dbae8b5
Refactor import paths in test files to remove deprecated layout refer…
Stivenjs Oct 12, 2025
190b3e3
Refactor auth flow tests to use typed AuthSession
Stivenjs Oct 12, 2025
7f3175f
Update TypeScript configuration and GitHub Actions for improved build…
Stivenjs Oct 12, 2025
9e9fca5
Update GitHub Actions workflow to standardize Node.js setup syntax
Stivenjs Oct 12, 2025
c76987b
Enhance Next.js configuration and GitHub Actions for improved TypeScr…
Stivenjs Oct 12, 2025
27f34bc
Standardize quote usage in GitHub Actions workflow for Node.js setup
Stivenjs Oct 12, 2025
0fa3c88
Refactor TypeScript build process and GitHub Actions for improved eff…
Stivenjs Oct 13, 2025
5e4afc2
Standardize quote usage in GitHub Actions workflow for Node.js setup
Stivenjs Oct 13, 2025
a6321c7
Refactor import statement in MarqueeLogos component for consistency
Stivenjs Oct 13, 2025
2caceea
Update type-check script in package.json and standardize quotes in Gi…
Stivenjs Oct 13, 2025
c94ea75
Standardize quote usage in GitHub Actions workflow for Node.js setup
Stivenjs Oct 13, 2025
7852849
Enhance Amplify build process with TypeScript optimizations and impro…
Stivenjs Oct 13, 2025
bf57f46
Refactor GitHub Actions workflow to enhance caching strategy and impr…
Stivenjs Oct 13, 2025
c0a0853
Add test comment for cache incremental verification in products page
Stivenjs Oct 13, 2025
717d093
Standardize quote usage in GitHub Actions workflow for Node.js setup
Stivenjs Oct 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 39 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,42 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'

- name: Cache dependencies and build
- name: Set Node.js optimization environment variables
run: |
echo "TS_NODE_TRANSPILE_ONLY=true" >> $GITHUB_ENV
echo "TS_NODE_FILES=false" >> $GITHUB_ENV

- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.pnpm-store
${{ github.workspace }}/node_modules
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-

- name: Cache TypeScript build info
uses: actions/cache@v4
with:
path: |
${{ github.workspace }}/.tsbuildinfo
key: ${{ runner.os }}-ts-${{ hashFiles('**/tsconfig*.json') }}-${{ hashFiles('**/*.ts', '**/*.tsx') }}
restore-keys: |
${{ runner.os }}-ts-${{ hashFiles('**/tsconfig*.json') }}-
${{ runner.os }}-ts-

- name: Cache Next.js build
uses: actions/cache@v4
with:
path: |
${{ github.workspace }}/.next/cache
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
key: ${{ runner.os }}-next-${{ hashFiles('**/next.config.*', '**/package.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
restore-keys: |
${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}-
${{ runner.os }}-next-${{ hashFiles('**/next.config.*', '**/package.json') }}-
${{ runner.os }}-next-

- name: Create dummy amplify_outputs.json
run: |
Expand Down Expand Up @@ -74,5 +99,14 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build project
run: pnpm run build
- name: Type check (separate)
run: |
echo "Running type check..."
time pnpm run type-check:fast
echo "Type check completed"

- name: Build project (fast)
run: |
echo "Running Next.js build (no type checking)..."
time pnpm run build:fast
echo "Build completed"
7 changes: 6 additions & 1 deletion amplify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,14 @@ frontend:
- env | grep -e LAMBDA_EMAIL_BULK >> .env.production
- env | grep -e CLOUDFRONT_KEY_PAIR_ID >> .env.production
- env | grep -e CLOUDFRONT_PRIVATE_KEY >> .env.production
- echo "TS_NODE_TRANSPILE_ONLY=true" >> .env.production
- echo "TS_NODE_FILES=false" >> .env.production
- pnpm install --frozen-lockfile
build:
commands:
- pnpm run build
- echo "Running optimized build for Amplify..."
- pnpm run build:fast
- echo "Build completed"
artifacts:
baseDirectory: .next
files:
Expand All @@ -40,5 +44,6 @@ frontend:
paths:
- .amplify/**/*
- .next/cache/**/*
- .tsbuildinfo/**/*
- ~/.pnpm-store/**/*
- node_modules/**/*
2 changes: 2 additions & 0 deletions amplify/auth/resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { customMessage } from './custom-message/resource';
import { webHookPlan } from '../functions/webHookPlan/resource';
import { postConfirmation } from './post-confirmation/resource';
import { planScheduler } from '../functions/planScheduler/resource';
import { validateStoreLimits } from '../functions/validateStoreLimits/resource';

/**
* Define and configure your auth resource
Expand Down Expand Up @@ -82,5 +83,6 @@ export const auth = defineAuth({
allow.resource(webHookPlan).to(['updateUserAttributes', 'getUser']),
allow.resource(planScheduler).to(['updateUserAttributes', 'getUser']),
allow.resource(postConfirmation).to(['updateUserAttributes', 'getUser']),
allow.resource(validateStoreLimits).to(['updateUserAttributes', 'getUser']),
],
});
14 changes: 12 additions & 2 deletions amplify/backend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { managePaymentKeys } from './functions/managePaymentKeys/resource';
import { planScheduler } from './functions/planScheduler/resource';
import { storeImages } from './functions/storeImages/resource';
import { webHookPlan } from './functions/webHookPlan/resource';
import { validateStoreLimits } from './functions/validateStoreLimits/resource';
import { storage } from './storage/resource';
import { PolicyStatement } from 'aws-cdk-lib/aws-iam';

Expand Down Expand Up @@ -54,6 +55,7 @@ const backend = defineBackend({
storeImages,
managePaymentKeys,
createProduct,
validateStoreLimits,
});

// Aplicar permisos de Bedrock para funciones de IA
Expand Down Expand Up @@ -102,8 +104,15 @@ applyDynamoDbPermissions(backend);
const apiStack = backend.createStack('api-stack');

// Crear todas las APIs REST
const { subscriptionApi, webHookApi, checkStoreDomainApi, storeImagesApi, bulkEmailApi, apiRestPolicy } =
createRestApis(apiStack, backend);
const {
subscriptionApi,
webHookApi,
checkStoreDomainApi,
storeImagesApi,
bulkEmailApi,
storeLimitsApi,
apiRestPolicy,
} = createRestApis(apiStack, backend);

// Aplicar políticas de acceso a las APIs
applyApiAccessPolicies(backend, apiRestPolicy);
Expand All @@ -117,6 +126,7 @@ const backendOutputs = createBackendOutputs(
checkStoreDomainApi,
storeImagesApi,
bulkEmailApi,
storeLimitsApi,
emailQueue,
highPriorityEmailQueue
);
Expand Down
23 changes: 23 additions & 0 deletions amplify/config/apis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface ApiResources {
checkStoreDomainApi: RestApi;
storeImagesApi: RestApi;
bulkEmailApi: RestApi;
storeLimitsApi: RestApi;
apiRestPolicy: Policy;
}

Expand Down Expand Up @@ -119,6 +120,26 @@ export function createRestApis(stack: Stack, backend: any): ApiResources {
emailResource.addResource('send-bulk').addMethod('POST', bulkEmailIntegration);
emailResource.addResource('test-email').addMethod('POST', bulkEmailIntegration);

/**
* API para Validar Límites de Tiendas
*/
const storeLimitsApi = new RestApi(stack, 'StoreLimitsApi', {
restApiName: `StoreLimitsApi-${stageName}`,
deploy: true,
deployOptions: deployConfig,
defaultCorsPreflightOptions: corsConfig,
});

const storeLimitsIntegration = new LambdaIntegration(backend.validateStoreLimits.resources.lambda);

const storeLimitsResource = storeLimitsApi.root.addResource('validate-limits', {
defaultMethodOptions: {
authorizationType: isProduction ? AuthorizationType.IAM : AuthorizationType.NONE,
},
});

storeLimitsResource.addMethod('POST', storeLimitsIntegration);

/**
* Política de IAM para Invocar las APIs
*/
Expand All @@ -132,6 +153,7 @@ export function createRestApis(stack: Stack, backend: any): ApiResources {
`${checkStoreDomainApi.arnForExecuteApi('*', '/check-store-domain', stageName)}`,
`${storeImagesApi.arnForExecuteApi('*', '/store-images', stageName)}`,
`${bulkEmailApi.arnForExecuteApi('*', '/email/*', stageName)}`,
`${storeLimitsApi.arnForExecuteApi('*', '/validate-limits', stageName)}`,
],
}),
],
Expand All @@ -143,6 +165,7 @@ export function createRestApis(stack: Stack, backend: any): ApiResources {
checkStoreDomainApi,
storeImagesApi,
bulkEmailApi,
storeLimitsApi,
apiRestPolicy,
};
}
8 changes: 8 additions & 0 deletions amplify/config/outputs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export interface BackendOutputs {
CheckStoreDomainApi: ApiOutput;
StoreImagesApi: ApiOutput;
BulkEmailApi: ApiOutput;
StoreLimitsApi: ApiOutput;
};
EmailQueues: {
emailQueueUrl: string;
Expand All @@ -42,6 +43,7 @@ export function createBackendOutputs(
checkStoreDomainApi: RestApi,
storeImagesApi: RestApi,
bulkEmailApi: RestApi,
storeLimitsApi: RestApi,
emailQueue: Queue,
highPriorityEmailQueue: Queue
): BackendOutputs {
Expand Down Expand Up @@ -81,6 +83,12 @@ export function createBackendOutputs(
apiName: bulkEmailApi.restApiName,
stage: stageName,
},
StoreLimitsApi: {
endpoint: storeLimitsApi.url,
region: Stack.of(storeLimitsApi).region,
apiName: storeLimitsApi.restApiName,
stage: stageName,
},
},
EmailQueues: {
emailQueueUrl: emailQueue.queueUrl,
Expand Down
147 changes: 126 additions & 21 deletions amplify/data/functions/chat-generate/systemPrompt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,30 +40,123 @@ EXPERIENCIA Y CONOCIMIENTO:
- Atención al cliente y soporte
- Finanzas y análisis de rentabilidad

ESTILO DE COMUNICACIÓN:
- Profesional pero accesible, evitando jerga técnica innecesaria
- Claro y directo, con ejemplos prácticos cuando sea relevante
- Estructurado y organizado, facilitando la comprensión
- Accionable, proporcionando pasos concretos y recomendaciones
ESTILO DE COMUNICACIÓN:
- Profesional pero accesible, evitando jerga técnica innecesaria
- Claro y directo, con ejemplos prácticos cuando sea relevante
- Estructurado y organizado, facilitando la comprensión
- Accionable, proporcionando pasos concretos y recomendaciones
- Ortografía perfecta: revisa cada respuesta antes de enviarla
- Evita errores de tipeo, acentos faltantes y palabras mal escritas
- Puedes usar algunos emojis para hacer las respuestas más interactivas y amigables, pero sin abusar de ellos (máximo 2-3 por respuesta)

FORMATO DE RESPUESTAS:
- Introducción clara del tema
- Explicación detallada con contexto
- Ejemplos prácticos o casos de uso
- Recomendaciones específicas y accionables
- Recursos adicionales cuando sea apropiado

RESTRICCIONES IMPORTANTES:
- NUNCA usar formato poético, haiku o verso
- EVITAR respuestas demasiado técnicas sin contexto
- NO dar consejos financieros o legales específicos sin disclaimer
- MANTENER neutralidad sobre plataformas específicas
- FOCALIZAR en soluciones prácticas y implementables
- Usar Markdown para estructurar las respuestas de manera clara y legible
- Usar encabezados (##, ###) para organizar secciones principales
- Usar listas con viñetas (-) o numeradas (1.) para recomendaciones y pasos
- Usar **negrita** para enfatizar puntos importantes
- Usar *cursiva* para términos técnicos o énfasis sutil
- Usar \`código\` para términos técnicos específicos
- Estructura típica:
## Introducción
Breve contexto del tema

## Análisis/Explicación
Desarrollo detallado con contexto

## Recomendaciones Prácticas
- Paso 1: Descripción
- Paso 2: Descripción

## Ejemplos/Casos de Uso
Casos prácticos cuando sea relevante

## Recursos Adicionales
- Enlaces o herramientas útiles

RESTRICCIONES IMPORTANTES:
- NUNCA usar formato poético, haiku o verso
- NUNCA usar formato <thinking> o cualquier tag similar (incluyendo <thinking>, </thinking>, o cualquier variación)
- NUNCA mostrar procesos de pensamiento interno o reflexiones
- NUNCA INVENTAR información que no conoces
- NUNCA hacer suposiciones sobre datos específicos o estadísticas
- SI NO SABES algo, admítelo claramente: \`No tengo información específica sobre...\`
- EVITAR respuestas demasiado técnicas sin contexto
- NO dar consejos financieros o legales específicos sin disclaimer
- MANTENER neutralidad sobre plataformas específicas
- FOCALIZAR en soluciones prácticas y implementables
- SIEMPRE enviar solo la respuesta final, sin explicaciones internas
- PROHIBIDO ABSOLUTO: Usar tags como <thinking>, <analysis>, <planning>, o cualquier formato de pensamiento interno

CONTEXTO DE FASTTIFY:
Eres parte del equipo de consultoría de Fasttify, una plataforma innovadora que ayuda a emprendedores y empresas a crear y hacer crecer sus negocios de comercio electrónico. Mantén este contexto en mente al proporcionar consejos y recomendaciones.

Recuerda: Tu objetivo es ser el consultor de e-commerce de confianza que ayuda a los usuarios a tomar decisiones informadas y implementar estrategias efectivas para el crecimiento de sus negocios online.`;
IMPORTANTE:
- NO hables sobre tu estilo de capacitación o metodología de trabajo
- NO describas tus características como consultor
- NO expliques cómo trabajas o tu proceso interno
- NO respondas preguntas técnicas sobre ti mismo (modelo de IA, tecnología, etc.)
- NO reveles información sobre sistemas, arquitectura o implementación técnica
- ENFÓCATE únicamente en responder consultas específicas sobre e-commerce
- PROPORCIONA información práctica y accionable sobre tiendas online, marketing digital, ventas online, etc.
- Si te preguntan sobre tecnología o sobre ti mismo, responde: \`Mi especialidad es el e-commerce. ¿En qué puedo ayudarte con tu tienda online?\`

ALCANCE DE CONSULTAS:
- SOLO responde preguntas relacionadas con e-commerce, tiendas online y negocios digitales
- Temas válidos: marketing digital, SEO, SEM, redes sociales, conversión, UX/UI, logística, inventario, análisis de datos, estrategias de venta, etc.
- Temas NO válidos: tecnología de IA, modelos de lenguaje, sistemas informáticos, programación, arquitectura de software, etc.
- Si te preguntan algo fuera del e-commerce, redirige educadamente al tema

TONO Y PERSONALIDAD:
- Mantén un tono profesional pero cercano y accesible
- Sé empático con las dificultades de los emprendedores
- Usa un lenguaje motivador y positivo
- Evita ser demasiado formal o académico
- Adapta el nivel técnico al contexto de la pregunta

INFORMACIÓN SENSIBLE:
- NO pidas información personal específica (nombres, direcciones, números de tarjeta)
- NO solicites datos financieros confidenciales
- NO almacenes ni recuerdes información personal entre conversaciones
- Mantén un enfoque general y educativo

ESTRUCTURA DE RESPUESTAS:
- Máximo 3-4 secciones principales por respuesta
- Cada sección con máximo 3-4 puntos clave
- Usar bullets concisos (máximo 1 línea por bullet)
- Incluir solo ejemplos relevantes y específicos
- Terminar con una pregunta para continuar la conversación

PREGUNTAS VAGAS:
- Si la pregunta es muy general, pide aclaración específica
- Sugiere 2-3 enfoques diferentes para abordar el tema
- Proporciona un marco general y luego profundiza según la respuesta

LÍMITES DE RESPUESTA:
- Máximo 800 palabras por respuesta
- Si necesitas más espacio, sugiere continuar en otro mensaje
- Prioriza calidad sobre cantidad de información

HONESTIDAD Y TRANSPARENCIA:
- SIEMPRE sé honesto sobre lo que sabes y lo que no sabes
- Si no tienes información específica sobre algo, dilo claramente
- NO inventes datos, estadísticas, precios o información técnica específica
- Si algo está fuera de tu área de expertise, reconócelo
- Mejor decir \`No tengo esa información\` que inventar algo

CONTROL DE CALIDAD:
- Antes de enviar cualquier respuesta, verifica la ortografía y gramática
- Asegúrate de que todas las palabras estén correctamente acentuadas
- Revisa que no haya errores de tipeo o palabras faltantes
- Confirma que el formato Markdown esté bien estructurado
- VERIFICA que NO hay tags de pensamiento como <thinking>, <analysis>, etc.
- Envía únicamente la respuesta final, sin procesos internos visibles
- Asegúrate de que la respuesta comience directamente con el contenido útil

RECUERDA:
- Tu objetivo es ser el consultor de e-commerce de confianza que ayuda a los usuarios a tomar decisiones informadas y implementar estrategias efectivas para el crecimiento de sus negocios online.
- Responde DIRECTAMENTE a la pregunta del usuario con información útil sobre e-commerce.
- NO te describas a ti mismo ni expliques tu metodología de trabajo.
- Mantén el foco en la consulta específica del usuario.`;

/**
* Función helper para crear el prompt del usuario para consultas de chat
Expand All @@ -83,11 +176,23 @@ export const processChatResponse = (responseText: string): string => {
// Limpiar y formatear la respuesta
let cleanedResponse = responseText.trim();

// Remover cualquier formato de código markdown si no es apropiado
if (cleanedResponse.startsWith('```') && cleanedResponse.endsWith('```')) {
// Si toda la respuesta está en un bloque de código, remover el formato
// Solo remover bloques de código markdown si toda la respuesta está envuelta en ellos
// Esto preserva el formato Markdown normal pero evita respuestas que sean solo código
if (
cleanedResponse.startsWith('```') &&
cleanedResponse.endsWith('```') &&
cleanedResponse.split('```').length === 3
) {
// Si toda la respuesta está en un solo bloque de código, remover el formato
cleanedResponse = cleanedResponse.replace(/```\w*\n?|\n?```/g, '').trim();
}

// Asegurar que los encabezados Markdown tengan espacio después
cleanedResponse = cleanedResponse.replace(/^(#{1,6})\s*([^\n]+)$/gm, '$1 $2');

// Asegurar que las listas tengan formato consistente
cleanedResponse = cleanedResponse.replace(/^\s*[-*]\s+(.+)$/gm, '- $1');
cleanedResponse = cleanedResponse.replace(/^\s*(\d+\.)\s+(.+)$/gm, '$1 $2');

return cleanedResponse;
};
Loading