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.
Files changed (315) hide show
  1. package/README.md +113 -0
  2. package/agents/_template/CLAUDE.md +18 -0
  3. package/agents/_template/agent.json +7 -0
  4. package/agents/platform/agentcreator/CLAUDE.md +300 -0
  5. package/agents/platform/appcreator/CLAUDE.md +158 -0
  6. package/agents/platform/gym/CLAUDE.md +486 -0
  7. package/agents/platform/gym/agent.json +40 -0
  8. package/agents/platform/gym/programs/agent-building/program.json +160 -0
  9. package/agents/platform/gym/programs/automations-mastery/program.json +129 -0
  10. package/agents/platform/gym/programs/getting-started/program.json +124 -0
  11. package/agents/platform/gym/programs/mcp-integrations/program.json +116 -0
  12. package/agents/platform/gym/programs/multi-model-strategy/program.json +115 -0
  13. package/agents/platform/gym/programs/prompt-engineering/program.json +136 -0
  14. package/agents/platform/gym/souls/alex.md +12 -0
  15. package/agents/platform/gym/souls/jordan.md +12 -0
  16. package/agents/platform/gym/souls/morgan.md +12 -0
  17. package/agents/platform/gym/souls/riley.md +12 -0
  18. package/agents/platform/gym/souls/sam.md +12 -0
  19. package/agents/platform/hub/CLAUDE.md +372 -0
  20. package/agents/platform/promptcreator/CLAUDE.md +130 -0
  21. package/agents/platform/skillcreator/CLAUDE.md +163 -0
  22. package/bin/cli.js +566 -0
  23. package/config.example.json +310 -0
  24. package/dist/agent-registry.d.ts +32 -0
  25. package/dist/agent-registry.d.ts.map +1 -0
  26. package/dist/agent-registry.js +144 -0
  27. package/dist/agent-registry.js.map +1 -0
  28. package/dist/channels/discord.d.ts +17 -0
  29. package/dist/channels/discord.d.ts.map +1 -0
  30. package/dist/channels/discord.js +114 -0
  31. package/dist/channels/discord.js.map +1 -0
  32. package/dist/channels/imessage.d.ts +23 -0
  33. package/dist/channels/imessage.d.ts.map +1 -0
  34. package/dist/channels/imessage.js +214 -0
  35. package/dist/channels/imessage.js.map +1 -0
  36. package/dist/channels/slack.d.ts +19 -0
  37. package/dist/channels/slack.d.ts.map +1 -0
  38. package/dist/channels/slack.js +167 -0
  39. package/dist/channels/slack.js.map +1 -0
  40. package/dist/channels/telegram.d.ts +19 -0
  41. package/dist/channels/telegram.d.ts.map +1 -0
  42. package/dist/channels/telegram.js +274 -0
  43. package/dist/channels/telegram.js.map +1 -0
  44. package/dist/channels/types.d.ts +44 -0
  45. package/dist/channels/types.d.ts.map +1 -0
  46. package/dist/channels/types.js +18 -0
  47. package/dist/channels/types.js.map +1 -0
  48. package/dist/channels/whatsapp.d.ts +23 -0
  49. package/dist/channels/whatsapp.d.ts.map +1 -0
  50. package/dist/channels/whatsapp.js +189 -0
  51. package/dist/channels/whatsapp.js.map +1 -0
  52. package/dist/config.d.ts +134 -0
  53. package/dist/config.d.ts.map +1 -0
  54. package/dist/config.js +127 -0
  55. package/dist/config.js.map +1 -0
  56. package/dist/cron.d.ts +8 -0
  57. package/dist/cron.d.ts.map +1 -0
  58. package/dist/cron.js +35 -0
  59. package/dist/cron.js.map +1 -0
  60. package/dist/decrypt-keys.d.ts +7 -0
  61. package/dist/decrypt-keys.d.ts.map +1 -0
  62. package/dist/decrypt-keys.js +53 -0
  63. package/dist/decrypt-keys.js.map +1 -0
  64. package/dist/encrypt-keys.d.ts +8 -0
  65. package/dist/encrypt-keys.d.ts.map +1 -0
  66. package/dist/encrypt-keys.js +62 -0
  67. package/dist/encrypt-keys.js.map +1 -0
  68. package/dist/executor.d.ts +31 -0
  69. package/dist/executor.d.ts.map +1 -0
  70. package/dist/executor.js +2009 -0
  71. package/dist/executor.js.map +1 -0
  72. package/dist/gemini-executor.d.ts +27 -0
  73. package/dist/gemini-executor.d.ts.map +1 -0
  74. package/dist/gemini-executor.js +160 -0
  75. package/dist/gemini-executor.js.map +1 -0
  76. package/dist/goals.d.ts +24 -0
  77. package/dist/goals.d.ts.map +1 -0
  78. package/dist/goals.js +189 -0
  79. package/dist/goals.js.map +1 -0
  80. package/dist/gym/activity-digest.d.ts +30 -0
  81. package/dist/gym/activity-digest.d.ts.map +1 -0
  82. package/dist/gym/activity-digest.js +506 -0
  83. package/dist/gym/activity-digest.js.map +1 -0
  84. package/dist/gym/dimension-scorer.d.ts +76 -0
  85. package/dist/gym/dimension-scorer.d.ts.map +1 -0
  86. package/dist/gym/dimension-scorer.js +236 -0
  87. package/dist/gym/dimension-scorer.js.map +1 -0
  88. package/dist/gym/gym-router.d.ts +7 -0
  89. package/dist/gym/gym-router.d.ts.map +1 -0
  90. package/dist/gym/gym-router.js +718 -0
  91. package/dist/gym/gym-router.js.map +1 -0
  92. package/dist/gym/index.d.ts +11 -0
  93. package/dist/gym/index.d.ts.map +1 -0
  94. package/dist/gym/index.js +11 -0
  95. package/dist/gym/index.js.map +1 -0
  96. package/dist/heartbeat.d.ts +21 -0
  97. package/dist/heartbeat.d.ts.map +1 -0
  98. package/dist/heartbeat.js +163 -0
  99. package/dist/heartbeat.js.map +1 -0
  100. package/dist/index.d.ts +2 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +254 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/keystore.d.ts +22 -0
  105. package/dist/keystore.d.ts.map +1 -0
  106. package/dist/keystore.js +178 -0
  107. package/dist/keystore.js.map +1 -0
  108. package/dist/logger.d.ts +9 -0
  109. package/dist/logger.d.ts.map +1 -0
  110. package/dist/logger.js +45 -0
  111. package/dist/logger.js.map +1 -0
  112. package/dist/memory/daily.d.ts +22 -0
  113. package/dist/memory/daily.d.ts.map +1 -0
  114. package/dist/memory/daily.js +82 -0
  115. package/dist/memory/daily.js.map +1 -0
  116. package/dist/memory/embeddings.d.ts +15 -0
  117. package/dist/memory/embeddings.d.ts.map +1 -0
  118. package/dist/memory/embeddings.js +154 -0
  119. package/dist/memory/embeddings.js.map +1 -0
  120. package/dist/memory/index.d.ts +32 -0
  121. package/dist/memory/index.d.ts.map +1 -0
  122. package/dist/memory/index.js +159 -0
  123. package/dist/memory/index.js.map +1 -0
  124. package/dist/memory/search.d.ts +21 -0
  125. package/dist/memory/search.d.ts.map +1 -0
  126. package/dist/memory/search.js +77 -0
  127. package/dist/memory/search.js.map +1 -0
  128. package/dist/memory/store.d.ts +23 -0
  129. package/dist/memory/store.d.ts.map +1 -0
  130. package/dist/memory/store.js +144 -0
  131. package/dist/memory/store.js.map +1 -0
  132. package/dist/ollama-executor.d.ts +17 -0
  133. package/dist/ollama-executor.d.ts.map +1 -0
  134. package/dist/ollama-executor.js +112 -0
  135. package/dist/ollama-executor.js.map +1 -0
  136. package/dist/openai-executor.d.ts +38 -0
  137. package/dist/openai-executor.d.ts.map +1 -0
  138. package/dist/openai-executor.js +197 -0
  139. package/dist/openai-executor.js.map +1 -0
  140. package/dist/router.d.ts +11 -0
  141. package/dist/router.d.ts.map +1 -0
  142. package/dist/router.js +185 -0
  143. package/dist/router.js.map +1 -0
  144. package/dist/test-message.d.ts +2 -0
  145. package/dist/test-message.d.ts.map +1 -0
  146. package/dist/test-message.js +60 -0
  147. package/dist/test-message.js.map +1 -0
  148. package/dist/utils/imsg-db-reader.d.ts +24 -0
  149. package/dist/utils/imsg-db-reader.d.ts.map +1 -0
  150. package/dist/utils/imsg-db-reader.js +92 -0
  151. package/dist/utils/imsg-db-reader.js.map +1 -0
  152. package/dist/utils/imsg-rpc.d.ts +25 -0
  153. package/dist/utils/imsg-rpc.d.ts.map +1 -0
  154. package/dist/utils/imsg-rpc.js +149 -0
  155. package/dist/utils/imsg-rpc.js.map +1 -0
  156. package/dist/utils/message-formatter.d.ts +3 -0
  157. package/dist/utils/message-formatter.d.ts.map +1 -0
  158. package/dist/utils/message-formatter.js +69 -0
  159. package/dist/utils/message-formatter.js.map +1 -0
  160. package/dist/web-ui.d.ts +12 -0
  161. package/dist/web-ui.d.ts.map +1 -0
  162. package/dist/web-ui.js +5784 -0
  163. package/dist/web-ui.js.map +1 -0
  164. package/dist/whatsapp-chats.d.ts +2 -0
  165. package/dist/whatsapp-chats.d.ts.map +1 -0
  166. package/dist/whatsapp-chats.js +76 -0
  167. package/dist/whatsapp-chats.js.map +1 -0
  168. package/dist/whatsapp-login.d.ts +2 -0
  169. package/dist/whatsapp-login.d.ts.map +1 -0
  170. package/dist/whatsapp-login.js +90 -0
  171. package/dist/whatsapp-login.js.map +1 -0
  172. package/dist/wiki-sync.d.ts +21 -0
  173. package/dist/wiki-sync.d.ts.map +1 -0
  174. package/dist/wiki-sync.js +147 -0
  175. package/dist/wiki-sync.js.map +1 -0
  176. package/docs/AddNewAgentGuide.md +100 -0
  177. package/docs/AddNewMcpGuide.md +72 -0
  178. package/docs/Architecture.md +795 -0
  179. package/docs/CLAUDE-AI-SETUP.md +166 -0
  180. package/docs/Setup.md +297 -0
  181. package/docs/ai-gym-architecture.md +1040 -0
  182. package/docs/ai-gym-build-plan.md +343 -0
  183. package/docs/ai-gym-onboarding.md +122 -0
  184. package/docs/appcreator_plan.md +348 -0
  185. package/docs/platform-mcp-audit.md +320 -0
  186. package/docs/server-deployment-plan.md +503 -0
  187. package/docs/superpowers/plans/2026-03-25-marketplace.md +1281 -0
  188. package/docs/superpowers/specs/2026-03-25-marketplace-design.md +287 -0
  189. package/docs/user-guide.md +2016 -0
  190. package/mcp-catalog.json +628 -0
  191. package/package.json +63 -0
  192. package/public/MyAIforOne-logomark-512.svg +16 -0
  193. package/public/MyAIforOne-logomark-transparent.svg +15 -0
  194. package/public/activity.html +314 -0
  195. package/public/admin.html +1674 -0
  196. package/public/agent-dashboard.html +670 -0
  197. package/public/api-docs.html +1106 -0
  198. package/public/automations.html +722 -0
  199. package/public/canvas.css +223 -0
  200. package/public/canvas.js +588 -0
  201. package/public/changelog.html +231 -0
  202. package/public/gym.html +2766 -0
  203. package/public/home.html +1930 -0
  204. package/public/index.html +2809 -0
  205. package/public/lab.html +1643 -0
  206. package/public/library.html +1442 -0
  207. package/public/marketplace.html +1101 -0
  208. package/public/mcp-docs.html +441 -0
  209. package/public/mini.html +390 -0
  210. package/public/monitor.html +584 -0
  211. package/public/org.html +4304 -0
  212. package/public/projects.html +734 -0
  213. package/public/settings.html +645 -0
  214. package/public/tasks.html +932 -0
  215. package/public/trainers/alex.svg +12 -0
  216. package/public/trainers/jordan.svg +12 -0
  217. package/public/trainers/morgan.svg +12 -0
  218. package/public/trainers/riley.svg +12 -0
  219. package/public/trainers/sam.svg +12 -0
  220. package/public/user-guide.html +218 -0
  221. package/registry/agents.json +3 -0
  222. package/registry/apps.json +20 -0
  223. package/registry/installed-drafts.json +3 -0
  224. package/registry/mcps.json +1084 -0
  225. package/registry/prompts/personal/mcp-test-prompt.md +6 -0
  226. package/registry/prompts/personal/memory-recall.md +6 -0
  227. package/registry/prompts/platform/brainstorm.md +15 -0
  228. package/registry/prompts/platform/code-review.md +16 -0
  229. package/registry/prompts/platform/explain.md +16 -0
  230. package/registry/prompts.json +58 -0
  231. package/registry/skills/external/brainstorming.md +5 -0
  232. package/registry/skills/external/code-review.md +40 -0
  233. package/registry/skills/external/frontend-patterns.md +642 -0
  234. package/registry/skills/external/frontend-slides.md +184 -0
  235. package/registry/skills/external/systematic-debugging.md +5 -0
  236. package/registry/skills/external/tdd.md +328 -0
  237. package/registry/skills/external/verification-before-completion.md +5 -0
  238. package/registry/skills/external/writing-plans.md +5 -0
  239. package/registry/skills/platform/ai41_app_build.md +930 -0
  240. package/registry/skills/platform/ai41_app_deploy.md +168 -0
  241. package/registry/skills/platform/ai41_app_orchestrator.md +239 -0
  242. package/registry/skills/platform/ai41_app_patterns.md +359 -0
  243. package/registry/skills/platform/ai41_app_register.md +85 -0
  244. package/registry/skills/platform/ai41_app_scaffold.md +421 -0
  245. package/registry/skills/platform/ai41_app_verify.md +107 -0
  246. package/registry/skills/platform/opProjectCreate.md +239 -0
  247. package/registry/skills/platform/op_devbrowser.md +136 -0
  248. package/registry/skills/platform/sop_brandguidelines.md +103 -0
  249. package/registry/skills/platform/sop_docx.md +117 -0
  250. package/registry/skills/platform/sop_frontenddesign.md +44 -0
  251. package/registry/skills/platform/sop_frontenddesign_v2.md +659 -0
  252. package/registry/skills/platform/sop_mcpbuilder.md +133 -0
  253. package/registry/skills/platform/sop_pdf.md +172 -0
  254. package/registry/skills/platform/sop_pptx.md +133 -0
  255. package/registry/skills/platform/sop_skillcreator.md +104 -0
  256. package/registry/skills/platform/sop_themefactory.md +128 -0
  257. package/registry/skills/platform/sop_webapptesting.md +75 -0
  258. package/registry/skills/platform/sop_webartifactsbuilder.md +97 -0
  259. package/registry/skills/platform/sop_xlsx.md +134 -0
  260. package/registry/skills.json +1055 -0
  261. package/scripts/discover-chats.sh +11 -0
  262. package/scripts/install-service-windows.ps1 +87 -0
  263. package/scripts/install-service.sh +52 -0
  264. package/scripts/seed-registry.ts +195 -0
  265. package/scripts/test-send.sh +5 -0
  266. package/scripts/tray-indicator.ps1 +35 -0
  267. package/scripts/uninstall-service-windows.ps1 +23 -0
  268. package/scripts/uninstall-service.sh +15 -0
  269. package/scripts/xbar-myagent.5s.sh +32 -0
  270. package/server/mcp-server/dist/index.d.ts +11 -0
  271. package/server/mcp-server/dist/index.js +1332 -0
  272. package/server/mcp-server/dist/lib/api-client.d.ts +165 -0
  273. package/server/mcp-server/dist/lib/api-client.js +241 -0
  274. package/server/mcp-server/index.ts +1545 -0
  275. package/server/mcp-server/lib/api-client.ts +366 -0
  276. package/server/mcp-server/tsconfig.json +14 -0
  277. package/src/agent-registry.ts +180 -0
  278. package/src/channels/discord.ts +129 -0
  279. package/src/channels/imessage.ts +261 -0
  280. package/src/channels/slack.ts +208 -0
  281. package/src/channels/telegram.ts +307 -0
  282. package/src/channels/types.ts +62 -0
  283. package/src/channels/whatsapp.ts +227 -0
  284. package/src/config.ts +281 -0
  285. package/src/cron.ts +43 -0
  286. package/src/decrypt-keys.ts +60 -0
  287. package/src/encrypt-keys.ts +70 -0
  288. package/src/executor.ts +2190 -0
  289. package/src/gemini-executor.ts +212 -0
  290. package/src/goals.ts +240 -0
  291. package/src/gym/activity-digest.ts +546 -0
  292. package/src/gym/dimension-scorer.ts +297 -0
  293. package/src/gym/gym-router.ts +801 -0
  294. package/src/gym/index.ts +19 -0
  295. package/src/heartbeat.ts +220 -0
  296. package/src/index.ts +275 -0
  297. package/src/keystore.ts +190 -0
  298. package/src/logger.ts +51 -0
  299. package/src/memory/daily.ts +101 -0
  300. package/src/memory/embeddings.ts +185 -0
  301. package/src/memory/index.ts +218 -0
  302. package/src/memory/search.ts +124 -0
  303. package/src/memory/store.ts +189 -0
  304. package/src/ollama-executor.ts +126 -0
  305. package/src/openai-executor.ts +259 -0
  306. package/src/router.ts +230 -0
  307. package/src/test-message.ts +72 -0
  308. package/src/utils/imsg-db-reader.ts +109 -0
  309. package/src/utils/imsg-rpc.ts +178 -0
  310. package/src/utils/message-formatter.ts +90 -0
  311. package/src/web-ui.ts +5778 -0
  312. package/src/whatsapp-chats.ts +91 -0
  313. package/src/whatsapp-login.ts +110 -0
  314. package/src/wiki-sync.ts +199 -0
  315. 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