start-vibing-stacks 2.4.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -0
- package/dist/scanner.js +7 -2
- package/dist/setup.js +21 -2
- package/dist/types.d.ts +1 -0
- package/package.json +1 -1
- package/stacks/nodejs/stack.json +1 -1
- package/stacks/php/stack.json +1 -1
- package/templates/CLAUDE-nodejs.md +5 -1
- package/templates/CLAUDE-php.md +4 -0
package/dist/index.js
CHANGED
|
@@ -180,11 +180,13 @@ async function main() {
|
|
|
180
180
|
]);
|
|
181
181
|
const selectedFramework = stackConfig.frameworks.find((f) => f.id === framework);
|
|
182
182
|
// ─── Step 4: Select Database ───────────────────────────────────────────
|
|
183
|
+
const defaultDatabase = stackConfig.databases.find((d) => d.default)?.id || undefined;
|
|
183
184
|
const { database } = await inquirer.prompt([
|
|
184
185
|
{
|
|
185
186
|
type: 'list',
|
|
186
187
|
name: 'database',
|
|
187
188
|
message: 'Select database:',
|
|
189
|
+
default: defaultDatabase,
|
|
188
190
|
choices: stackConfig.databases.map((d) => ({
|
|
189
191
|
name: `${d.icon} ${d.name}`,
|
|
190
192
|
value: d.id,
|
package/dist/scanner.js
CHANGED
|
@@ -425,6 +425,11 @@ function scanProjectFiles(projectDir) {
|
|
|
425
425
|
if (existsSync(join(projectDir, '.prettierrc')) || existsSync(join(projectDir, '.prettierrc.json')) || existsSync(join(projectDir, 'prettier.config.js'))) {
|
|
426
426
|
patterns.push({ category: 'quality', name: 'Prettier config present', confidence: 100 });
|
|
427
427
|
}
|
|
428
|
+
// ── UI/UX Skills ──
|
|
429
|
+
if (existsSync(join(projectDir, '.cursor', 'skills', 'ui-ux-pro-max', 'SKILL.md')) ||
|
|
430
|
+
existsSync(join(projectDir, '.claude', 'skills', 'ui-ux-pro-max', 'SKILL.md'))) {
|
|
431
|
+
patterns.push({ category: 'ui', name: 'UI/UX Pro Max skill installed', confidence: 100 });
|
|
432
|
+
}
|
|
428
433
|
// Environment files (works for both PHP and Node.js projects)
|
|
429
434
|
const envFiles = ['.env.example', '.env', '.env.local', '.env.development', '.env.production'];
|
|
430
435
|
let envContent = null;
|
|
@@ -453,8 +458,8 @@ function scanProjectFiles(projectDir) {
|
|
|
453
458
|
// Security: detect NEXT_PUBLIC_ with sensitive values
|
|
454
459
|
const sensitivePublicEnv = envContent.match(/^NEXT_PUBLIC_\w*(SECRET|TOKEN|PRIVATE|PASSWORD|CREDENTIAL|OPENAI|API_KEY|DATABASE)\w*\s*=/gmi);
|
|
455
460
|
if (sensitivePublicEnv) {
|
|
456
|
-
for (const
|
|
457
|
-
const varName =
|
|
461
|
+
for (const found of sensitivePublicEnv) {
|
|
462
|
+
const varName = found.split('=')[0].trim();
|
|
458
463
|
patterns.push({
|
|
459
464
|
category: 'security',
|
|
460
465
|
name: `EXPOSED SECRET: ${varName} is public (visible in browser)`,
|
package/dist/setup.js
CHANGED
|
@@ -207,7 +207,7 @@ export async function setupProject(projectDir, config, options = {}) {
|
|
|
207
207
|
hooks: [
|
|
208
208
|
{
|
|
209
209
|
type: 'command',
|
|
210
|
-
command: '
|
|
210
|
+
command: 'npx tsx .claude/hooks/user-prompt-submit.ts',
|
|
211
211
|
timeout: 10,
|
|
212
212
|
},
|
|
213
213
|
],
|
|
@@ -218,7 +218,7 @@ export async function setupProject(projectDir, config, options = {}) {
|
|
|
218
218
|
hooks: [
|
|
219
219
|
{
|
|
220
220
|
type: 'command',
|
|
221
|
-
command: '
|
|
221
|
+
command: 'npx tsx .claude/hooks/stop-validator.ts',
|
|
222
222
|
timeout: 30,
|
|
223
223
|
},
|
|
224
224
|
],
|
|
@@ -302,6 +302,25 @@ export async function setupProject(projectDir, config, options = {}) {
|
|
|
302
302
|
// package.json parse error, skip
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
|
+
// 15. Auto-install UI/UX Pro Max skill for frontend projects
|
|
306
|
+
const uiproSkillPath = join(projectDir, '.cursor', 'skills', 'ui-ux-pro-max', 'SKILL.md');
|
|
307
|
+
const uiproClaudePath = join(claudeDir, 'skills', 'ui-ux-pro-max', 'SKILL.md');
|
|
308
|
+
if (config.frontend && config.frontend !== 'none' && !existsSync(uiproSkillPath) && !existsSync(uiproClaudePath)) {
|
|
309
|
+
spinner.start('Installing UI/UX Pro Max skill...');
|
|
310
|
+
try {
|
|
311
|
+
const { execFileSync: execF } = await import('child_process');
|
|
312
|
+
execF('npx', ['uipro-cli', 'init', '--ai', 'cursor'], {
|
|
313
|
+
cwd: projectDir,
|
|
314
|
+
stdio: 'pipe',
|
|
315
|
+
timeout: 60000,
|
|
316
|
+
});
|
|
317
|
+
spinner.succeed('UI/UX Pro Max skill installed');
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
spinner.warn('UI/UX Pro Max: auto-install failed');
|
|
321
|
+
ui.info('Install manually: npx uipro-cli init --ai cursor');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
305
324
|
spinner.succeed(`Setup complete: ${agentCount} agents, ${sharedSkillCount + stackSkillCount} skills, ${hookCount} hooks`);
|
|
306
325
|
return true;
|
|
307
326
|
}
|
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
package/stacks/nodejs/stack.json
CHANGED
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"databases": [
|
|
68
68
|
{ "id": "mongodb", "name": "MongoDB", "icon": "🍃" },
|
|
69
69
|
{ "id": "postgresql", "name": "PostgreSQL", "icon": "🐘" },
|
|
70
|
-
{ "id": "mysql", "name": "MySQL / MariaDB", "icon": "🐬" },
|
|
70
|
+
{ "id": "mysql", "name": "MySQL / MariaDB", "icon": "🐬", "default": true },
|
|
71
71
|
{ "id": "sqlite", "name": "SQLite (Turso / libSQL)", "icon": "📁" },
|
|
72
72
|
{ "id": "redis", "name": "Redis (Upstash)", "icon": "🔴" },
|
|
73
73
|
{ "id": "none", "name": "None", "icon": "❌" }
|
package/stacks/php/stack.json
CHANGED
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
}
|
|
45
45
|
],
|
|
46
46
|
"databases": [
|
|
47
|
-
{ "id": "mysql", "name": "MySQL / MariaDB", "icon": "🐬" },
|
|
47
|
+
{ "id": "mysql", "name": "MySQL / MariaDB", "icon": "🐬", "default": true },
|
|
48
48
|
{ "id": "postgresql", "name": "PostgreSQL", "icon": "🐘" },
|
|
49
49
|
{ "id": "sqlite", "name": "SQLite", "icon": "📁" }
|
|
50
50
|
],
|
|
@@ -120,7 +120,7 @@ project/
|
|
|
120
120
|
|
|
121
121
|
| Category | Skills |
|
|
122
122
|
|----------|--------|
|
|
123
|
-
| **Development** | typescript-strict, react-patterns, nextjs-app-router, zod-validation, shadcn-ui, tailwind-patterns |
|
|
123
|
+
| **Development** | typescript-strict, react-patterns, nextjs-app-router, zod-validation, shadcn-ui, tailwind-patterns, ui-ux-pro-max |
|
|
124
124
|
| **Quality** | quality-gate, security-scan, test-coverage, final-check |
|
|
125
125
|
| **Infrastructure** | docker-patterns, git-workflow, performance-patterns, debugging-patterns |
|
|
126
126
|
| **Documentation** | codebase-knowledge, docs-tracker, research-cache, ui-ux-audit |
|
|
@@ -251,6 +251,10 @@ source: 'listed' as const; // CORRECT (literal type)
|
|
|
251
251
|
| Use MUI/Chakra | Use shadcn/ui + Radix |
|
|
252
252
|
| Skip CLAUDE.md update | MUST update after implementations |
|
|
253
253
|
|
|
254
|
+
## UI/UX Design Intelligence
|
|
255
|
+
|
|
256
|
+
> When the project has a frontend, the **UI/UX Pro Max** skill is auto-installed. It provides 67 UI styles, 161 color palettes, 57 font pairings, and 161 industry-specific reasoning rules. It activates automatically for any UI/UX task.
|
|
257
|
+
|
|
254
258
|
## UI Architecture
|
|
255
259
|
|
|
256
260
|
> Web apps MUST have **separate UIs** for each platform, NOT just "responsive design".
|
package/templates/CLAUDE-php.md
CHANGED
|
@@ -211,6 +211,10 @@ return Inertia::render('Dashboard', [
|
|
|
211
211
|
| Inline Tailwind class soup | Unreadable — use STYLES const object |
|
|
212
212
|
| `axios.post()` for forms | No CSRF/errors — use `useForm().post()` |
|
|
213
213
|
|
|
214
|
+
## UI/UX Design Intelligence
|
|
215
|
+
|
|
216
|
+
> When the project has a frontend, the **UI/UX Pro Max** skill is auto-installed. It provides 67 UI styles, 161 color palettes, 57 font pairings, and 161 industry-specific reasoning rules. It activates automatically for any UI/UX task.
|
|
217
|
+
|
|
214
218
|
## Quality Gates
|
|
215
219
|
|
|
216
220
|
```bash
|