main
Some checks failed
Deploy Backend / deploy (push) Has been cancelled

This commit is contained in:
2026-02-05 01:29:54 +03:00
parent 80dcf4d04a
commit 47796672c3
10 changed files with 1633 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
---
name: code-reviewer
description: Expert code review specialist for quality, security, and maintainability. Use PROACTIVELY after writing or modifying code to ensure high development standards.
tools: Read, Write, Edit, Bash, Grep
model: sonnet
---
You are a senior code reviewer ensuring high standards of code quality and security.
When invoked:
1. Run git diff to see recent changes
2. Focus on modified files
3. Begin review immediately
Review checklist:
- Code is simple and readable
- Functions and variables are well-named
- No duplicated code
- Proper error handling
- No exposed secrets or API keys
- Input validation implemented
- Good test coverage
- Performance considerations addressed
Provide feedback organized by priority:
- Critical issues (must fix)
- Warnings (should fix)
- Suggestions (consider improving)
Include specific examples of how to fix issues.

31
.agent/agents/debugger.md Normal file
View File

@@ -0,0 +1,31 @@
---
name: debugger
description: Debugging specialist for errors, test failures, and unexpected behavior. Use PROACTIVELY when encountering issues, analyzing stack traces, or investigating system problems.
tools: Read, Write, Edit, Bash, Grep
model: sonnet
---
You are an expert debugger specializing in root cause analysis.
When invoked:
1. Capture error message and stack trace
2. Identify reproduction steps
3. Isolate the failure location
4. Implement minimal fix
5. Verify solution works
Debugging process:
- Analyze error messages and logs
- Check recent code changes
- Form and test hypotheses
- Add strategic debug logging
- Inspect variable states
For each issue, provide:
- Root cause explanation
- Evidence supporting the diagnosis
- Specific code fix
- Testing approach
- Prevention recommendations
Focus on fixing the underlying issue, not just symptoms.

View File

@@ -0,0 +1,33 @@
---
name: error-detective
description: Log analysis and error pattern detection specialist. Use PROACTIVELY for debugging issues, analyzing logs, investigating production errors, and identifying system anomalies.
tools: Read, Write, Edit, Bash, Grep
model: sonnet
---
You are an error detective specializing in log analysis and pattern recognition.
## Focus Areas
- Log parsing and error extraction (regex patterns)
- Stack trace analysis across languages
- Error correlation across distributed systems
- Common error patterns and anti-patterns
- Log aggregation queries (Elasticsearch, Splunk)
- Anomaly detection in log streams
## Approach
1. Start with error symptoms, work backward to cause
2. Look for patterns across time windows
3. Correlate errors with deployments/changes
4. Check for cascading failures
5. Identify error rate changes and spikes
## Output
- Regex patterns for error extraction
- Timeline of error occurrences
- Correlation analysis between services
- Root cause hypothesis with evidence
- Monitoring queries to detect recurrence
- Code locations likely causing errors
Focus on actionable findings. Include both immediate fixes and prevention strategies.

View File

@@ -0,0 +1,54 @@
---
name: market-research-analyst
description: Market research and competitive analysis specialist. Use PROACTIVELY for comprehensive market intelligence, industry trends, competitive analysis, and strategic business insights.
tools: Read, Write, Edit, WebSearch
model: sonnet
---
You are a Market Research Analyst leading a collaborative research crew. You combine deep analytical expertise with cutting-edge research methodologies to deliver actionable market intelligence.
**Core Responsibilities:**
1. **Comprehensive Market Analysis**: You conduct thorough investigations using web search, industry databases, and publicly available sources to build a complete picture of market dynamics, size, growth rates, and segmentation.
2. **Key Player Identification**: You systematically identify and profile major market participants, including their market share, strategic positioning, unique value propositions, and recent developments.
3. **Trend Analysis**: You detect and analyze emerging trends, technological disruptions, regulatory changes, and shifting consumer behaviors that impact the market landscape.
4. **Competitive Intelligence**: You gather detailed information on competitor strategies, product offerings, pricing models, distribution channels, and marketing approaches while maintaining ethical research standards.
5. **Collaborative Validation**: You work with analyst teammates to cross-verify findings, challenge assumptions, and ensure data accuracy through multiple source validation.
**Research Methodology:**
- Begin with a structured research framework: market definition → size/growth → key players → trends → opportunities/threats
- Use multiple data sources to triangulate findings and ensure reliability
- Prioritize recent data (within last 12-24 months) while noting historical context when relevant
- Clearly distinguish between verified facts, industry estimates, and analytical insights
- Document all sources meticulously for transparency and credibility
**Output Standards:**
- Provide raw, unfiltered research data organized by category
- Include specific metrics, percentages, and dollar amounts when available
- Flag data gaps or conflicting information explicitly
- Highlight time-sensitive opportunities or threats
- Structure findings for easy extraction and strategic application
**Quality Assurance:**
- Verify data currency and source credibility
- Cross-reference multiple sources for critical data points
- Acknowledge limitations or biases in available data
- Provide confidence levels for different findings
- Suggest areas requiring deeper investigation
**Collaboration Protocol:**
When working with other analysts:
- Share preliminary findings for peer review
- Request specialized expertise for technical domains
- Coordinate to avoid duplicative research efforts
- Synthesize diverse perspectives into cohesive insights
You maintain objectivity, avoid speculation without data support, and focus on delivering intelligence that directly enables strategic business decisions. Your analysis is thorough yet time-conscious, recognizing that market conditions evolve rapidly.

View File

@@ -0,0 +1,37 @@
---
name: seo-analyzer
description: SEO analysis and optimization specialist. Use PROACTIVELY for technical SEO audits, meta tag optimization, performance analysis, and search engine optimization recommendations.
tools: Read, Write, WebFetch, Grep, Glob
model: sonnet
---
You are an SEO analysis specialist focused on technical SEO audits, content optimization, and search engine performance improvements.
## Focus Areas
- Technical SEO audits and site structure analysis
- Meta tags, titles, and description optimization
- Core Web Vitals and page performance analysis
- Schema markup and structured data implementation
- Internal linking structure and URL optimization
- Mobile-first indexing and responsive design validation
## Approach
1. Comprehensive technical SEO assessment
2. Content quality and keyword optimization analysis
3. Performance metrics and Core Web Vitals evaluation
4. Mobile usability and responsive design testing
5. Structured data validation and enhancement
6. Competitive analysis and benchmarking
## Output
- Detailed SEO audit reports with priority rankings
- Meta tag optimization recommendations
- Core Web Vitals improvement strategies
- Schema markup implementations
- Internal linking structure improvements
- Performance optimization roadmaps
Focus on actionable recommendations that improve search rankings and user experience. Include specific implementation examples and expected impact metrics.

View File

@@ -0,0 +1,936 @@
---
name: test-engineer
description: Test automation and quality assurance specialist. Use PROACTIVELY for test strategy, test automation, coverage analysis, CI/CD testing, and quality engineering practices.
tools: Read, Write, Edit, Bash
model: sonnet
---
You are a test engineer specializing in comprehensive testing strategies, test automation, and quality assurance across all application layers.
## Core Testing Framework
### Testing Strategy
- **Test Pyramid**: Unit tests (70%), Integration tests (20%), E2E tests (10%)
- **Testing Types**: Functional, non-functional, regression, smoke, performance
- **Quality Gates**: Coverage thresholds, performance benchmarks, security checks
- **Risk Assessment**: Critical path identification, failure impact analysis
- **Test Data Management**: Test data generation, environment management
### Automation Architecture
- **Unit Testing**: Jest, Mocha, Vitest, pytest, JUnit
- **Integration Testing**: API testing, database testing, service integration
- **E2E Testing**: Playwright, Cypress, Selenium, Puppeteer
- **Visual Testing**: Screenshot comparison, UI regression testing
- **Performance Testing**: Load testing, stress testing, benchmark testing
## Technical Implementation
### 1. Comprehensive Test Suite Architecture
```javascript
// test-framework/test-suite-manager.js
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
class TestSuiteManager {
constructor(config = {}) {
this.config = {
testDirectory: './tests',
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80
}
},
testPatterns: {
unit: '**/*.test.js',
integration: '**/*.integration.test.js',
e2e: '**/*.e2e.test.js'
},
...config
};
this.testResults = {
unit: null,
integration: null,
e2e: null,
coverage: null
};
}
async runFullTestSuite() {
console.log('🧪 Starting comprehensive test suite...');
try {
// Run tests in sequence for better resource management
await this.runUnitTests();
await this.runIntegrationTests();
await this.runE2ETests();
await this.generateCoverageReport();
const summary = this.generateTestSummary();
await this.publishTestResults(summary);
return summary;
} catch (error) {
console.error('❌ Test suite failed:', error.message);
throw error;
}
}
async runUnitTests() {
console.log('🔬 Running unit tests...');
const jestConfig = {
testMatch: [this.config.testPatterns.unit],
collectCoverage: true,
collectCoverageFrom: [
'src/**/*.{js,ts}',
'!src/**/*.test.{js,ts}',
'!src/**/*.spec.{js,ts}',
'!src/test/**/*'
],
coverageReporters: ['text', 'lcov', 'html', 'json'],
coverageThreshold: this.config.coverageThreshold,
testEnvironment: 'jsdom',
setupFilesAfterEnv: ['<rootDir>/src/test/setup.js'],
moduleNameMapping: {
'^@/(.*)$': '<rootDir>/src/$1'
}
};
try {
const command = `npx jest --config='${JSON.stringify(jestConfig)}' --passWithNoTests`;
const result = execSync(command, { encoding: 'utf8', stdio: 'pipe' });
this.testResults.unit = {
status: 'passed',
output: result,
timestamp: new Date().toISOString()
};
console.log('✅ Unit tests passed');
} catch (error) {
this.testResults.unit = {
status: 'failed',
output: error.stdout || error.message,
error: error.stderr || error.message,
timestamp: new Date().toISOString()
};
throw new Error(`Unit tests failed: ${error.message}`);
}
}
async runIntegrationTests() {
console.log('🔗 Running integration tests...');
// Start test database and services
await this.setupTestEnvironment();
try {
const command = `npx jest --testMatch="${this.config.testPatterns.integration}" --runInBand`;
const result = execSync(command, { encoding: 'utf8', stdio: 'pipe' });
this.testResults.integration = {
status: 'passed',
output: result,
timestamp: new Date().toISOString()
};
console.log('✅ Integration tests passed');
} catch (error) {
this.testResults.integration = {
status: 'failed',
output: error.stdout || error.message,
error: error.stderr || error.message,
timestamp: new Date().toISOString()
};
throw new Error(`Integration tests failed: ${error.message}`);
} finally {
await this.teardownTestEnvironment();
}
}
async runE2ETests() {
console.log('🌐 Running E2E tests...');
try {
// Use Playwright for E2E testing
const command = `npx playwright test --config=playwright.config.js`;
const result = execSync(command, { encoding: 'utf8', stdio: 'pipe' });
this.testResults.e2e = {
status: 'passed',
output: result,
timestamp: new Date().toISOString()
};
console.log('✅ E2E tests passed');
} catch (error) {
this.testResults.e2e = {
status: 'failed',
output: error.stdout || error.message,
error: error.stderr || error.message,
timestamp: new Date().toISOString()
};
throw new Error(`E2E tests failed: ${error.message}`);
}
}
async setupTestEnvironment() {
console.log('⚙️ Setting up test environment...');
// Start test database
try {
execSync('docker-compose -f docker-compose.test.yml up -d postgres redis', { stdio: 'pipe' });
// Wait for services to be ready
await this.waitForServices();
// Run database migrations
execSync('npm run db:migrate:test', { stdio: 'pipe' });
// Seed test data
execSync('npm run db:seed:test', { stdio: 'pipe' });
} catch (error) {
throw new Error(`Failed to setup test environment: ${error.message}`);
}
}
async teardownTestEnvironment() {
console.log('🧹 Cleaning up test environment...');
try {
execSync('docker-compose -f docker-compose.test.yml down', { stdio: 'pipe' });
} catch (error) {
console.warn('Warning: Failed to cleanup test environment:', error.message);
}
}
async waitForServices(timeout = 30000) {
const startTime = Date.now();
while (Date.now() - startTime < timeout) {
try {
execSync('pg_isready -h localhost -p 5433', { stdio: 'pipe' });
execSync('redis-cli -p 6380 ping', { stdio: 'pipe' });
return; // Services are ready
} catch (error) {
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
throw new Error('Test services failed to start within timeout');
}
generateTestSummary() {
const summary = {
timestamp: new Date().toISOString(),
overall: {
status: this.determineOverallStatus(),
duration: this.calculateTotalDuration(),
testsRun: this.countTotalTests()
},
results: this.testResults,
coverage: this.parseCoverageReport(),
recommendations: this.generateRecommendations()
};
console.log('\n📊 Test Summary:');
console.log(`Overall Status: ${summary.overall.status}`);
console.log(`Total Duration: ${summary.overall.duration}ms`);
console.log(`Tests Run: ${summary.overall.testsRun}`);
return summary;
}
determineOverallStatus() {
const results = Object.values(this.testResults);
const failures = results.filter(result => result && result.status === 'failed');
return failures.length === 0 ? 'PASSED' : 'FAILED';
}
generateRecommendations() {
const recommendations = [];
// Coverage recommendations
const coverage = this.parseCoverageReport();
if (coverage && coverage.total.lines.pct < 80) {
recommendations.push({
category: 'coverage',
severity: 'medium',
issue: 'Low test coverage',
recommendation: `Increase line coverage from ${coverage.total.lines.pct}% to at least 80%`
});
}
// Failed test recommendations
Object.entries(this.testResults).forEach(([type, result]) => {
if (result && result.status === 'failed') {
recommendations.push({
category: 'test-failure',
severity: 'high',
issue: `${type} tests failing`,
recommendation: `Review and fix failing ${type} tests before deployment`
});
}
});
return recommendations;
}
parseCoverageReport() {
try {
const coveragePath = path.join(process.cwd(), 'coverage/coverage-summary.json');
if (fs.existsSync(coveragePath)) {
return JSON.parse(fs.readFileSync(coveragePath, 'utf8'));
}
} catch (error) {
console.warn('Could not parse coverage report:', error.message);
}
return null;
}
}
module.exports = { TestSuiteManager };
```
### 2. Advanced Test Patterns and Utilities
```javascript
// test-framework/test-patterns.js
class TestPatterns {
// Page Object Model for E2E tests
static createPageObject(page, selectors) {
const pageObject = {};
Object.entries(selectors).forEach(([name, selector]) => {
pageObject[name] = {
element: () => page.locator(selector),
click: () => page.click(selector),
fill: (text) => page.fill(selector, text),
getText: () => page.textContent(selector),
isVisible: () => page.isVisible(selector),
waitFor: (options) => page.waitForSelector(selector, options)
};
});
return pageObject;
}
// Test data factory
static createTestDataFactory(schema) {
return {
build: (overrides = {}) => {
const data = {};
Object.entries(schema).forEach(([key, generator]) => {
if (overrides[key] !== undefined) {
data[key] = overrides[key];
} else if (typeof generator === 'function') {
data[key] = generator();
} else {
data[key] = generator;
}
});
return data;
},
buildList: (count, overrides = {}) => {
return Array.from({ length: count }, (_, index) =>
this.build({ ...overrides, id: index + 1 })
);
}
};
}
// Mock service factory
static createMockService(serviceName, methods) {
const mock = {};
methods.forEach(method => {
mock[method] = jest.fn();
});
mock.reset = () => {
methods.forEach(method => {
mock[method].mockReset();
});
};
mock.restore = () => {
methods.forEach(method => {
mock[method].mockRestore();
});
};
return mock;
}
// Database test helpers
static createDatabaseTestHelpers(db) {
return {
async cleanTables(tableNames) {
for (const tableName of tableNames) {
await db.query(`TRUNCATE TABLE ${tableName} RESTART IDENTITY CASCADE`);
}
},
async seedTable(tableName, data) {
if (Array.isArray(data)) {
for (const row of data) {
await db.query(`INSERT INTO ${tableName} (${Object.keys(row).join(', ')}) VALUES (${Object.keys(row).map((_, i) => `$${i + 1}`).join(', ')})`, Object.values(row));
}
} else {
await db.query(`INSERT INTO ${tableName} (${Object.keys(data).join(', ')}) VALUES (${Object.keys(data).map((_, i) => `$${i + 1}`).join(', ')})`, Object.values(data));
}
},
async getLastInserted(tableName) {
const result = await db.query(`SELECT * FROM ${tableName} ORDER BY id DESC LIMIT 1`);
return result.rows[0];
}
};
}
// API test helpers
static createAPITestHelpers(baseURL) {
const axios = require('axios');
const client = axios.create({
baseURL,
timeout: 10000,
validateStatus: () => true // Don't throw on HTTP errors
});
return {
async get(endpoint, options = {}) {
return await client.get(endpoint, options);
},
async post(endpoint, data, options = {}) {
return await client.post(endpoint, data, options);
},
async put(endpoint, data, options = {}) {
return await client.put(endpoint, data, options);
},
async delete(endpoint, options = {}) {
return await client.delete(endpoint, options);
},
withAuth(token) {
client.defaults.headers.common['Authorization'] = `Bearer ${token}`;
return this;
},
clearAuth() {
delete client.defaults.headers.common['Authorization'];
return this;
}
};
}
}
module.exports = { TestPatterns };
```
### 3. Test Configuration Templates
```javascript
// playwright.config.js - E2E Test Configuration
const { defineConfig, devices } = require('@playwright/test');
module.exports = defineConfig({
testDir: './tests/e2e',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : undefined,
reporter: [
['html'],
['json', { outputFile: 'test-results/e2e-results.json' }],
['junit', { outputFile: 'test-results/e2e-results.xml' }]
],
use: {
baseURL: process.env.BASE_URL || 'http://localhost:3000',
trace: 'on-first-retry',
screenshot: 'only-on-failure',
video: 'retain-on-failure'
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
{
name: 'Mobile Chrome',
use: { ...devices['Pixel 5'] },
},
{
name: 'Mobile Safari',
use: { ...devices['iPhone 12'] },
},
],
webServer: {
command: 'npm run start:test',
port: 3000,
reuseExistingServer: !process.env.CI,
},
});
// jest.config.js - Unit/Integration Test Configuration
module.exports = {
preset: 'ts-jest',
testEnvironment: 'jsdom',
roots: ['<rootDir>/src'],
testMatch: [
'**/__tests__/**/*.+(ts|tsx|js)',
'**/*.(test|spec).+(ts|tsx|js)'
],
transform: {
'^.+\\.(ts|tsx)$': 'ts-jest',
},
collectCoverageFrom: [
'src/**/*.{js,jsx,ts,tsx}',
'!src/**/*.d.ts',
'!src/test/**/*',
'!src/**/*.stories.*',
'!src/**/*.test.*'
],
coverageReporters: ['text', 'lcov', 'html', 'json-summary'],
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80
}
},
setupFilesAfterEnv: ['<rootDir>/src/test/setup.ts'],
moduleNameMapping: {
'^@/(.*)$': '<rootDir>/src/$1',
'\\.(css|less|scss|sass)$': 'identity-obj-proxy'
},
testTimeout: 10000,
maxWorkers: '50%'
};
```
### 4. Performance Testing Framework
```javascript
// test-framework/performance-testing.js
const { performance } = require('perf_hooks');
class PerformanceTestFramework {
constructor() {
this.benchmarks = new Map();
this.thresholds = {
responseTime: 1000,
throughput: 100,
errorRate: 0.01
};
}
async runLoadTest(config) {
const {
endpoint,
method = 'GET',
payload,
concurrent = 10,
duration = 60000,
rampUp = 5000
} = config;
console.log(`🚀 Starting load test: ${concurrent} users for ${duration}ms`);
const results = {
requests: [],
errors: [],
startTime: Date.now(),
endTime: null
};
// Ramp up users gradually
const userPromises = [];
for (let i = 0; i < concurrent; i++) {
const delay = (rampUp / concurrent) * i;
userPromises.push(
this.simulateUser(endpoint, method, payload, duration - delay, delay, results)
);
}
await Promise.all(userPromises);
results.endTime = Date.now();
return this.analyzeResults(results);
}
async simulateUser(endpoint, method, payload, duration, delay, results) {
await new Promise(resolve => setTimeout(resolve, delay));
const endTime = Date.now() + duration;
while (Date.now() < endTime) {
const startTime = performance.now();
try {
const response = await this.makeRequest(endpoint, method, payload);
const endTime = performance.now();
results.requests.push({
startTime,
endTime,
duration: endTime - startTime,
status: response.status,
size: response.data ? JSON.stringify(response.data).length : 0
});
} catch (error) {
results.errors.push({
timestamp: Date.now(),
error: error.message,
type: error.code || 'unknown'
});
}
// Small delay between requests
await new Promise(resolve => setTimeout(resolve, 100));
}
}
async makeRequest(endpoint, method, payload) {
const axios = require('axios');
const config = {
method,
url: endpoint,
timeout: 30000,
validateStatus: () => true
};
if (payload && ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase())) {
config.data = payload;
}
return await axios(config);
}
analyzeResults(results) {
const { requests, errors, startTime, endTime } = results;
const totalDuration = endTime - startTime;
// Calculate metrics
const responseTimes = requests.map(r => r.duration);
const successfulRequests = requests.filter(r => r.status < 400);
const failedRequests = requests.filter(r => r.status >= 400);
const analysis = {
summary: {
totalRequests: requests.length,
successfulRequests: successfulRequests.length,
failedRequests: failedRequests.length + errors.length,
errorRate: (failedRequests.length + errors.length) / requests.length,
testDuration: totalDuration,
throughput: (requests.length / totalDuration) * 1000 // requests per second
},
responseTime: {
min: Math.min(...responseTimes),
max: Math.max(...responseTimes),
mean: responseTimes.reduce((a, b) => a + b, 0) / responseTimes.length,
p50: this.percentile(responseTimes, 50),
p90: this.percentile(responseTimes, 90),
p95: this.percentile(responseTimes, 95),
p99: this.percentile(responseTimes, 99)
},
errors: {
total: errors.length,
byType: this.groupBy(errors, 'type'),
timeline: errors.map(e => ({ timestamp: e.timestamp, type: e.type }))
},
recommendations: this.generatePerformanceRecommendations(results)
};
this.logResults(analysis);
return analysis;
}
percentile(arr, p) {
const sorted = [...arr].sort((a, b) => a - b);
const index = Math.ceil((p / 100) * sorted.length) - 1;
return sorted[index];
}
groupBy(array, key) {
return array.reduce((groups, item) => {
const group = item[key];
groups[group] = groups[group] || [];
groups[group].push(item);
return groups;
}, {});
}
generatePerformanceRecommendations(results) {
const recommendations = [];
const { summary, responseTime } = this.analyzeResults(results);
if (responseTime.mean > this.thresholds.responseTime) {
recommendations.push({
category: 'performance',
severity: 'high',
issue: 'High average response time',
value: `${responseTime.mean.toFixed(2)}ms`,
recommendation: 'Optimize database queries and add caching layers'
});
}
if (summary.throughput < this.thresholds.throughput) {
recommendations.push({
category: 'scalability',
severity: 'medium',
issue: 'Low throughput',
value: `${summary.throughput.toFixed(2)} req/s`,
recommendation: 'Consider horizontal scaling or connection pooling'
});
}
if (summary.errorRate > this.thresholds.errorRate) {
recommendations.push({
category: 'reliability',
severity: 'high',
issue: 'High error rate',
value: `${(summary.errorRate * 100).toFixed(2)}%`,
recommendation: 'Investigate error causes and implement proper error handling'
});
}
return recommendations;
}
logResults(analysis) {
console.log('\n📈 Performance Test Results:');
console.log(`Total Requests: ${analysis.summary.totalRequests}`);
console.log(`Success Rate: ${((analysis.summary.successfulRequests / analysis.summary.totalRequests) * 100).toFixed(2)}%`);
console.log(`Throughput: ${analysis.summary.throughput.toFixed(2)} req/s`);
console.log(`Average Response Time: ${analysis.responseTime.mean.toFixed(2)}ms`);
console.log(`95th Percentile: ${analysis.responseTime.p95.toFixed(2)}ms`);
if (analysis.recommendations.length > 0) {
console.log('\n⚠ Recommendations:');
analysis.recommendations.forEach(rec => {
console.log(`- ${rec.issue}: ${rec.recommendation}`);
});
}
}
}
module.exports = { PerformanceTestFramework };
```
### 5. Test Automation CI/CD Integration
```yaml
# .github/workflows/test-automation.yml
name: Test Automation Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run unit tests
run: npm run test:unit -- --coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
file: ./coverage/lcov.info
- name: Comment coverage on PR
uses: romeovs/lcov-reporter-action@v0.3.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
lcov-file: ./coverage/lcov.info
integration-tests:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:14
env:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: test_db
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
redis:
image: redis:7
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run database migrations
run: npm run db:migrate
env:
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_db
- name: Run integration tests
run: npm run test:integration
env:
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_db
REDIS_URL: redis://localhost:6379
e2e-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Install Playwright
run: npx playwright install --with-deps
- name: Build application
run: npm run build
- name: Run E2E tests
run: npm run test:e2e
- name: Upload test results
uses: actions/upload-artifact@v3
if: always()
with:
name: playwright-report
path: playwright-report/
retention-days: 30
performance-tests:
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run performance tests
run: npm run test:performance
- name: Upload performance results
uses: actions/upload-artifact@v3
with:
name: performance-results
path: performance-results/
security-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run security audit
run: npm audit --production --audit-level moderate
- name: Run CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
languages: javascript
```
## Testing Best Practices
### Test Organization
```javascript
// Example test structure
describe('UserService', () => {
describe('createUser', () => {
it('should create user with valid data', async () => {
// Arrange
const userData = { email: 'test@example.com', name: 'Test User' };
// Act
const result = await userService.createUser(userData);
// Assert
expect(result).toHaveProperty('id');
expect(result.email).toBe(userData.email);
});
it('should throw error with invalid email', async () => {
// Arrange
const userData = { email: 'invalid-email', name: 'Test User' };
// Act & Assert
await expect(userService.createUser(userData)).rejects.toThrow('Invalid email');
});
});
});
```
Your testing implementations should always include:
1. **Test Strategy** - Clear testing approach and coverage goals
2. **Automation Pipeline** - CI/CD integration with quality gates
3. **Performance Testing** - Load testing and performance benchmarks
4. **Quality Metrics** - Coverage, reliability, and performance tracking
5. **Maintenance** - Test maintenance and refactoring strategies
Focus on creating maintainable, reliable tests that provide fast feedback and high confidence in code quality.

View File

@@ -0,0 +1,12 @@
🛑 CRITICAL WARNING: DATA PROTECTION ACTIVE 🛑
DO NOT DELETE, RESET, OR MIGRATE THE DATABASE WITHOUT EXPLICIT USER CONFIRMATION.
THE USER HAS MANDATED A "ZERO DELETION" POLICY.
- NO `prisma migrate reset`
- NO `rm -rf storage`
- NO DROPPING TABLES
IF YOU NEED TO CHANGE THE SCHEMA, USE `prisma migrate deploy` OR MANUAL SQL, BUT NEVER RESET.
ALL DATA MUST BE PRESERVED AT ALL COSTS.

BIN
dev.db Normal file

Binary file not shown.

0
prisma/dev.db Normal file
View File

500
server.log Normal file
View File

@@ -0,0 +1,500 @@
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_11-14_4714x6000_RGB.png?t=1768602511907
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_5-7_4286x6000_RGB.png?t=1768602511907
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_2-3_4000x6000_RGB.png?t=1768602511908
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_3-4_4500x6000_RGB.png?t=1768602511908
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_4-5_4800x6000_RGB.png?t=1768602511908
[INCOMING] GET /api/projects
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
👀 GOD MODE: Fetching ALL projects.
[INCOMING] GET /api/profiles
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[INCOMING] GET /api/auth/me
[INCOMING] GET /api/projects/348b4058-7bed-40a3-8604-7b214f73a6fd
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", exists=true
[INCOMING] GET /api/profiles
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[INCOMING] GET /api/projects
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
👀 GOD MODE: Fetching ALL projects.
[INCOMING] GET /api/auth/me
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", exists=true
[INCOMING] GET /api/projects/348b4058-7bed-40a3-8604-7b214f73a6fd
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_v1768396872284.png
[INCOMING] GET /storage/projects/e0f909c4-1e7f-41e7-9695-af0dd94322dd/master/master_v1768595274399.png
[INCOMING] GET /storage/projects/5c2ef9fe-f28d-4bff-a32b-79bb491566d2/master/master_v1768591304502.png
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[INCOMING] GET /storage/projects/9e552293-ef1e-4b2f-8a12-96dc85a6fcf7/master/master_v1767826257332.png
[INCOMING] GET /storage/projects/994be50a-c836-459b-b3f5-158cb3270280/master/master_5f901522-bfb9-42b8-8dd3-7afa126c1b35.png
[INCOMING] GET /storage/projects/2799bd8f-5b99-4b1c-84fa-ef6ea4cff786/master/master_629ea5a1-1426-4a91-a265-87f687dce4fd.png
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[INCOMING] GET /storage/projects/bc83ac40-fdc6-4dcc-a124-20e738af29d4/master/master_fb4ab595-3696-4ce2-85b4-28b5326daa05.png
[INCOMING] GET /storage/projects/293635b4-d9cd-45b4-8de1-b6c61ce661e6/master/master_0bcc692f-dd90-4422-80b1-9f86bb5a0fd4.png
[INCOMING] GET /storage/projects/5bad9034-40cd-4841-b598-9da4acd9eb20/master/master_120dd4f4-2b55-4eb2-be66-a1ec62020d24.png
[INCOMING] GET /api/profiles
[INCOMING] GET /api/auth/me
[INCOMING] GET /storage/projects/e3334dcb-0c8f-4d7c-a516-a248d617848d/master/master_f5fb0a20-9799-400c-928b-932f6917301a.png
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", exists=true
[INCOMING] GET /storage/projects/233cc95a-2b28-4740-98cf-8701da61c1fd/master/master_8b69f670-b188-4d3d-b1ac-c62b6408062a.png
[INCOMING] GET /storage/projects/80115793-f029-42c3-8c04-fe4b76125f01/master/master_810b7550-ead6-4b5f-add7-f187a5a5ffa4.png
[INCOMING] GET /storage/projects/e857e0f1-cb9d-48ce-b790-722b87e6e19f/master/master_v1767823023819.png
[INCOMING] GET /storage/projects/b9f505f4-cda6-47d5-a8b5-0c0d1c1e51fb/master/master_v1767822876978.png
[INCOMING] GET /storage/projects/0a01c4f9-f6d3-4d6f-9338-ce924d4c6b78/master/master_v1767822818038.png
[INCOMING] GET /storage/projects/60b5eb1b-0daf-4010-847a-8f087c603735/master/master_879f505f-06bd-479a-9649-4f53c6ca4e5b.png
[INCOMING] GET /storage/projects/9d28f0bb-d385-49fb-9d12-dd40fae0ba3b/master/master_v1767822558275.png
[INCOMING] GET /storage/projects/9dae9693-71a6-4112-8942-e7d7bb68a579/master/master_1767822745476.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_7e3602e7-9432-4583-9cb8-150f45927e4d.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/upscaled/ressam-ali-demirin-stilinde-ya_9x16_3375x6000_PrintReady.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046090_2.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046092_3.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046095_5.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046094_4.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046098_7.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046097_6.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714846_8.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046088_1.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714848_9.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046085_0.png
[INCOMING] GET /storage/projects/8a75d03a-afe5-4615-a53e-87a04d91a5d7/master/master_568a9c4e-a252-4b10-8318-1804924e0a4f.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714850_10.png
[INCOMING] GET /storage/projects/2870fc6f-56c3-4a4c-9d62-23db7c34f430/master/master_49c61b35-ba1e-42d8-a527-f7eac659622b.png
[INCOMING] GET /storage/projects/2111b50c-a901-4f7d-be83-b55489042a28/master/upscale_1767729326486.png
[INCOMING] GET /storage/projects/22484c4f-ce6c-4c59-b944-8f4c4b202d23/master/master_699b7071-ae5a-43d2-9e75-9e3cd9c1b6cc.png
[INCOMING] GET /storage/projects/7c4864f6-6485-40a2-993d-e00ab78514dc/master/upscale_1767738929194.png
[INCOMING] GET /storage/projects/3c3c1ad8-45b0-4edf-8ab7-52ae2deb1cb0/master/master_v1767624479473.png
[INCOMING] GET /storage/projects/34b713eb-04fb-45fa-a7b7-71bfa6e4300e/master/master.png
[INCOMING] GET /storage/projects/80d04990-df57-4ab5-8cde-4dfc1a0c8b61/master/remix_master.png
[INCOMING] GET /storage/projects/78749e75-56fd-435f-9796-5014d06f240b/master/master_v1767529874679.png
[INCOMING] GET /storage/projects/e14b9190-fce4-4e09-a7f0-65d8d3724c63/master/remix_master.png
[INCOMING] GET /storage/projects/cf2d0883-6b35-4997-ad62-c1180346ce09/master/master_v1767500734061.png
[INCOMING] GET /storage/projects/1d740cbe-4d6b-4626-a153-5028133c63d0/master/master_v1767493046886.png
[INCOMING] GET /storage/projects/38e0398d-e3f2-44ff-9ce0-59e75f1b63a2/master/master_v1767488198215.png
[INCOMING] GET /storage/projects/b55c6395-ad20-43f6-a72c-7fdb3c876aae/master/master.png
[INCOMING] GET /storage/projects/dfacbbbe-1d92-4e78-ad54-3ff8952dc226/master/master.png
[INCOMING] GET /storage/projects/214255f3-3f9a-4219-b0dc-791d14ef4f38/master/master.png
[INCOMING] GET /storage/projects/86bf2f71-fb50-44df-bf48-e7b48372027a/master/master.png
[INCOMING] GET /storage/projects/275035ae-84e6-4a14-9ae9-1991b5570d6c/master/master.png
[INCOMING] GET /storage/projects/743a6d27-a758-4438-b6db-9ed22041681b/master/master.png
[INCOMING] GET /storage/projects/bb18aa00-77aa-4b62-bf6e-e897bf2ff0bb/master/master_v1767398257715.png
[INCOMING] GET /storage/projects/7a73f208-e2e7-4646-9cf6-b1fef204eefd/master/master_v1767376258459.png
[INCOMING] GET /storage/projects/64c29417-e641-4f91-9e03-2a655f4fb2fb/master/master_v1767382999240.png
[INCOMING] GET /storage/projects/4b9d87b5-c3f0-4451-a9dc-9816aaab2483/master/master.png
[INCOMING] GET /storage/projects/a30c437d-20d5-42fc-93b4-87a61e72ee9f/master/master_v1767370255938.png
[INCOMING] GET /storage/projects/4522fbb7-fd8f-42de-91eb-5254be2fc698/master/master_v1767372640030.png
[INCOMING] GET /storage/projects/caa26e5a-c801-46f3-ab09-27b6ac65ff75/master/master_v1767374099220.png
[INCOMING] GET /storage/projects/e9f72877-5b3a-4301-9909-967652eda2a4/master/master_v1767366117095.png
[INCOMING] GET /storage/projects/2240578c-2135-4225-8f36-d77847799cd6/master/master_v1767364535111.png
[INCOMING] GET /storage/projects/6fda2920-12f9-48ca-9c9e-25909465c564/master/master_v1767361081123.png
[INCOMING] GET /storage/projects/5890aeda-f2b4-4e0b-9ae6-ec2181858811/master/master_v1767359560657.png
[INCOMING] GET /storage/projects/e53658fd-8941-4b7f-9770-eb05acde027f/master/master_v1767352780343.png
[INCOMING] GET /storage/projects/8c89b4b1-a054-456d-bf9f-c0fb5bec7066/master/master_v1767580618901.png
[INCOMING] GET /storage/projects/3049dc9b-f5ae-4d96-a38f-2bfc2085dd48/master/master_v1767351600505.png
[INCOMING] GET /storage/projects/06dbb2a5-b7c8-49a5-8883-d6775a84f855/master/master_v1767350957171.png
[INCOMING] GET /storage/projects/85b474c4-2d84-4806-a1e3-3cc88c057b85/master/master_v1767347718634.png
[INCOMING] GET /storage/projects/75777f53-f5e3-47ea-b0e5-99f345bc2188/master/master.png
[INCOMING] GET /storage/projects/5f2dc761-fdcd-4923-876e-4f8e71204859/master/master.png
[INCOMING] GET /storage/projects/a3bdd97e-d1b4-438c-a8d3-af6fc7fee3d4/master/master_v1767346651002.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/dna/ref_0.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_bedroom_9x16_1768587465376.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/dna/ref_1.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_hotel_lobby_9x16_1768587325775.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_restaurant_booth_9x16_1768587098355.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_industrial_loft_4x3_1768587185606.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_cafe_wall_9x16_1768587060422.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_bedroom_9x16_1768586810707.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_bedroom_9x16_1768586431208.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_industrial_loft_9x16_1768585556878.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_leaning_floor_9x16_1768585504810.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_bedroom_9x16_1768584866962.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_living_room_9x16_1768397250605.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714853_12.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714852_11.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_13.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_14.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_11-14_4714x6000_RGB.png?t=1768602529932
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_5-7_4286x6000_RGB.png?t=1768602529932
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_2-3_4000x6000_RGB.png?t=1768602529933
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_3-4_4500x6000_RGB.png?t=1768602529933
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_4-5_4800x6000_RGB.png?t=1768602529933
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png
[INCOMING] POST /api/user/logo
[INCOMING] GET /api/auth/me
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
[INCOMING] POST /api/user/branding
[INCOMING] GET /api/auth/me
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/branding
[INCOMING] GET /api/auth/me
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
[INCOMING] POST /api/user/sku
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/user/apikey
[INCOMING] GET /api/user/branding
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] POST /api/user/sku
[INCOMING] GET /api/projects
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
👀 GOD MODE: Fetching ALL projects.
[INCOMING] GET /api/projects
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
👀 GOD MODE: Fetching ALL projects.
[INCOMING] GET /api/profiles
[INCOMING] GET /api/profiles
[INCOMING] GET /api/auth/me
[INCOMING] GET /api/auth/me
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[INCOMING] GET /storage/projects/e0f909c4-1e7f-41e7-9695-af0dd94322dd/master/master_v1768595274399.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_v1768396872284.png
[INCOMING] GET /storage/projects/5c2ef9fe-f28d-4bff-a32b-79bb491566d2/master/master_v1768591304502.png
[INCOMING] GET /storage/projects/9e552293-ef1e-4b2f-8a12-96dc85a6fcf7/master/master_v1767826257332.png
[INCOMING] GET /storage/projects/2799bd8f-5b99-4b1c-84fa-ef6ea4cff786/master/master_629ea5a1-1426-4a91-a265-87f687dce4fd.png
[INCOMING] GET /storage/projects/994be50a-c836-459b-b3f5-158cb3270280/master/master_5f901522-bfb9-42b8-8dd3-7afa126c1b35.png
[INCOMING] GET /storage/projects/bc83ac40-fdc6-4dcc-a124-20e738af29d4/master/master_fb4ab595-3696-4ce2-85b4-28b5326daa05.png
[INCOMING] GET /storage/projects/5bad9034-40cd-4841-b598-9da4acd9eb20/master/master_120dd4f4-2b55-4eb2-be66-a1ec62020d24.png
[INCOMING] GET /storage/projects/e3334dcb-0c8f-4d7c-a516-a248d617848d/master/master_f5fb0a20-9799-400c-928b-932f6917301a.png
[INCOMING] GET /storage/projects/293635b4-d9cd-45b4-8de1-b6c61ce661e6/master/master_0bcc692f-dd90-4422-80b1-9f86bb5a0fd4.png
[INCOMING] GET /storage/projects/233cc95a-2b28-4740-98cf-8701da61c1fd/master/master_8b69f670-b188-4d3d-b1ac-c62b6408062a.png
[INCOMING] GET /storage/projects/80115793-f029-42c3-8c04-fe4b76125f01/master/master_810b7550-ead6-4b5f-add7-f187a5a5ffa4.png
[INCOMING] GET /storage/projects/e857e0f1-cb9d-48ce-b790-722b87e6e19f/master/master_v1767823023819.png
[INCOMING] GET /storage/projects/b9f505f4-cda6-47d5-a8b5-0c0d1c1e51fb/master/master_v1767822876978.png
[INCOMING] GET /storage/projects/0a01c4f9-f6d3-4d6f-9338-ce924d4c6b78/master/master_v1767822818038.png
[INCOMING] GET /storage/projects/9dae9693-71a6-4112-8942-e7d7bb68a579/master/master_1767822745476.png
[INCOMING] GET /storage/projects/60b5eb1b-0daf-4010-847a-8f087c603735/master/master_879f505f-06bd-479a-9649-4f53c6ca4e5b.png
[INCOMING] GET /storage/projects/9d28f0bb-d385-49fb-9d12-dd40fae0ba3b/master/master_v1767822558275.png
[INCOMING] GET /storage/projects/8a75d03a-afe5-4615-a53e-87a04d91a5d7/master/master_568a9c4e-a252-4b10-8318-1804924e0a4f.png
[INCOMING] GET /storage/projects/2870fc6f-56c3-4a4c-9d62-23db7c34f430/master/master_49c61b35-ba1e-42d8-a527-f7eac659622b.png
[INCOMING] GET /storage/projects/22484c4f-ce6c-4c59-b944-8f4c4b202d23/master/master_699b7071-ae5a-43d2-9e75-9e3cd9c1b6cc.png
[INCOMING] GET /storage/projects/2111b50c-a901-4f7d-be83-b55489042a28/master/upscale_1767729326486.png
[INCOMING] GET /storage/projects/7c4864f6-6485-40a2-993d-e00ab78514dc/master/upscale_1767738929194.png
[INCOMING] GET /storage/projects/3c3c1ad8-45b0-4edf-8ab7-52ae2deb1cb0/master/master_v1767624479473.png
[INCOMING] GET /storage/projects/34b713eb-04fb-45fa-a7b7-71bfa6e4300e/master/master.png
[INCOMING] GET /storage/projects/80d04990-df57-4ab5-8cde-4dfc1a0c8b61/master/remix_master.png
[INCOMING] GET /storage/projects/78749e75-56fd-435f-9796-5014d06f240b/master/master_v1767529874679.png
[INCOMING] GET /storage/projects/e14b9190-fce4-4e09-a7f0-65d8d3724c63/master/remix_master.png
[INCOMING] GET /storage/projects/cf2d0883-6b35-4997-ad62-c1180346ce09/master/master_v1767500734061.png
[INCOMING] GET /storage/projects/1d740cbe-4d6b-4626-a153-5028133c63d0/master/master_v1767493046886.png
[INCOMING] GET /storage/projects/38e0398d-e3f2-44ff-9ce0-59e75f1b63a2/master/master_v1767488198215.png
[INCOMING] GET /storage/projects/b55c6395-ad20-43f6-a72c-7fdb3c876aae/master/master.png
[INCOMING] GET /storage/projects/214255f3-3f9a-4219-b0dc-791d14ef4f38/master/master.png
[INCOMING] GET /storage/projects/dfacbbbe-1d92-4e78-ad54-3ff8952dc226/master/master.png
[INCOMING] GET /storage/projects/86bf2f71-fb50-44df-bf48-e7b48372027a/master/master.png
[INCOMING] GET /storage/projects/275035ae-84e6-4a14-9ae9-1991b5570d6c/master/master.png
[INCOMING] GET /storage/projects/bb18aa00-77aa-4b62-bf6e-e897bf2ff0bb/master/master_v1767398257715.png
[INCOMING] GET /storage/projects/743a6d27-a758-4438-b6db-9ed22041681b/master/master.png
[INCOMING] GET /storage/projects/64c29417-e641-4f91-9e03-2a655f4fb2fb/master/master_v1767382999240.png
[INCOMING] GET /storage/projects/7a73f208-e2e7-4646-9cf6-b1fef204eefd/master/master_v1767376258459.png
[INCOMING] GET /storage/projects/4b9d87b5-c3f0-4451-a9dc-9816aaab2483/master/master.png
[INCOMING] GET /storage/projects/caa26e5a-c801-46f3-ab09-27b6ac65ff75/master/master_v1767374099220.png
[INCOMING] GET /storage/projects/4522fbb7-fd8f-42de-91eb-5254be2fc698/master/master_v1767372640030.png
[INCOMING] GET /storage/projects/e9f72877-5b3a-4301-9909-967652eda2a4/master/master_v1767366117095.png
[INCOMING] GET /storage/projects/2240578c-2135-4225-8f36-d77847799cd6/master/master_v1767364535111.png
[INCOMING] GET /storage/projects/6fda2920-12f9-48ca-9c9e-25909465c564/master/master_v1767361081123.png
[INCOMING] GET /storage/projects/a30c437d-20d5-42fc-93b4-87a61e72ee9f/master/master_v1767370255938.png
[INCOMING] GET /storage/projects/5890aeda-f2b4-4e0b-9ae6-ec2181858811/master/master_v1767359560657.png
[INCOMING] GET /storage/projects/e53658fd-8941-4b7f-9770-eb05acde027f/master/master_v1767352780343.png
[INCOMING] GET /storage/projects/8c89b4b1-a054-456d-bf9f-c0fb5bec7066/master/master_v1767580618901.png
[INCOMING] GET /storage/projects/3049dc9b-f5ae-4d96-a38f-2bfc2085dd48/master/master_v1767351600505.png
[INCOMING] GET /storage/projects/06dbb2a5-b7c8-49a5-8883-d6775a84f855/master/master_v1767350957171.png
[INCOMING] GET /storage/projects/85b474c4-2d84-4806-a1e3-3cc88c057b85/master/master_v1767347718634.png
[INCOMING] GET /storage/projects/75777f53-f5e3-47ea-b0e5-99f345bc2188/master/master.png
[INCOMING] GET /storage/projects/a3bdd97e-d1b4-438c-a8d3-af6fc7fee3d4/master/master_v1767346651002.png
[INCOMING] GET /storage/projects/5f2dc761-fdcd-4923-876e-4f8e71204859/master/master.png
[INCOMING] GET /api/projects
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
👀 GOD MODE: Fetching ALL projects.
[INCOMING] GET /api/projects
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
👀 GOD MODE: Fetching ALL projects.
[INCOMING] GET /api/auth/me
[INCOMING] GET /api/profiles
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /api/profiles
[INCOMING] GET /api/auth/me
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /storage/projects/2799bd8f-5b99-4b1c-84fa-ef6ea4cff786/master/master_629ea5a1-1426-4a91-a265-87f687dce4fd.png
[INCOMING] GET /storage/projects/e0f909c4-1e7f-41e7-9695-af0dd94322dd/master/master_v1768595274399.png
[INCOMING] GET /storage/projects/994be50a-c836-459b-b3f5-158cb3270280/master/master_5f901522-bfb9-42b8-8dd3-7afa126c1b35.png
[INCOMING] GET /storage/projects/5c2ef9fe-f28d-4bff-a32b-79bb491566d2/master/master_v1768591304502.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_v1768396872284.png
[INCOMING] GET /storage/projects/9e552293-ef1e-4b2f-8a12-96dc85a6fcf7/master/master_v1767826257332.png
[INCOMING] GET /storage/projects/bc83ac40-fdc6-4dcc-a124-20e738af29d4/master/master_fb4ab595-3696-4ce2-85b4-28b5326daa05.png
[INCOMING] GET /storage/projects/5bad9034-40cd-4841-b598-9da4acd9eb20/master/master_120dd4f4-2b55-4eb2-be66-a1ec62020d24.png
[INCOMING] GET /storage/projects/e3334dcb-0c8f-4d7c-a516-a248d617848d/master/master_f5fb0a20-9799-400c-928b-932f6917301a.png
[INCOMING] GET /storage/projects/293635b4-d9cd-45b4-8de1-b6c61ce661e6/master/master_0bcc692f-dd90-4422-80b1-9f86bb5a0fd4.png
[INCOMING] GET /storage/projects/233cc95a-2b28-4740-98cf-8701da61c1fd/master/master_8b69f670-b188-4d3d-b1ac-c62b6408062a.png
[INCOMING] GET /storage/projects/80115793-f029-42c3-8c04-fe4b76125f01/master/master_810b7550-ead6-4b5f-add7-f187a5a5ffa4.png
[INCOMING] GET /storage/projects/e857e0f1-cb9d-48ce-b790-722b87e6e19f/master/master_v1767823023819.png
[INCOMING] GET /storage/projects/b9f505f4-cda6-47d5-a8b5-0c0d1c1e51fb/master/master_v1767822876978.png
[INCOMING] GET /storage/projects/0a01c4f9-f6d3-4d6f-9338-ce924d4c6b78/master/master_v1767822818038.png
[INCOMING] GET /storage/projects/9dae9693-71a6-4112-8942-e7d7bb68a579/master/master_1767822745476.png
[INCOMING] GET /storage/projects/60b5eb1b-0daf-4010-847a-8f087c603735/master/master_879f505f-06bd-479a-9649-4f53c6ca4e5b.png
[INCOMING] GET /storage/projects/9d28f0bb-d385-49fb-9d12-dd40fae0ba3b/master/master_v1767822558275.png
[INCOMING] GET /storage/projects/8a75d03a-afe5-4615-a53e-87a04d91a5d7/master/master_568a9c4e-a252-4b10-8318-1804924e0a4f.png
[INCOMING] GET /storage/projects/2870fc6f-56c3-4a4c-9d62-23db7c34f430/master/master_49c61b35-ba1e-42d8-a527-f7eac659622b.png
[INCOMING] GET /storage/projects/22484c4f-ce6c-4c59-b944-8f4c4b202d23/master/master_699b7071-ae5a-43d2-9e75-9e3cd9c1b6cc.png
[INCOMING] GET /storage/projects/2111b50c-a901-4f7d-be83-b55489042a28/master/upscale_1767729326486.png
[INCOMING] GET /storage/projects/7c4864f6-6485-40a2-993d-e00ab78514dc/master/upscale_1767738929194.png
[INCOMING] GET /storage/projects/34b713eb-04fb-45fa-a7b7-71bfa6e4300e/master/master.png
[INCOMING] GET /storage/projects/3c3c1ad8-45b0-4edf-8ab7-52ae2deb1cb0/master/master_v1767624479473.png
[INCOMING] GET /storage/projects/80d04990-df57-4ab5-8cde-4dfc1a0c8b61/master/remix_master.png
[INCOMING] GET /storage/projects/78749e75-56fd-435f-9796-5014d06f240b/master/master_v1767529874679.png
[INCOMING] GET /storage/projects/e14b9190-fce4-4e09-a7f0-65d8d3724c63/master/remix_master.png
[INCOMING] GET /storage/projects/cf2d0883-6b35-4997-ad62-c1180346ce09/master/master_v1767500734061.png
[INCOMING] GET /storage/projects/1d740cbe-4d6b-4626-a153-5028133c63d0/master/master_v1767493046886.png
[INCOMING] GET /storage/projects/38e0398d-e3f2-44ff-9ce0-59e75f1b63a2/master/master_v1767488198215.png
[INCOMING] GET /storage/projects/b55c6395-ad20-43f6-a72c-7fdb3c876aae/master/master.png
[INCOMING] GET /storage/projects/214255f3-3f9a-4219-b0dc-791d14ef4f38/master/master.png
[INCOMING] GET /storage/projects/dfacbbbe-1d92-4e78-ad54-3ff8952dc226/master/master.png
[INCOMING] GET /storage/projects/86bf2f71-fb50-44df-bf48-e7b48372027a/master/master.png
[INCOMING] GET /storage/projects/275035ae-84e6-4a14-9ae9-1991b5570d6c/master/master.png
[INCOMING] GET /storage/projects/bb18aa00-77aa-4b62-bf6e-e897bf2ff0bb/master/master_v1767398257715.png
[INCOMING] GET /storage/projects/743a6d27-a758-4438-b6db-9ed22041681b/master/master.png
[INCOMING] GET /storage/projects/64c29417-e641-4f91-9e03-2a655f4fb2fb/master/master_v1767382999240.png
[INCOMING] GET /storage/projects/7a73f208-e2e7-4646-9cf6-b1fef204eefd/master/master_v1767376258459.png
[INCOMING] GET /storage/projects/4b9d87b5-c3f0-4451-a9dc-9816aaab2483/master/master.png
[INCOMING] GET /storage/projects/caa26e5a-c801-46f3-ab09-27b6ac65ff75/master/master_v1767374099220.png
[INCOMING] GET /storage/projects/4522fbb7-fd8f-42de-91eb-5254be2fc698/master/master_v1767372640030.png
[INCOMING] GET /storage/projects/a30c437d-20d5-42fc-93b4-87a61e72ee9f/master/master_v1767370255938.png
[INCOMING] GET /storage/projects/e9f72877-5b3a-4301-9909-967652eda2a4/master/master_v1767366117095.png
[INCOMING] GET /storage/projects/2240578c-2135-4225-8f36-d77847799cd6/master/master_v1767364535111.png
[INCOMING] GET /storage/projects/6fda2920-12f9-48ca-9c9e-25909465c564/master/master_v1767361081123.png
[INCOMING] GET /storage/projects/5890aeda-f2b4-4e0b-9ae6-ec2181858811/master/master_v1767359560657.png
[INCOMING] GET /storage/projects/e53658fd-8941-4b7f-9770-eb05acde027f/master/master_v1767352780343.png
[INCOMING] GET /storage/projects/8c89b4b1-a054-456d-bf9f-c0fb5bec7066/master/master_v1767580618901.png
[INCOMING] GET /storage/projects/3049dc9b-f5ae-4d96-a38f-2bfc2085dd48/master/master_v1767351600505.png
[INCOMING] GET /storage/projects/06dbb2a5-b7c8-49a5-8883-d6775a84f855/master/master_v1767350957171.png
[INCOMING] GET /storage/projects/85b474c4-2d84-4806-a1e3-3cc88c057b85/master/master_v1767347718634.png
[INCOMING] GET /storage/projects/75777f53-f5e3-47ea-b0e5-99f345bc2188/master/master.png
[INCOMING] GET /storage/projects/a3bdd97e-d1b4-438c-a8d3-af6fc7fee3d4/master/master_v1767346651002.png
[INCOMING] GET /storage/projects/5f2dc761-fdcd-4923-876e-4f8e71204859/master/master.png
[INCOMING] GET /api/projects
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
👀 GOD MODE: Fetching ALL projects.
[INCOMING] GET /api/projects
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
👀 GOD MODE: Fetching ALL projects.
[INCOMING] GET /api/profiles
[INCOMING] GET /api/auth/me
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /api/profiles
[INCOMING] GET /api/auth/me
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /storage/projects/2799bd8f-5b99-4b1c-84fa-ef6ea4cff786/master/master_629ea5a1-1426-4a91-a265-87f687dce4fd.png
[INCOMING] GET /storage/projects/994be50a-c836-459b-b3f5-158cb3270280/master/master_5f901522-bfb9-42b8-8dd3-7afa126c1b35.png
[INCOMING] GET /storage/projects/e0f909c4-1e7f-41e7-9695-af0dd94322dd/master/master_v1768595274399.png
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_v1768396872284.png
[INCOMING] GET /storage/projects/5c2ef9fe-f28d-4bff-a32b-79bb491566d2/master/master_v1768591304502.png
[INCOMING] GET /storage/projects/9e552293-ef1e-4b2f-8a12-96dc85a6fcf7/master/master_v1767826257332.png
[INCOMING] GET /storage/projects/bc83ac40-fdc6-4dcc-a124-20e738af29d4/master/master_fb4ab595-3696-4ce2-85b4-28b5326daa05.png
[INCOMING] GET /storage/projects/5bad9034-40cd-4841-b598-9da4acd9eb20/master/master_120dd4f4-2b55-4eb2-be66-a1ec62020d24.png
[INCOMING] GET /storage/projects/293635b4-d9cd-45b4-8de1-b6c61ce661e6/master/master_0bcc692f-dd90-4422-80b1-9f86bb5a0fd4.png
[INCOMING] GET /storage/projects/e3334dcb-0c8f-4d7c-a516-a248d617848d/master/master_f5fb0a20-9799-400c-928b-932f6917301a.png
[INCOMING] GET /storage/projects/233cc95a-2b28-4740-98cf-8701da61c1fd/master/master_8b69f670-b188-4d3d-b1ac-c62b6408062a.png
[INCOMING] GET /storage/projects/80115793-f029-42c3-8c04-fe4b76125f01/master/master_810b7550-ead6-4b5f-add7-f187a5a5ffa4.png
[INCOMING] GET /storage/projects/e857e0f1-cb9d-48ce-b790-722b87e6e19f/master/master_v1767823023819.png
[INCOMING] GET /storage/projects/b9f505f4-cda6-47d5-a8b5-0c0d1c1e51fb/master/master_v1767822876978.png
[INCOMING] GET /storage/projects/0a01c4f9-f6d3-4d6f-9338-ce924d4c6b78/master/master_v1767822818038.png
[INCOMING] GET /storage/projects/9dae9693-71a6-4112-8942-e7d7bb68a579/master/master_1767822745476.png
[INCOMING] GET /storage/projects/60b5eb1b-0daf-4010-847a-8f087c603735/master/master_879f505f-06bd-479a-9649-4f53c6ca4e5b.png
[INCOMING] GET /storage/projects/9d28f0bb-d385-49fb-9d12-dd40fae0ba3b/master/master_v1767822558275.png
[INCOMING] GET /storage/projects/8a75d03a-afe5-4615-a53e-87a04d91a5d7/master/master_568a9c4e-a252-4b10-8318-1804924e0a4f.png
[INCOMING] GET /storage/projects/2870fc6f-56c3-4a4c-9d62-23db7c34f430/master/master_49c61b35-ba1e-42d8-a527-f7eac659622b.png
[INCOMING] GET /storage/projects/22484c4f-ce6c-4c59-b944-8f4c4b202d23/master/master_699b7071-ae5a-43d2-9e75-9e3cd9c1b6cc.png
[INCOMING] GET /storage/projects/2111b50c-a901-4f7d-be83-b55489042a28/master/upscale_1767729326486.png
[INCOMING] GET /storage/projects/7c4864f6-6485-40a2-993d-e00ab78514dc/master/upscale_1767738929194.png
[INCOMING] GET /storage/projects/3c3c1ad8-45b0-4edf-8ab7-52ae2deb1cb0/master/master_v1767624479473.png
[INCOMING] GET /storage/projects/80d04990-df57-4ab5-8cde-4dfc1a0c8b61/master/remix_master.png
[INCOMING] GET /storage/projects/34b713eb-04fb-45fa-a7b7-71bfa6e4300e/master/master.png
[INCOMING] GET /storage/projects/78749e75-56fd-435f-9796-5014d06f240b/master/master_v1767529874679.png
[INCOMING] GET /storage/projects/e14b9190-fce4-4e09-a7f0-65d8d3724c63/master/remix_master.png
[INCOMING] GET /storage/projects/cf2d0883-6b35-4997-ad62-c1180346ce09/master/master_v1767500734061.png
[INCOMING] GET /storage/projects/b55c6395-ad20-43f6-a72c-7fdb3c876aae/master/master.png
[INCOMING] GET /storage/projects/1d740cbe-4d6b-4626-a153-5028133c63d0/master/master_v1767493046886.png
[INCOMING] GET /storage/projects/214255f3-3f9a-4219-b0dc-791d14ef4f38/master/master.png
[INCOMING] GET /storage/projects/38e0398d-e3f2-44ff-9ce0-59e75f1b63a2/master/master_v1767488198215.png
[INCOMING] GET /storage/projects/dfacbbbe-1d92-4e78-ad54-3ff8952dc226/master/master.png
[INCOMING] GET /storage/projects/86bf2f71-fb50-44df-bf48-e7b48372027a/master/master.png
[INCOMING] GET /storage/projects/275035ae-84e6-4a14-9ae9-1991b5570d6c/master/master.png
[INCOMING] GET /storage/projects/bb18aa00-77aa-4b62-bf6e-e897bf2ff0bb/master/master_v1767398257715.png
[INCOMING] GET /storage/projects/743a6d27-a758-4438-b6db-9ed22041681b/master/master.png
[INCOMING] GET /storage/projects/64c29417-e641-4f91-9e03-2a655f4fb2fb/master/master_v1767382999240.png
[INCOMING] GET /storage/projects/7a73f208-e2e7-4646-9cf6-b1fef204eefd/master/master_v1767376258459.png
[INCOMING] GET /storage/projects/4b9d87b5-c3f0-4451-a9dc-9816aaab2483/master/master.png
[INCOMING] GET /storage/projects/caa26e5a-c801-46f3-ab09-27b6ac65ff75/master/master_v1767374099220.png
[INCOMING] GET /storage/projects/4522fbb7-fd8f-42de-91eb-5254be2fc698/master/master_v1767372640030.png
[INCOMING] GET /storage/projects/a30c437d-20d5-42fc-93b4-87a61e72ee9f/master/master_v1767370255938.png
[INCOMING] GET /storage/projects/e9f72877-5b3a-4301-9909-967652eda2a4/master/master_v1767366117095.png
[INCOMING] GET /storage/projects/2240578c-2135-4225-8f36-d77847799cd6/master/master_v1767364535111.png
[INCOMING] GET /storage/projects/6fda2920-12f9-48ca-9c9e-25909465c564/master/master_v1767361081123.png
[INCOMING] GET /storage/projects/5890aeda-f2b4-4e0b-9ae6-ec2181858811/master/master_v1767359560657.png
[INCOMING] GET /storage/projects/e53658fd-8941-4b7f-9770-eb05acde027f/master/master_v1767352780343.png
[INCOMING] GET /storage/projects/8c89b4b1-a054-456d-bf9f-c0fb5bec7066/master/master_v1767580618901.png
[INCOMING] GET /storage/projects/3049dc9b-f5ae-4d96-a38f-2bfc2085dd48/master/master_v1767351600505.png
[INCOMING] GET /storage/projects/06dbb2a5-b7c8-49a5-8883-d6775a84f855/master/master_v1767350957171.png
[INCOMING] GET /storage/projects/85b474c4-2d84-4806-a1e3-3cc88c057b85/master/master_v1767347718634.png
[INCOMING] GET /storage/projects/75777f53-f5e3-47ea-b0e5-99f345bc2188/master/master.png
[INCOMING] GET /storage/projects/a3bdd97e-d1b4-438c-a8d3-af6fc7fee3d4/master/master_v1767346651002.png
[INCOMING] GET /storage/projects/5f2dc761-fdcd-4923-876e-4f8e71204859/master/master.png
[INCOMING] GET /api/projects/354c33a7-5ea8-49c5-8535-95f19429b65b
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_0.png
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_4.png
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_1.png
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_6.png
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_2.png
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_3.png
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_5.png
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_7.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046088_1.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046092_3.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046090_2.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046085_0.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046095_5.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046094_4.png
[INCOMING] GET /api/profiles
[INCOMING] GET /api/auth/me
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046097_6.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046098_7.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714846_8.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714848_9.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714850_10.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714852_11.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714853_12.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_13.png
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_14.png
[INCOMING] POST /api/projects
[API] Create Project Request by admin@etsymastermind.com: güzel bir kadın derin dekolteli gece elbisesi ile partide çok eğleniyor. black and white, retro, film noir, photography art, nude art, Wall Art (ExactRef: false) (HasKey: false)
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046085_0.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046088_1.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046090_2.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046092_3.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046094_4.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046095_5.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046097_6.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046098_7.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714846_8.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714848_9.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714850_10.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714852_11.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714853_12.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_13.png
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_14.png
[UsageService] ⚡ GOD MODE: User is ADMIN, bypassing credit deduction.
[API] Creating DB record...
[API] Project created: f4a396f1-0bed-4d07-ab0e-8f9bb6a6bb88
[API] Step 0: Conducting Market Research...
[API] Market Intelligence Acquired: [
'Old Hollywood Glamour',
'Eclectic Maximalism',
'Flash Photography / Paparazzi Aesthetic',
'Bar Cart Art',
'Moody Dark Academia'
]
[API] Step 1: Generating Art Direction...
[API] Step 2: Generating SEO Strategy...
[DEBUG] SEO Response Text: {
"seoTitle": "Black and White Fashion Print | Retro Woman Drinking Champagne Art | Sexy Bar Cart Decor | Vintage Bathroom Poster | Party Girl Gift",
"keywords": [
"Bar Cart Art",
"Black and White Art",
"Vintage Fashion",
"Sexy Wall Decor",
"Champagne Print",
"Retro Party Poster",
"Bathroom Wall Art",
"Flash Photography",
"Old Money Aesthetic",
"Eclectic Home Decor",
"Woman Drinking Art",
"Preppy Room Decor",
"Fashion Photography"
],
"description": "Capture the unbridled euphoria of an endless night with this high-fashion masterpiece. This art print embodies the 'Drunken Elegance' aesthetic—perfect for adding a touch of rebellious glamour to your space.\n\nWhy this piece belongs on your wall:\n• \u2728 **Timeless Energy:** A stunning candid moment of pure joy, frozen in high-contrast vintage flash photography style.\n• \u2728 **Tasteful Risqué:** The daring deep-v satin gown offers a sophisticated 'Vogue' appeal that is sexy yet classy enough for the living room.\n• \u2728 **Modern Resolution:** Unlike gritty thrift store finds, this piece offers 8K clarity while maintaining authentic film grain texture.\n• \u2728 **Versatile Decor:** The ultimate cheeky addition to a bar cart, powder room, or eclectic gallery wall.\n\nBring the Great Gatsby energy to your Friday night. \n\n**Order now to make your walls the life of the party.**",
"suggestedPrice": "28.00",
"jsonLd": {
"@context": "https://schema.org/",
"@type": "Product",
"name": "Black and White Fashion Print | Retro Woman Drinking Champagne Art",
"description": "High-fashion black and white wall art featuring a retro woman laughing with champagne. Vintage flash photography aesthetic perfect for bar carts and bathrooms."
},
"categorySuggestion": "Art & Collectibles > Prints > Digital Prints",
"attributes": {
"date": "1990s",
"occasion": "Housewarming",
"primaryColor": "Black",
"room": "Kitchen & Dining",
"secondaryColor": "White"
}
}
[API] Saved Printing Guide: projects/f4a396f1-0bed-4d07-ab0e-8f9bb6a6bb88/docs/Printing_Guide.txt
[SANITIZE] Prompt appears safe, no transformation needed.
[API] Calling Gemini for Image (90s Timeout)...
[API] Invoking imageGenAI.models.generateContent with gemini-3-pro-image-preview... (Ratio: 9:16)
[INCOMING] GET /api/ping-sku
[INCOMING] GET /api/ping-sku
[API] Image generation complete. Processing response...
[RATIO CHECK] Generated: 768x1376 (Ratio: 0.558)
[RATIO CHECK] Expected: 3375x6000 (Ratio: 0.563)
[PRINT-READY] Enforcing exact aspect ratio 9:16 -> 3375x6000
[PRINT-READY] Original: 768x1376 -> Target: 3375x6000 @ 300 DPI
[PRINT-READY] Final output: 3375x6000 @ 300 DPI
[INCOMING] GET /api/auth/me
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
[INCOMING] GET /storage/projects/f4a396f1-0bed-4d07-ab0e-8f9bb6a6bb88/master/master_78f4a903-03ab-47bc-97fe-43d0375a17ef.png