myaiforone 1.0.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/README.md +113 -0
- package/agents/_template/CLAUDE.md +18 -0
- package/agents/_template/agent.json +7 -0
- package/agents/platform/agentcreator/CLAUDE.md +300 -0
- package/agents/platform/appcreator/CLAUDE.md +158 -0
- package/agents/platform/gym/CLAUDE.md +486 -0
- package/agents/platform/gym/agent.json +40 -0
- package/agents/platform/gym/programs/agent-building/program.json +160 -0
- package/agents/platform/gym/programs/automations-mastery/program.json +129 -0
- package/agents/platform/gym/programs/getting-started/program.json +124 -0
- package/agents/platform/gym/programs/mcp-integrations/program.json +116 -0
- package/agents/platform/gym/programs/multi-model-strategy/program.json +115 -0
- package/agents/platform/gym/programs/prompt-engineering/program.json +136 -0
- package/agents/platform/gym/souls/alex.md +12 -0
- package/agents/platform/gym/souls/jordan.md +12 -0
- package/agents/platform/gym/souls/morgan.md +12 -0
- package/agents/platform/gym/souls/riley.md +12 -0
- package/agents/platform/gym/souls/sam.md +12 -0
- package/agents/platform/hub/CLAUDE.md +372 -0
- package/agents/platform/promptcreator/CLAUDE.md +130 -0
- package/agents/platform/skillcreator/CLAUDE.md +163 -0
- package/bin/cli.js +566 -0
- package/config.example.json +310 -0
- package/dist/agent-registry.d.ts +32 -0
- package/dist/agent-registry.d.ts.map +1 -0
- package/dist/agent-registry.js +144 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/channels/discord.d.ts +17 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +114 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/imessage.d.ts +23 -0
- package/dist/channels/imessage.d.ts.map +1 -0
- package/dist/channels/imessage.js +214 -0
- package/dist/channels/imessage.js.map +1 -0
- package/dist/channels/slack.d.ts +19 -0
- package/dist/channels/slack.d.ts.map +1 -0
- package/dist/channels/slack.js +167 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/telegram.d.ts +19 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +274 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/types.d.ts +44 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +18 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +23 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +189 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/config.d.ts +134 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +127 -0
- package/dist/config.js.map +1 -0
- package/dist/cron.d.ts +8 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +35 -0
- package/dist/cron.js.map +1 -0
- package/dist/decrypt-keys.d.ts +7 -0
- package/dist/decrypt-keys.d.ts.map +1 -0
- package/dist/decrypt-keys.js +53 -0
- package/dist/decrypt-keys.js.map +1 -0
- package/dist/encrypt-keys.d.ts +8 -0
- package/dist/encrypt-keys.d.ts.map +1 -0
- package/dist/encrypt-keys.js +62 -0
- package/dist/encrypt-keys.js.map +1 -0
- package/dist/executor.d.ts +31 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +2009 -0
- package/dist/executor.js.map +1 -0
- package/dist/gemini-executor.d.ts +27 -0
- package/dist/gemini-executor.d.ts.map +1 -0
- package/dist/gemini-executor.js +160 -0
- package/dist/gemini-executor.js.map +1 -0
- package/dist/goals.d.ts +24 -0
- package/dist/goals.d.ts.map +1 -0
- package/dist/goals.js +189 -0
- package/dist/goals.js.map +1 -0
- package/dist/gym/activity-digest.d.ts +30 -0
- package/dist/gym/activity-digest.d.ts.map +1 -0
- package/dist/gym/activity-digest.js +506 -0
- package/dist/gym/activity-digest.js.map +1 -0
- package/dist/gym/dimension-scorer.d.ts +76 -0
- package/dist/gym/dimension-scorer.d.ts.map +1 -0
- package/dist/gym/dimension-scorer.js +236 -0
- package/dist/gym/dimension-scorer.js.map +1 -0
- package/dist/gym/gym-router.d.ts +7 -0
- package/dist/gym/gym-router.d.ts.map +1 -0
- package/dist/gym/gym-router.js +718 -0
- package/dist/gym/gym-router.js.map +1 -0
- package/dist/gym/index.d.ts +11 -0
- package/dist/gym/index.d.ts.map +1 -0
- package/dist/gym/index.js +11 -0
- package/dist/gym/index.js.map +1 -0
- package/dist/heartbeat.d.ts +21 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +163 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/keystore.d.ts +22 -0
- package/dist/keystore.d.ts.map +1 -0
- package/dist/keystore.js +178 -0
- package/dist/keystore.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +45 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/daily.d.ts +22 -0
- package/dist/memory/daily.d.ts.map +1 -0
- package/dist/memory/daily.js +82 -0
- package/dist/memory/daily.js.map +1 -0
- package/dist/memory/embeddings.d.ts +15 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +154 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +159 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/search.d.ts +21 -0
- package/dist/memory/search.d.ts.map +1 -0
- package/dist/memory/search.js +77 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/memory/store.d.ts +23 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +144 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/ollama-executor.d.ts +17 -0
- package/dist/ollama-executor.d.ts.map +1 -0
- package/dist/ollama-executor.js +112 -0
- package/dist/ollama-executor.js.map +1 -0
- package/dist/openai-executor.d.ts +38 -0
- package/dist/openai-executor.d.ts.map +1 -0
- package/dist/openai-executor.js +197 -0
- package/dist/openai-executor.js.map +1 -0
- package/dist/router.d.ts +11 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +185 -0
- package/dist/router.js.map +1 -0
- package/dist/test-message.d.ts +2 -0
- package/dist/test-message.d.ts.map +1 -0
- package/dist/test-message.js +60 -0
- package/dist/test-message.js.map +1 -0
- package/dist/utils/imsg-db-reader.d.ts +24 -0
- package/dist/utils/imsg-db-reader.d.ts.map +1 -0
- package/dist/utils/imsg-db-reader.js +92 -0
- package/dist/utils/imsg-db-reader.js.map +1 -0
- package/dist/utils/imsg-rpc.d.ts +25 -0
- package/dist/utils/imsg-rpc.d.ts.map +1 -0
- package/dist/utils/imsg-rpc.js +149 -0
- package/dist/utils/imsg-rpc.js.map +1 -0
- package/dist/utils/message-formatter.d.ts +3 -0
- package/dist/utils/message-formatter.d.ts.map +1 -0
- package/dist/utils/message-formatter.js +69 -0
- package/dist/utils/message-formatter.js.map +1 -0
- package/dist/web-ui.d.ts +12 -0
- package/dist/web-ui.d.ts.map +1 -0
- package/dist/web-ui.js +5784 -0
- package/dist/web-ui.js.map +1 -0
- package/dist/whatsapp-chats.d.ts +2 -0
- package/dist/whatsapp-chats.d.ts.map +1 -0
- package/dist/whatsapp-chats.js +76 -0
- package/dist/whatsapp-chats.js.map +1 -0
- package/dist/whatsapp-login.d.ts +2 -0
- package/dist/whatsapp-login.d.ts.map +1 -0
- package/dist/whatsapp-login.js +90 -0
- package/dist/whatsapp-login.js.map +1 -0
- package/dist/wiki-sync.d.ts +21 -0
- package/dist/wiki-sync.d.ts.map +1 -0
- package/dist/wiki-sync.js +147 -0
- package/dist/wiki-sync.js.map +1 -0
- package/docs/AddNewAgentGuide.md +100 -0
- package/docs/AddNewMcpGuide.md +72 -0
- package/docs/Architecture.md +795 -0
- package/docs/CLAUDE-AI-SETUP.md +166 -0
- package/docs/Setup.md +297 -0
- package/docs/ai-gym-architecture.md +1040 -0
- package/docs/ai-gym-build-plan.md +343 -0
- package/docs/ai-gym-onboarding.md +122 -0
- package/docs/appcreator_plan.md +348 -0
- package/docs/platform-mcp-audit.md +320 -0
- package/docs/server-deployment-plan.md +503 -0
- package/docs/superpowers/plans/2026-03-25-marketplace.md +1281 -0
- package/docs/superpowers/specs/2026-03-25-marketplace-design.md +287 -0
- package/docs/user-guide.md +2016 -0
- package/mcp-catalog.json +628 -0
- package/package.json +63 -0
- package/public/MyAIforOne-logomark-512.svg +16 -0
- package/public/MyAIforOne-logomark-transparent.svg +15 -0
- package/public/activity.html +314 -0
- package/public/admin.html +1674 -0
- package/public/agent-dashboard.html +670 -0
- package/public/api-docs.html +1106 -0
- package/public/automations.html +722 -0
- package/public/canvas.css +223 -0
- package/public/canvas.js +588 -0
- package/public/changelog.html +231 -0
- package/public/gym.html +2766 -0
- package/public/home.html +1930 -0
- package/public/index.html +2809 -0
- package/public/lab.html +1643 -0
- package/public/library.html +1442 -0
- package/public/marketplace.html +1101 -0
- package/public/mcp-docs.html +441 -0
- package/public/mini.html +390 -0
- package/public/monitor.html +584 -0
- package/public/org.html +4304 -0
- package/public/projects.html +734 -0
- package/public/settings.html +645 -0
- package/public/tasks.html +932 -0
- package/public/trainers/alex.svg +12 -0
- package/public/trainers/jordan.svg +12 -0
- package/public/trainers/morgan.svg +12 -0
- package/public/trainers/riley.svg +12 -0
- package/public/trainers/sam.svg +12 -0
- package/public/user-guide.html +218 -0
- package/registry/agents.json +3 -0
- package/registry/apps.json +20 -0
- package/registry/installed-drafts.json +3 -0
- package/registry/mcps.json +1084 -0
- package/registry/prompts/personal/mcp-test-prompt.md +6 -0
- package/registry/prompts/personal/memory-recall.md +6 -0
- package/registry/prompts/platform/brainstorm.md +15 -0
- package/registry/prompts/platform/code-review.md +16 -0
- package/registry/prompts/platform/explain.md +16 -0
- package/registry/prompts.json +58 -0
- package/registry/skills/external/brainstorming.md +5 -0
- package/registry/skills/external/code-review.md +40 -0
- package/registry/skills/external/frontend-patterns.md +642 -0
- package/registry/skills/external/frontend-slides.md +184 -0
- package/registry/skills/external/systematic-debugging.md +5 -0
- package/registry/skills/external/tdd.md +328 -0
- package/registry/skills/external/verification-before-completion.md +5 -0
- package/registry/skills/external/writing-plans.md +5 -0
- package/registry/skills/platform/ai41_app_build.md +930 -0
- package/registry/skills/platform/ai41_app_deploy.md +168 -0
- package/registry/skills/platform/ai41_app_orchestrator.md +239 -0
- package/registry/skills/platform/ai41_app_patterns.md +359 -0
- package/registry/skills/platform/ai41_app_register.md +85 -0
- package/registry/skills/platform/ai41_app_scaffold.md +421 -0
- package/registry/skills/platform/ai41_app_verify.md +107 -0
- package/registry/skills/platform/opProjectCreate.md +239 -0
- package/registry/skills/platform/op_devbrowser.md +136 -0
- package/registry/skills/platform/sop_brandguidelines.md +103 -0
- package/registry/skills/platform/sop_docx.md +117 -0
- package/registry/skills/platform/sop_frontenddesign.md +44 -0
- package/registry/skills/platform/sop_frontenddesign_v2.md +659 -0
- package/registry/skills/platform/sop_mcpbuilder.md +133 -0
- package/registry/skills/platform/sop_pdf.md +172 -0
- package/registry/skills/platform/sop_pptx.md +133 -0
- package/registry/skills/platform/sop_skillcreator.md +104 -0
- package/registry/skills/platform/sop_themefactory.md +128 -0
- package/registry/skills/platform/sop_webapptesting.md +75 -0
- package/registry/skills/platform/sop_webartifactsbuilder.md +97 -0
- package/registry/skills/platform/sop_xlsx.md +134 -0
- package/registry/skills.json +1055 -0
- package/scripts/discover-chats.sh +11 -0
- package/scripts/install-service-windows.ps1 +87 -0
- package/scripts/install-service.sh +52 -0
- package/scripts/seed-registry.ts +195 -0
- package/scripts/test-send.sh +5 -0
- package/scripts/tray-indicator.ps1 +35 -0
- package/scripts/uninstall-service-windows.ps1 +23 -0
- package/scripts/uninstall-service.sh +15 -0
- package/scripts/xbar-myagent.5s.sh +32 -0
- package/server/mcp-server/dist/index.d.ts +11 -0
- package/server/mcp-server/dist/index.js +1332 -0
- package/server/mcp-server/dist/lib/api-client.d.ts +165 -0
- package/server/mcp-server/dist/lib/api-client.js +241 -0
- package/server/mcp-server/index.ts +1545 -0
- package/server/mcp-server/lib/api-client.ts +366 -0
- package/server/mcp-server/tsconfig.json +14 -0
- package/src/agent-registry.ts +180 -0
- package/src/channels/discord.ts +129 -0
- package/src/channels/imessage.ts +261 -0
- package/src/channels/slack.ts +208 -0
- package/src/channels/telegram.ts +307 -0
- package/src/channels/types.ts +62 -0
- package/src/channels/whatsapp.ts +227 -0
- package/src/config.ts +281 -0
- package/src/cron.ts +43 -0
- package/src/decrypt-keys.ts +60 -0
- package/src/encrypt-keys.ts +70 -0
- package/src/executor.ts +2190 -0
- package/src/gemini-executor.ts +212 -0
- package/src/goals.ts +240 -0
- package/src/gym/activity-digest.ts +546 -0
- package/src/gym/dimension-scorer.ts +297 -0
- package/src/gym/gym-router.ts +801 -0
- package/src/gym/index.ts +19 -0
- package/src/heartbeat.ts +220 -0
- package/src/index.ts +275 -0
- package/src/keystore.ts +190 -0
- package/src/logger.ts +51 -0
- package/src/memory/daily.ts +101 -0
- package/src/memory/embeddings.ts +185 -0
- package/src/memory/index.ts +218 -0
- package/src/memory/search.ts +124 -0
- package/src/memory/store.ts +189 -0
- package/src/ollama-executor.ts +126 -0
- package/src/openai-executor.ts +259 -0
- package/src/router.ts +230 -0
- package/src/test-message.ts +72 -0
- package/src/utils/imsg-db-reader.ts +109 -0
- package/src/utils/imsg-rpc.ts +178 -0
- package/src/utils/message-formatter.ts +90 -0
- package/src/web-ui.ts +5778 -0
- package/src/whatsapp-chats.ts +91 -0
- package/src/whatsapp-login.ts +110 -0
- package/src/wiki-sync.ts +199 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai41_app_scaffold
|
|
3
|
+
description: >-
|
|
4
|
+
Deterministic project scaffolding for Express 5 + React 19 + Prisma + Tailwind + shadcn/ui apps. Creates all config files and runs npm install. Called by ai41_app_orchestrator Phase 1.
|
|
5
|
+
allowed-tools: Write Bash
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# App Scaffold
|
|
9
|
+
|
|
10
|
+
Create the project directory and all configuration files deterministically. DO NOT let AI write these — use the exact templates below.
|
|
11
|
+
|
|
12
|
+
## Variables
|
|
13
|
+
|
|
14
|
+
Before starting, determine:
|
|
15
|
+
- `APP_SLUG` — lowercase hyphenated (e.g., `expense-tracker`)
|
|
16
|
+
- `APP_NAME` — human readable (e.g., `Expense Tracker`)
|
|
17
|
+
- `APP_DIR` — `{PROJECT_DIR}`
|
|
18
|
+
- `NEEDS_DB` — true/false (default: true)
|
|
19
|
+
|
|
20
|
+
## Step 1: Create Directory Structure
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
mkdir -p {PROJECT_DIR}/backend/src/routes
|
|
24
|
+
mkdir -p {PROJECT_DIR}/backend/src/middleware
|
|
25
|
+
mkdir -p {PROJECT_DIR}/backend/prisma
|
|
26
|
+
mkdir -p {PROJECT_DIR}/frontend/src/components/ui
|
|
27
|
+
mkdir -p {PROJECT_DIR}/frontend/src/pages
|
|
28
|
+
mkdir -p {PROJECT_DIR}/frontend/src/hooks
|
|
29
|
+
mkdir -p {PROJECT_DIR}/frontend/src/lib
|
|
30
|
+
mkdir -p {PROJECT_DIR}/frontend/public
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Step 2: Write Root Files
|
|
34
|
+
|
|
35
|
+
### `.gitignore`
|
|
36
|
+
```
|
|
37
|
+
node_modules/
|
|
38
|
+
dist/
|
|
39
|
+
build/
|
|
40
|
+
.env
|
|
41
|
+
.env.local
|
|
42
|
+
*.log
|
|
43
|
+
.prisma/
|
|
44
|
+
.next/
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Step 3: Write Backend Files
|
|
48
|
+
|
|
49
|
+
### `backend/package.json`
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"name": "{APP_SLUG}-backend",
|
|
53
|
+
"version": "1.0.0",
|
|
54
|
+
"private": true,
|
|
55
|
+
"type": "module",
|
|
56
|
+
"scripts": {
|
|
57
|
+
"dev": "tsx watch src/index.ts",
|
|
58
|
+
"build": "tsc",
|
|
59
|
+
"start": "node dist/index.js",
|
|
60
|
+
"db:push": "prisma db push",
|
|
61
|
+
"db:migrate": "prisma migrate dev",
|
|
62
|
+
"db:seed": "tsx prisma/seed.ts",
|
|
63
|
+
"db:studio": "prisma studio"
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"cors": "^2.8.5",
|
|
67
|
+
"dotenv": "^16.4.7",
|
|
68
|
+
"express": "^5.0.1",
|
|
69
|
+
"helmet": "^8.0.0",
|
|
70
|
+
"morgan": "^1.10.0",
|
|
71
|
+
"zod": "^3.24.2"
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@types/cors": "^2.8.17",
|
|
75
|
+
"@types/express": "^5.0.0",
|
|
76
|
+
"@types/morgan": "^1.9.9",
|
|
77
|
+
"@types/node": "^22.10.0",
|
|
78
|
+
"tsx": "^4.19.0",
|
|
79
|
+
"typescript": "^5.7.0"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
If `NEEDS_DB` is true, add to dependencies:
|
|
85
|
+
```json
|
|
86
|
+
"@prisma/client": "^6.2.0"
|
|
87
|
+
```
|
|
88
|
+
And to devDependencies:
|
|
89
|
+
```json
|
|
90
|
+
"prisma": "^6.2.0"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### `backend/tsconfig.json`
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"compilerOptions": {
|
|
97
|
+
"target": "ES2022",
|
|
98
|
+
"module": "ESNext",
|
|
99
|
+
"moduleResolution": "bundler",
|
|
100
|
+
"lib": ["ES2022"],
|
|
101
|
+
"outDir": "dist",
|
|
102
|
+
"rootDir": "src",
|
|
103
|
+
"strict": true,
|
|
104
|
+
"esModuleInterop": true,
|
|
105
|
+
"skipLibCheck": true,
|
|
106
|
+
"forceConsistentCasingInFileNames": true,
|
|
107
|
+
"resolveJsonModule": true,
|
|
108
|
+
"declaration": true,
|
|
109
|
+
"declarationMap": true,
|
|
110
|
+
"sourceMap": true
|
|
111
|
+
},
|
|
112
|
+
"include": ["src/**/*"],
|
|
113
|
+
"exclude": ["node_modules", "dist"]
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### `backend/.env.example`
|
|
118
|
+
```
|
|
119
|
+
PORT=3001
|
|
120
|
+
DATABASE_URL=postgresql://user:password@localhost:5432/{APP_SLUG}?schema=public
|
|
121
|
+
NODE_ENV=development
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### `backend/.env`
|
|
125
|
+
```
|
|
126
|
+
PORT=3001
|
|
127
|
+
DATABASE_URL=postgresql://user:password@localhost:5432/{APP_SLUG}?schema=public
|
|
128
|
+
NODE_ENV=development
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### `backend/prisma/schema.prisma` (if NEEDS_DB)
|
|
132
|
+
```prisma
|
|
133
|
+
generator client {
|
|
134
|
+
provider = "prisma-client-js"
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
datasource db {
|
|
138
|
+
provider = "postgresql"
|
|
139
|
+
url = env("DATABASE_URL")
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Models will be added during BUILD phase
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### `backend/src/index.ts`
|
|
146
|
+
```typescript
|
|
147
|
+
import "dotenv/config";
|
|
148
|
+
import express from "express";
|
|
149
|
+
import cors from "cors";
|
|
150
|
+
import helmet from "helmet";
|
|
151
|
+
import morgan from "morgan";
|
|
152
|
+
|
|
153
|
+
const app = express();
|
|
154
|
+
const PORT = parseInt(process.env.PORT || "3001");
|
|
155
|
+
|
|
156
|
+
// Middleware
|
|
157
|
+
app.use(helmet());
|
|
158
|
+
app.use(cors({ origin: process.env.CORS_ORIGIN || "http://localhost:5173", credentials: true }));
|
|
159
|
+
app.use(express.json());
|
|
160
|
+
app.use(morgan("dev"));
|
|
161
|
+
|
|
162
|
+
// Health check
|
|
163
|
+
app.get("/api/health", (_req, res) => {
|
|
164
|
+
res.json({ status: "ok", timestamp: new Date().toISOString() });
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Routes will be registered during BUILD phase
|
|
168
|
+
|
|
169
|
+
// Error handler
|
|
170
|
+
app.use((err: Error, _req: express.Request, res: express.Response, _next: express.NextFunction) => {
|
|
171
|
+
console.error(err.stack);
|
|
172
|
+
res.status(500).json({ error: process.env.NODE_ENV === "production" ? "Internal server error" : err.message });
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
app.listen(PORT, () => {
|
|
176
|
+
console.log(`Server running on port ${PORT}`);
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Step 4: Write Frontend Files
|
|
181
|
+
|
|
182
|
+
### `frontend/package.json`
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"name": "{APP_SLUG}-frontend",
|
|
186
|
+
"version": "1.0.0",
|
|
187
|
+
"private": true,
|
|
188
|
+
"type": "module",
|
|
189
|
+
"scripts": {
|
|
190
|
+
"dev": "vite",
|
|
191
|
+
"build": "tsc -b && vite build",
|
|
192
|
+
"preview": "vite preview"
|
|
193
|
+
},
|
|
194
|
+
"dependencies": {
|
|
195
|
+
"class-variance-authority": "^0.7.1",
|
|
196
|
+
"clsx": "^2.1.1",
|
|
197
|
+
"lucide-react": "^0.468.0",
|
|
198
|
+
"react": "^19.0.0",
|
|
199
|
+
"react-dom": "^19.0.0",
|
|
200
|
+
"react-router-dom": "^7.1.0",
|
|
201
|
+
"tailwind-merge": "^2.6.0"
|
|
202
|
+
},
|
|
203
|
+
"devDependencies": {
|
|
204
|
+
"@tailwindcss/vite": "^4.0.0",
|
|
205
|
+
"@types/react": "^19.0.0",
|
|
206
|
+
"@types/react-dom": "^19.0.0",
|
|
207
|
+
"@vitejs/plugin-react": "^4.3.0",
|
|
208
|
+
"tailwindcss": "^4.0.0",
|
|
209
|
+
"typescript": "^5.7.0",
|
|
210
|
+
"vite": "^6.0.0"
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### `frontend/tsconfig.json`
|
|
216
|
+
```json
|
|
217
|
+
{
|
|
218
|
+
"compilerOptions": {
|
|
219
|
+
"target": "ES2022",
|
|
220
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
221
|
+
"module": "ESNext",
|
|
222
|
+
"moduleResolution": "bundler",
|
|
223
|
+
"jsx": "react-jsx",
|
|
224
|
+
"strict": true,
|
|
225
|
+
"esModuleInterop": true,
|
|
226
|
+
"skipLibCheck": true,
|
|
227
|
+
"forceConsistentCasingInFileNames": true,
|
|
228
|
+
"resolveJsonModule": true,
|
|
229
|
+
"isolatedModules": true,
|
|
230
|
+
"noEmit": true,
|
|
231
|
+
"baseUrl": ".",
|
|
232
|
+
"paths": {
|
|
233
|
+
"@/*": ["./src/*"]
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
"include": ["src"],
|
|
237
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### `frontend/tsconfig.node.json`
|
|
242
|
+
```json
|
|
243
|
+
{
|
|
244
|
+
"compilerOptions": {
|
|
245
|
+
"target": "ES2022",
|
|
246
|
+
"module": "ESNext",
|
|
247
|
+
"moduleResolution": "bundler",
|
|
248
|
+
"allowImportingTsExtensions": true,
|
|
249
|
+
"isolatedModules": true,
|
|
250
|
+
"noEmit": true
|
|
251
|
+
},
|
|
252
|
+
"include": ["vite.config.ts"]
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### `frontend/vite.config.ts`
|
|
257
|
+
```typescript
|
|
258
|
+
import { defineConfig } from "vite";
|
|
259
|
+
import react from "@vitejs/plugin-react";
|
|
260
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
261
|
+
import path from "path";
|
|
262
|
+
|
|
263
|
+
export default defineConfig({
|
|
264
|
+
plugins: [react(), tailwindcss()],
|
|
265
|
+
resolve: {
|
|
266
|
+
alias: {
|
|
267
|
+
"@": path.resolve(__dirname, "./src"),
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
server: {
|
|
271
|
+
port: 5173,
|
|
272
|
+
proxy: {
|
|
273
|
+
"/api": {
|
|
274
|
+
target: "http://localhost:3001",
|
|
275
|
+
changeOrigin: true,
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### `frontend/src/main.tsx`
|
|
283
|
+
```tsx
|
|
284
|
+
import { StrictMode } from "react";
|
|
285
|
+
import { createRoot } from "react-dom/client";
|
|
286
|
+
import { BrowserRouter } from "react-router-dom";
|
|
287
|
+
import App from "./App";
|
|
288
|
+
import "./index.css";
|
|
289
|
+
|
|
290
|
+
createRoot(document.getElementById("root")!).render(
|
|
291
|
+
<StrictMode>
|
|
292
|
+
<BrowserRouter>
|
|
293
|
+
<App />
|
|
294
|
+
</BrowserRouter>
|
|
295
|
+
</StrictMode>
|
|
296
|
+
);
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### `frontend/src/index.css`
|
|
300
|
+
```css
|
|
301
|
+
@import "tailwindcss";
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### `frontend/src/App.tsx`
|
|
305
|
+
```tsx
|
|
306
|
+
import { Routes, Route } from "react-router-dom";
|
|
307
|
+
|
|
308
|
+
export default function App() {
|
|
309
|
+
return (
|
|
310
|
+
<div className="min-h-screen bg-gray-50">
|
|
311
|
+
<Routes>
|
|
312
|
+
{/* Routes will be added during BUILD phase */}
|
|
313
|
+
<Route path="/" element={<div className="p-8 text-center text-gray-500">App is scaffolded. Building...</div>} />
|
|
314
|
+
</Routes>
|
|
315
|
+
</div>
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### `frontend/src/lib/utils.ts`
|
|
321
|
+
```typescript
|
|
322
|
+
import { type ClassValue, clsx } from "clsx";
|
|
323
|
+
import { twMerge } from "tailwind-merge";
|
|
324
|
+
|
|
325
|
+
export function cn(...inputs: ClassValue[]) {
|
|
326
|
+
return twMerge(clsx(inputs));
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### `frontend/src/lib/api.ts`
|
|
331
|
+
```typescript
|
|
332
|
+
const BASE_URL = "/api";
|
|
333
|
+
|
|
334
|
+
async function request<T>(path: string, options: RequestInit = {}): Promise<T> {
|
|
335
|
+
const res = await fetch(`${BASE_URL}${path}`, {
|
|
336
|
+
headers: { "Content-Type": "application/json", ...options.headers },
|
|
337
|
+
...options,
|
|
338
|
+
});
|
|
339
|
+
if (!res.ok) {
|
|
340
|
+
const error = await res.json().catch(() => ({ error: res.statusText }));
|
|
341
|
+
throw new Error(error.error || res.statusText);
|
|
342
|
+
}
|
|
343
|
+
return res.json();
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export const api = {
|
|
347
|
+
get: <T>(path: string) => request<T>(path),
|
|
348
|
+
post: <T>(path: string, body: unknown) => request<T>(path, { method: "POST", body: JSON.stringify(body) }),
|
|
349
|
+
put: <T>(path: string, body: unknown) => request<T>(path, { method: "PUT", body: JSON.stringify(body) }),
|
|
350
|
+
delete: <T>(path: string) => request<T>(path, { method: "DELETE" }),
|
|
351
|
+
};
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### `frontend/components.json` (shadcn/ui config)
|
|
355
|
+
```json
|
|
356
|
+
{
|
|
357
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
358
|
+
"style": "new-york",
|
|
359
|
+
"rsc": false,
|
|
360
|
+
"tsx": true,
|
|
361
|
+
"tailwind": {
|
|
362
|
+
"config": "",
|
|
363
|
+
"css": "src/index.css",
|
|
364
|
+
"baseColor": "zinc",
|
|
365
|
+
"cssVariables": true
|
|
366
|
+
},
|
|
367
|
+
"aliases": {
|
|
368
|
+
"components": "@/components",
|
|
369
|
+
"utils": "@/lib/utils",
|
|
370
|
+
"ui": "@/components/ui",
|
|
371
|
+
"lib": "@/lib",
|
|
372
|
+
"hooks": "@/hooks"
|
|
373
|
+
},
|
|
374
|
+
"iconLibrary": "lucide"
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### `frontend/index.html`
|
|
379
|
+
```html
|
|
380
|
+
<!doctype html>
|
|
381
|
+
<html lang="en">
|
|
382
|
+
<head>
|
|
383
|
+
<meta charset="UTF-8" />
|
|
384
|
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
385
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
386
|
+
<title>{APP_NAME}</title>
|
|
387
|
+
</head>
|
|
388
|
+
<body>
|
|
389
|
+
<div id="root"></div>
|
|
390
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
391
|
+
</body>
|
|
392
|
+
</html>
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Step 5: Install Dependencies
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
cd {PROJECT_DIR}/backend && npm install
|
|
399
|
+
cd {PROJECT_DIR}/frontend && npm install
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
Wait for both to complete. If either fails, retry once.
|
|
403
|
+
|
|
404
|
+
## Step 6: Initialize shadcn/ui (install base components)
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
cd {PROJECT_DIR}/frontend && npx shadcn@latest add button card input label --yes 2>/dev/null || true
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
This installs the base shadcn/ui components. More will be added during BUILD as needed.
|
|
411
|
+
|
|
412
|
+
## Step 7: Verify Scaffold
|
|
413
|
+
|
|
414
|
+
Run these checks:
|
|
415
|
+
```bash
|
|
416
|
+
test -f {PROJECT_DIR}/backend/node_modules/.package-lock.json && echo "backend: OK" || echo "backend: FAILED"
|
|
417
|
+
test -f {PROJECT_DIR}/frontend/node_modules/.package-lock.json && echo "frontend: OK" || echo "frontend: FAILED"
|
|
418
|
+
test -f {PROJECT_DIR}/backend/prisma/schema.prisma && echo "prisma: OK" || echo "prisma: SKIPPED"
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
All must pass before proceeding to BUILD phase.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai41_app_verify
|
|
3
|
+
description: >-
|
|
4
|
+
Build verification loop for full-stack apps. Runs prisma generate, backend tsc, frontend vite build. Auto-reads errors and fixes code. Called by ai41_app_orchestrator Phase 4.
|
|
5
|
+
allowed-tools: Bash Read Edit
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# App Verify
|
|
9
|
+
|
|
10
|
+
Run build verification in a loop. If anything fails, read the error, fix the code, and retry.
|
|
11
|
+
|
|
12
|
+
## Verification Order
|
|
13
|
+
|
|
14
|
+
Execute these steps IN ORDER. Each step must pass before moving to the next.
|
|
15
|
+
|
|
16
|
+
### Step 1: Prisma Generate (if database exists)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
cd {APP_DIR}/backend && npx prisma generate
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**If fails:**
|
|
23
|
+
- Read the error output
|
|
24
|
+
- Common fixes: missing model, invalid relation, syntax error in schema.prisma
|
|
25
|
+
- Fix `prisma/schema.prisma` using Edit tool
|
|
26
|
+
- Retry (max 5 times)
|
|
27
|
+
|
|
28
|
+
### Step 2: Prisma DB Push (if database exists)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
cd {APP_DIR}/backend && npx prisma db push --accept-data-loss 2>&1
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**If fails:**
|
|
35
|
+
- If "database does not exist" → create it: `createdb {APP_SLUG}` or adjust DATABASE_URL
|
|
36
|
+
- If schema conflict → the error usually says what's wrong, fix the schema
|
|
37
|
+
- If connection refused → database isn't running, report to user
|
|
38
|
+
- Retry (max 3 times)
|
|
39
|
+
|
|
40
|
+
**If no local PostgreSQL is available:** Skip this step. The database will be created on Railway during deploy. Use `npx prisma generate` only to ensure the Prisma client compiles.
|
|
41
|
+
|
|
42
|
+
### Step 3: Backend Build
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
cd {APP_DIR}/backend && npx tsc --noEmit 2>&1
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**If fails:**
|
|
49
|
+
- Read the FULL error output
|
|
50
|
+
- TypeScript errors typically include file path and line number
|
|
51
|
+
- Common issues:
|
|
52
|
+
- Missing imports → add the import
|
|
53
|
+
- Type mismatches → fix the type annotation
|
|
54
|
+
- Missing properties → add them to the interface or make optional
|
|
55
|
+
- Cannot find module → check the import path
|
|
56
|
+
- Fix using Edit tool on the specific file
|
|
57
|
+
- Retry (max 5 times)
|
|
58
|
+
|
|
59
|
+
**IMPORTANT:** Fix one error at a time from the top. TypeScript errors cascade — fixing the first often resolves 3-4 others.
|
|
60
|
+
|
|
61
|
+
### Step 4: Frontend Build
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
cd {APP_DIR}/frontend && npx tsc -b 2>&1
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Then:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cd {APP_DIR}/frontend && npx vite build 2>&1
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**If tsc fails:**
|
|
74
|
+
- Same approach as backend — read error, fix file, retry
|
|
75
|
+
- Common frontend-specific issues:
|
|
76
|
+
- Missing `"use client"` type issues → not relevant (this isn't Next.js)
|
|
77
|
+
- JSX type errors → ensure proper React types imported
|
|
78
|
+
- Component prop mismatches → fix the interface
|
|
79
|
+
- Retry (max 5 times)
|
|
80
|
+
|
|
81
|
+
**If vite build fails after tsc passes:**
|
|
82
|
+
- Usually a runtime import issue
|
|
83
|
+
- Read the error — it tells you the exact import that failed
|
|
84
|
+
- Fix the import path
|
|
85
|
+
- Retry (max 3 times)
|
|
86
|
+
|
|
87
|
+
### Step 5: Verification Complete
|
|
88
|
+
|
|
89
|
+
When all 4 steps pass clean:
|
|
90
|
+
1. Report: "All builds pass clean. Starting preview..."
|
|
91
|
+
2. Return to orchestrator for Phase 5 (Preview)
|
|
92
|
+
|
|
93
|
+
## Error Fix Strategy
|
|
94
|
+
|
|
95
|
+
When you encounter a TypeScript error:
|
|
96
|
+
|
|
97
|
+
1. **Read the full error** — don't guess from the first line
|
|
98
|
+
2. **Read the file** at the line number mentioned
|
|
99
|
+
3. **Understand the context** — is it a missing import, wrong type, or logic error?
|
|
100
|
+
4. **Make the minimal fix** — don't rewrite the file, just fix the specific issue
|
|
101
|
+
5. **Re-run the build** — verify the fix worked
|
|
102
|
+
|
|
103
|
+
Never:
|
|
104
|
+
- Delete a file to "fix" an error
|
|
105
|
+
- Comment out code to make errors go away
|
|
106
|
+
- Add `// @ts-ignore` or `as any` to suppress errors
|
|
107
|
+
- Rewrite large sections of code just because of one type error
|