Create a complete custom BTI personality test (like LBTI, FBTI, etc.) based on the XBTI architecture. User provides a theme name and preferences, AI generates all content: dimensions, questions, personality types, descriptions, and avatar images via lovstudio:image-creator. Trigger when user says "创建BTI", "自定义人格测试", "make a BTI", "custom personality test", "XBTI变体", "xbti-creator", or mentions creating something like LBTI/FBTI/etc.
Generate a complete, deployable BTI personality test website from a theme and preferences. Based on the proven XBTI architecture (React + Vite), with AI-generated content.
Use AskUserQuestion to gather:
| Field | Example | Required |
|---|---|---|
| BTI名称 | LBTI | Yes |
| 主题 | 龙虾的人格分析 | Yes |
| 风格偏好 | 幽默毒舌 / 温暖治愈 / 学术严肃 | Yes |
| 人格数量 | 16-25(默认20) | No |
| 特殊彩蛋人格 | 有/无(默认有) | No |
| 项目目录 |
| 默认 ~/projects/{NAME} |
| No |
| 提交到 Gallery | 是/否(默认否)— 提交到 xbti.lovstudio.ai 供他人体验 | No |
After collecting user input, silently check and auto-fix the environment:
# 1. Node.js (required)
node --version # Need 18+
# 2. Detect package manager
command -v pnpm && echo "USE_PM=pnpm" || command -v bun && echo "USE_PM=bun" || echo "USE_PM=npm"
# 3. git
git --version
# 4. image-creator skill
ls ~/.claude/skills/lovstudio-image-creator/gen_image.py 2>/dev/null && echo "OK" || echo "MISSING"
# 5. Zenmux API key
[ -n "$ZENMUX_API_KEY" ] && echo "OK" || echo "MISSING"
# 6. Python deps
python3 -c "import google.genai; from PIL import Image" 2>/dev/null && echo "OK" || echo "MISSING"
Auto-fix (no user interaction needed for these):
lovstudio:image-creator missing →
npx skills add lovstudio/skills --skill lovstudio:image-creator
pip install google-genai Pillow --break-system-packages 2>/dev/null || pip3 install google-genai Pillow
Require user input only if truly blocked:
ZENMUX_API_KEY missing → ask user to provide it:
export ZENMUX_API_KEY="your-key" (建议加到 ~/.zshrc)Do NOT proceed to Step 3 until environment is fully ready.
Based on the theme, design 5 维度模型, each with 3 子维度 = 15 dimensions total.
Rules:
Output: src/data/dimensions.js — see references/xbti-data-format.md for exact format.
Generate 30 questions (2 per dimension), each with 3 options (value 1, 2, 3).
Rules:
Output: src/data/questions.js
Generate 16-25 personality types, each with:
| Field | Description |
|---|---|
code | 4-6 char English code (creative, memorable) |
cn | 2-3 char Chinese name |
pattern | 15-char L/M/H pattern matching the dimension system |
intro | One-line tagline (catchy, in-character) |
desc | 200-400 char personality description (match chosen tone) |
Rules:
Output: src/data/types.js
Clone the XBTI template from GitHub and clean up:
git clone https://github.com/lovstudio/XBTI.git {TARGET_DIR}
cd {TARGET_DIR}
# Remove origin-specific files, keep the engine
rm -rf .git .vercel image/* CHANGELOG.md docs/
mkdir -p image
git init
# Fix packageManager field for user's environment
# If user uses npm: remove the packageManager field entirely
# If user uses bun: change to bun
# If user uses pnpm: keep as-is
packageManager handling (important for portability):
package.json has "packageManager": "[email protected]"{PM} install with whatever package manager the user hasThen overwrite the data files with generated content:
src/data/dimensions.jssrc/data/questions.jssrc/data/types.jsUpdate branding in:
index.html — title, meta tagssrc/components/IntroScreen.jsx — hero title, subtitle, attributionsrc/index.css — theme colors (optional, ask user)package.json — name, description, remove packageManager if neededKeep src/logic/scoring.js as-is — the algorithm is universal. Only update import paths if dimension IDs changed.
For each personality type, programmatically generate an avatar image using the lovstudio:image-creator skill.
Prompt Crafting (nano-banana-pro style):
For each personality type, craft a prompt optimized for stylized character generation:
[Subject: character visual based on personality], [Action/Pose],
[Environment: thematic background], chibi style character,
cute cartoon illustration, simple flat design, vibrant colors,
white background, centered composition,
best quality, masterpiece, ultra high res, 8k
Examples:
Generation Process:
Craft all prompts (one per personality type), present to user
Ask user: "先生成一个预览确认风格,还是直接批量生成全部?"
Preview mode: Generate one image, show result, iterate on prompt style if needed:
python3 ~/.claude/skills/lovstudio-image-creator/gen_image.py \
"PROMPT_HERE" \
-o {TARGET_DIR}/image/{CODE}.png \
-q medium --no-open
Batch mode: Once style confirmed, loop through all types:
# For each personality type:
python3 ~/.claude/skills/lovstudio-image-creator/gen_image.py \
"PROMPT_FOR_TYPE" \
-o {TARGET_DIR}/image/{CODE}.png \
-q medium --no-open
Use Read tool to display each generated image to user for quick review.
Verify all images exist:
ls -la {TARGET_DIR}/image/
IMPORTANT: All image generation is fully automated via CLI — do NOT ask user to manually download or operate any web UI.
cd {TARGET_DIR}
# Install dependencies with user's package manager
{PM} install
# Start dev server
{PM} run dev
# or: npx vite (universal fallback)
Tell the user the dev server URL (usually http://localhost:5173) and invite them to test the full flow.
Skip this step if user chose NOT to submit in Step 1.
If user chose to submit, create a PR to lovstudio/XBTI repo:
# 1. Fork & clone the XBTI repo
cd /tmp
gh repo fork lovstudio/XBTI --clone
cd XBTI
# 2. Create case directory (follow existing structure: cases/sbti/, cases/cbti/)
CASE_NAME=$(echo "{BTI_NAME}" | tr '[:upper:]' '[:lower:]')
mkdir -p cases/${CASE_NAME}/images
# 3. Copy data files + images
cp {TARGET_DIR}/src/data/dimensions.js cases/${CASE_NAME}/
cp {TARGET_DIR}/src/data/questions.js cases/${CASE_NAME}/
cp {TARGET_DIR}/src/data/types.js cases/${CASE_NAME}/
cp {TARGET_DIR}/image/*.png cases/${CASE_NAME}/images/
# 4. Create index.js (re-export entry point, required by registry)
cat > cases/${CASE_NAME}/index.js << EOF
export const meta = { id: '${CASE_NAME}', name: '${BTI_NAME}', desc: '${THEME}', author: '$(git config user.name)', authorUrl: '' };
export { dimensionMeta, dimensionOrder, DIM_EXPLANATIONS } from './dimensions.js';
export { questions } from './questions.js';
export { TYPE_LIBRARY, TYPE_IMAGES, NORMAL_TYPES } from './types.js';
EOF
# 5. Create case.json (combined metadata + data for static access)
# Use Node.js to merge all data into a single JSON file:
node -e "
const dim = require('./cases/${CASE_NAME}/dimensions.js');
const q = require('./cases/${CASE_NAME}/questions.js');
const t = require('./cases/${CASE_NAME}/types.js');
const data = {
meta: { id: '${CASE_NAME}', name: '${BTI_NAME}', desc: '${THEME}', author: '$(git config user.name)', authorUrl: '' },
...dim, ...q, ...t
};
require('fs').writeFileSync('./cases/${CASE_NAME}/case.json', JSON.stringify(data, null, 2));
"
# 6. Update cases/registry.js — add import and entry
# Read current registry, add new import and array entry
# 7. Update cases/index.json — add new case metadata entry
# 8. Create PR
git checkout -b add-case/${CASE_NAME}
git add cases/${CASE_NAME} cases/registry.js cases/index.json
git commit -m "feat: add ${BTI_NAME} case (${THEME})"
git push origin add-case/${CASE_NAME}
gh pr create \
--repo lovstudio/XBTI \
--title "feat: add ${BTI_NAME} (${THEME})" \
--body "$(cat <<'PREOF'
## New BTI Case
- **Name**: {BTI_NAME}
- **Theme**: {THEME}
- **Style**: {STYLE}
- **Types**: {TYPE_COUNT} personality types
Generated with [xbti-creator](https://github.com/lovstudio/skills)
PREOF
)"
Update cases/registry.js: Add import * as {CASE_NAME} from './{CASE_NAME}'; and append to the CASES array.
Update cases/index.json: Append {"id":"{CASE_NAME}","name":"{BTI_NAME}","desc":"{THEME}","author":"...","authorUrl":"..."} to the array.
Tell user the PR URL and that it will appear on xbti.lovstudio.ai after merge.
# Clean up
rm -rf /tmp/XBTI
references/xbti-data-format.md — exact data structure format for all files