Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
990e792
feat: Update ADRs for demand-mounted UI surfaces, app server integrat…
gvastethecreator May 26, 2026
2871818
Refactor TimelineRecipe component: Extract TimelineBottomDock and Tim…
gvastethecreator May 27, 2026
865d898
refactor: reorganize overlay flags and improve type definitions in St…
gvastethecreator May 27, 2026
6c3b815
refactor: clean up event handler warnings in Toolbar, StylesRecipe, T…
gvastethecreator May 27, 2026
272af64
Refactor API base URLs and improve module structure
gvastethecreator May 27, 2026
acf2a4f
feat: Enhance job inspector model and request handling
gvastethecreator May 27, 2026
65bf32d
Refactor generation pipeline and local studio sync logic
gvastethecreator May 27, 2026
c80678e
Refactor code structure and optimize performance across multiple modules
gvastethecreator May 29, 2026
a5ed370
feat: Update style presets and add new quality audit script
gvastethecreator May 29, 2026
900a0e3
Add new biopunk and seapunk style presets to pack 15 and implement pa…
gvastethecreator May 29, 2026
309bb16
feat: add project, provider, and settings routes with tests
gvastethecreator May 29, 2026
90887a1
feat: Refactor API routes into dedicated modules for jobs, asset logs…
gvastethecreator May 29, 2026
9af20b6
refactor: enhance architecture and improve module interfaces
gvastethecreator May 29, 2026
e4c1c26
feat: add quality improvement plans for image generation pipeline
gvastethecreator May 30, 2026
37fc7ab
Refactor creative briefs and visual DNA descriptions for 40 style pre…
gvastethecreator May 30, 2026
46c545c
Refactor style presets in pack 15: Update creative briefs and maintai…
gvastethecreator May 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
27 changes: 15 additions & 12 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
# Copia este archivo a `.env.local` si quieres personalizar el studio manualmente.
# Tambien puedes ejecutar `bun run studio:init`: si `.env.local` no existe, el script lo crea automaticamente.
# Copy this file to `.env.local` if you want to customize the studio manually.
# You can also run `bun run studio:init`: if `.env.local` does not exist, the script creates it automatically.
#
# Ruta por defecto en Windows.
# Para macOS o Linux usa una ruta absoluta local, por ejemplo:
# /Users/<tu-usuario>/AI-Studio-Library
# /home/<tu-usuario>/AI-Studio-Library
# Default path on Windows.
# For macOS or Linux, use a local absolute path, for example:
# /Users/<your-user>/AI-Studio-Library
# /home/<your-user>/AI-Studio-Library
STUDIO_LIBRARY_DIR=D:\AI-Studio-Library

# Puerto HTTP del backend local.
STUDIO_SERVER_PORT=4317
# HTTP port for the local backend.
STUDIO_SERVER_PORT=17223

# Puerto WebSocket usado por codex app-server.
STUDIO_CODEX_WS_PORT=4318
# WebSocket port used by codex app-server.
STUDIO_CODEX_WS_PORT=17224

# Cantidad maxima de jobs Codex procesados en paralelo por el worker local.
# Optional UI override for the local backend base URL used by Vite.
VITE_STUDIO_API_BASE=http://localhost:17223

# Maximum number of Codex jobs processed in parallel by the local worker.
STUDIO_MAX_CONCURRENT_CODEX_JOBS=4

# Modelo y esfuerzo por defecto para turns de imagegen en codex app-server.
# Default model and reasoning effort for imagegen turns in codex app-server.
CODEX_IMAGEGEN_MODEL=gpt-5.4-mini
CODEX_IMAGEGEN_REASONING_EFFORT=low
54 changes: 54 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Bug report
description: Report a reproducible problem in Codex Studio.
title: '[Bug]: '
labels: [bug]
body:
- type: markdown
attributes:
value: |
Thanks for helping improve Codex Studio. Please include enough detail to reproduce the issue locally.
- type: input
id: os
attributes:
label: Operating system
placeholder: Windows 11, macOS 15, Ubuntu 24.04
validations:
required: true
- type: input
id: bun
attributes:
label: Bun version
placeholder: bun --version
validations:
required: true
- type: input
id: codex
attributes:
label: Codex version
placeholder: codex --version
validations:
required: true
- type: input
id: command
attributes:
label: Command used
placeholder: bun run dev
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behavior
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual behavior
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs or screenshots
description: Attach relevant logs from your Studio Library logs folder or `logs/tooling/`. Remove secrets before posting.
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Security report
url: https://github.com/
about: Please report vulnerabilities privately through the repository owner's preferred security channel.
32 changes: 32 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Feature request
description: Propose an improvement for Codex Studio.
title: '[Feature]: '
labels: [enhancement]
body:
- type: textarea
id: problem
attributes:
label: Problem
description: What user problem would this solve?
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposal
description: What should Codex Studio do differently?
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: What other options did you consider?
- type: checkboxes
id: scope
attributes:
label: Scope
options:
- label: This keeps the main flow local-first.
- label: This does not require API keys for the default Codex flow.
- label: This improves onboarding, operability, traceability, or maintainability.
16 changes: 16 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## Summary

-

## Validation

- [ ] `bun run fmt:check`
- [ ] `bun run lint`
- [ ] `bun run check`
- [ ] `bun run test`
- [ ] `bun run build`

## Notes

- Link related issues, ADRs, or docs.
- Mention any skipped validation with the reason and risk.
33 changes: 33 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: CI

on:
pull_request:
push:
branches:
- main
- master

jobs:
validate:
name: Validate
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.13

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Check
run: bun run check

- name: Test
run: bun run test

- name: Build
run: bun run build
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ components/recipes/styles/defaults/.locks/
components/recipes/styleRuntimeData.generated.check.*.tmp.ts
components/recipes/styleRuntimePacks.generated/*.check.*.tmp.ts
components/recipes/styleRuntimePacks.generated/**/*.check.*.tmp.ts
react-doctor-*.json
!react-doctor.config.json

# Editor directories and files
.vscode/*
Expand Down
90 changes: 90 additions & 0 deletions .tmp_audit_styles.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
const fs = require('fs');
const path = require('path');
const YAML = require('yaml');

const packs = ['pack_01','pack_02','pack_03','pack_04','pack_05','pack_07','pack_09','pack_11','pack_12','pack_13','pack_14','pack_15','pack_16'];
const packDir = path.join('components','recipes','styles','manifests','packs');
const presetDir = path.join('components','recipes','styles','manifests','presets');

function readYaml(p){ return YAML.parse(fs.readFileSync(p,'utf8')); }
function walk(dir){
let out=[];
for(const e of fs.readdirSync(dir,{withFileTypes:true})){
const full = path.join(dir,e.name);
if(e.isDirectory()) out=out.concat(walk(full));
else if(/\.ya?ml$/i.test(e.name)) out.push(full);
}
return out;
}

const packAudit=[];
let reorganizedPresetRefs = new Set();
for(const p of packs){
const f = path.join(packDir,`${p}.yaml`);
if(!fs.existsSync(f)) { packAudit.push({pack:p,error:'missing'}); continue; }
const y = readYaml(f) || {};
const categories = Array.isArray(y.categories)?y.categories:[];
const catRows = categories.map(c=>({id:c?.id||'(no-id)',count:Array.isArray(c?.presetRefs)?c.presetRefs.length:0,zero:!Array.isArray(c?.presetRefs)||c.presetRefs.length===0}));
const totalPresetRefs = Array.isArray(y.presetRefs)?y.presetRefs.length:0;
packAudit.push({pack:p,totalPresetRefs,categories:catRows,zeroCategories:catRows.filter(r=>r.zero).map(r=>r.id)});
for(const ref of (Array.isArray(y.presetRefs)?y.presetRefs:[])) reorganizedPresetRefs.add(ref);
}

const legacySlugs = ['videojuegos','videojuegos-originals-vault','mythic_noir','solarpunk_dreamscapes','core_anime','slice_of_life_school_music','samurai_medieval'];
const presetFiles = walk(presetDir);
const legacyCounts = Object.fromEntries(legacySlugs.map(s=>[s,{count:0,files:[]}]))
for(const f of presetFiles){
const txt = fs.readFileSync(f,'utf8').toLowerCase();
for(const s of legacySlugs){
if(txt.includes(s)){
legacyCounts[s].count++;
if(legacyCounts[s].files.length<5) legacyCounts[s].files.push(f.replace(/\\/g,'/'));
}
}
}

function collectStrings(v, arr){
if(v==null) return;
if(typeof v==='string') arr.push(v);
else if(Array.isArray(v)) v.forEach(x=>collectStrings(x,arr));
else if(typeof v==='object') Object.values(v).forEach(x=>collectStrings(x,arr));
}
const esTokenRegex = /\b(de|la|el|los|las|y|con|para|en|del|una|un|estilo|fotografia|fotografía|cine|retrato|paisaje)\b/i;
const tildeRegex = /[áéíóúñü¿¡]/i;
let esHits = 0;
const esFiles = [];
for(const ref of reorganizedPresetRefs){
const p = path.join(presetDir,ref);
if(!fs.existsSync(p)) continue;
let y;
try{ y = readYaml(p) || {}; }catch{ continue; }
const values = [];
collectStrings(y.name, values);
collectStrings(y.category, values);
collectStrings(y.tags, values);
collectStrings(y.taxonomy, values);
const joined = values.join(' | ');
if(tildeRegex.test(joined) || esTokenRegex.test(joined)){
esHits++;
if(esFiles.length<20) esFiles.push(ref);
}
}

console.log('===PACK_AUDIT===');
for(const p of packAudit){
if(p.error){ console.log(`${p.pack}: MISSING`); continue; }
console.log(`${p.pack}: totalPresetRefs=${p.totalPresetRefs}`);
for(const c of p.categories){
console.log(` - ${c.id}: ${c.count}${c.zero?' [ZERO]':''}`);
}
}
console.log('===LEGACY_SLUGS===');
for(const s of legacySlugs){
const v=legacyCounts[s];
console.log(`${s}: ${v.count}`);
if(v.files.length) console.log(` samples: ${v.files.join(', ')}`);
}
console.log('===SPANISH_DETECTION===');
console.log(`reorganizedPresetFilesChecked=${reorganizedPresetRefs.size}`);
console.log(`filesWithSpanishSignal=${esHits}`);
if(esFiles.length) console.log(`samples: ${esFiles.join(', ')}`);
Loading
Loading