Compare commits
2 Commits
1bb782467b
...
5894f4619d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5894f4619d | ||
|
|
56d63a0146 |
50
CLAUDE.md
50
CLAUDE.md
@@ -273,9 +273,47 @@ docker-compose exec web npx prisma migrate deploy # Run migrations in container
|
|||||||
- Requires external PostgreSQL database (Vercel Postgres, Supabase, etc.)
|
- Requires external PostgreSQL database (Vercel Postgres, Supabase, etc.)
|
||||||
- Redis is optional
|
- Redis is optional
|
||||||
|
|
||||||
## Additional Resources
|
## Additional Resources
|
||||||
|
|
||||||
- README.md - Detailed setup and feature overview
|
- README.md - Detailed setup and feature overview
|
||||||
- DOCKER_SETUP.md - Complete Docker deployment guide
|
- DOCKER_SETUP.md - Complete Docker deployment guide
|
||||||
- prisma/schema.prisma - Database schema and relationships
|
- prisma/schema.prisma - Database schema and relationships
|
||||||
- env.example - Environment variable template
|
- env.example - Environment variable template
|
||||||
|
|
||||||
|
## gstack (REQUIRED — global install)
|
||||||
|
|
||||||
|
Before doing any AI-assisted work in this repo, verify gstack is installed globally:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
test -d ~/.claude/skills/gstack/bin && echo "GSTACK_OK" || echo "GSTACK_MISSING"
|
||||||
|
```
|
||||||
|
|
||||||
|
If `GSTACK_MISSING`: stop and install it:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack
|
||||||
|
cd ~/.claude/skills/gstack && ./setup --team
|
||||||
|
```
|
||||||
|
|
||||||
|
After install, use gstack skills where appropriate, especially `/browse`, `/review`, `/investigate`, `/qa`, `/ship`, and `/cso`.
|
||||||
|
Use `~/.claude/skills/gstack/...` for gstack file paths because this repo does not vendor the pack locally.
|
||||||
|
|
||||||
|
## Skill routing
|
||||||
|
|
||||||
|
When the user's request matches an available skill, ALWAYS invoke it using the Skill
|
||||||
|
tool as your FIRST action. Do NOT answer directly, do NOT use other tools first.
|
||||||
|
The skill has specialized workflows that produce better results than ad-hoc answers.
|
||||||
|
|
||||||
|
Key routing rules:
|
||||||
|
- Product ideas, "is this worth building", brainstorming → invoke office-hours
|
||||||
|
- Bugs, errors, "why is this broken", 500 errors → invoke investigate
|
||||||
|
- Ship, deploy, push, create PR → invoke ship
|
||||||
|
- QA, test the site, find bugs → invoke qa
|
||||||
|
- Code review, check my diff → invoke review
|
||||||
|
- Update docs after shipping → invoke document-release
|
||||||
|
- Weekly retro → invoke retro
|
||||||
|
- Design system, brand → invoke design-consultation
|
||||||
|
- Visual audit, design polish → invoke design-review
|
||||||
|
- Architecture review → invoke plan-eng-review
|
||||||
|
- Save progress, checkpoint, resume → invoke checkpoint
|
||||||
|
- Code quality, health check → invoke health
|
||||||
|
|||||||
@@ -4,7 +4,11 @@ const nextConfig = {
|
|||||||
skipTrailingSlashRedirect: true,
|
skipTrailingSlashRedirect: true,
|
||||||
images: {
|
images: {
|
||||||
unoptimized: false,
|
unoptimized: false,
|
||||||
domains: ['www.qrmaster.net', 'qrmaster.net', 'images.qrmaster.net'],
|
remotePatterns: [
|
||||||
|
{ protocol: 'https', hostname: 'www.qrmaster.net' },
|
||||||
|
{ protocol: 'https', hostname: 'qrmaster.net' },
|
||||||
|
{ protocol: 'https', hostname: 'images.qrmaster.net' },
|
||||||
|
],
|
||||||
formats: ['image/webp', 'image/avif'],
|
formats: ['image/webp', 'image/avif'],
|
||||||
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
||||||
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
|
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ export default function CreatePage() {
|
|||||||
case 'FEEDBACK':
|
case 'FEEDBACK':
|
||||||
return content.feedbackUrl || 'https://example.com/feedback';
|
return content.feedbackUrl || 'https://example.com/feedback';
|
||||||
case 'BARCODE':
|
case 'BARCODE':
|
||||||
return content.value || '';
|
return isDynamic ? (content.url || '') : (content.value || '');
|
||||||
default:
|
default:
|
||||||
return 'https://example.com';
|
return 'https://example.com';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -209,10 +209,10 @@ END:VCARD`;
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div id={`qr-svg-${qr.id}`} className={qr.style?.cornerStyle === 'rounded' ? 'rounded-lg overflow-hidden' : ''}>
|
<div id={`qr-svg-${qr.id}`} className={qr.style?.cornerStyle === 'rounded' ? 'rounded-lg overflow-hidden' : ''}>
|
||||||
{qr.contentType === 'BARCODE' && qr.type === 'STATIC' ? (
|
{qr.contentType === 'BARCODE' ? (
|
||||||
<Barcode
|
<Barcode
|
||||||
key={`${qr.content?.value}-${qr.content?.format}`}
|
key={`${qr.id}-${qr.type === 'STATIC' ? qr.content?.value : qrUrl}-${qr.content?.format}`}
|
||||||
value={qr.content?.value || '123456789'}
|
value={qr.type === 'STATIC' ? (qr.content?.value || '123456789') : qrUrl}
|
||||||
format={(qr.content?.format as any) || 'CODE128'}
|
format={(qr.content?.format as any) || 'CODE128'}
|
||||||
lineColor={qr.style?.foregroundColor || '#000000'}
|
lineColor={qr.style?.foregroundColor || '#000000'}
|
||||||
background={qr.style?.backgroundColor || '#FFFFFF'}
|
background={qr.style?.backgroundColor || '#FFFFFF'}
|
||||||
|
|||||||
Reference in New Issue
Block a user