@cloudgrid-io/mcp 0.13.0 → 0.15.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 (364) hide show
  1. package/package.json +1 -1
  2. package/src/corpus/capability-map.md +81 -7
  3. package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
  4. package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +226 -8
  5. package/src/corpus/templates/admin-dashboard/index.md +3 -0
  6. package/src/corpus/templates/ai-app/cloudgrid.yaml +225 -11
  7. package/src/corpus/templates/ai-app/index.md +3 -11
  8. package/src/corpus/templates/ai-knowledge-base/AGENTS.md +254 -0
  9. package/src/corpus/templates/ai-knowledge-base/README.md +28 -0
  10. package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +238 -0
  11. package/src/corpus/templates/ai-knowledge-base/index.md +81 -0
  12. package/src/corpus/templates/analytics-dashboard/README.md +85 -0
  13. package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +232 -0
  14. package/src/corpus/templates/analytics-dashboard/index.md +316 -0
  15. package/src/corpus/templates/analytics-dashboard/services/web/app/api/events/route.js +60 -0
  16. package/src/corpus/templates/analytics-dashboard/services/web/app/event-form.js +100 -0
  17. package/src/corpus/templates/analytics-dashboard/services/web/app/layout.js +41 -0
  18. package/src/corpus/templates/analytics-dashboard/services/web/app/page.js +54 -0
  19. package/src/corpus/templates/analytics-dashboard/services/web/lib/db.js +32 -0
  20. package/src/corpus/templates/analytics-dashboard/services/web/package.json +16 -0
  21. package/src/corpus/templates/api-dashboard/README.md +84 -0
  22. package/src/corpus/templates/api-dashboard/cloudgrid.yaml +233 -0
  23. package/src/corpus/templates/api-dashboard/index.md +310 -0
  24. package/src/corpus/templates/api-dashboard/services/web/app/api/requests/route.js +62 -0
  25. package/src/corpus/templates/api-dashboard/services/web/app/dashboard.js +156 -0
  26. package/src/corpus/templates/api-dashboard/services/web/app/layout.js +42 -0
  27. package/src/corpus/templates/api-dashboard/services/web/app/page.js +39 -0
  28. package/src/corpus/templates/api-dashboard/services/web/lib/db.js +32 -0
  29. package/src/corpus/templates/api-dashboard/services/web/package.json +16 -0
  30. package/src/corpus/templates/api-docs/cloudgrid.yaml +222 -4
  31. package/src/corpus/templates/api-docs/index.md +3 -5
  32. package/src/corpus/templates/api-service/cloudgrid.yaml +224 -9
  33. package/src/corpus/templates/api-service/index.md +3 -11
  34. package/src/corpus/templates/app-with-data/cloudgrid.yaml +226 -8
  35. package/src/corpus/templates/app-with-data/index.md +3 -8
  36. package/src/corpus/templates/appointment-booking/AGENTS.md +223 -0
  37. package/src/corpus/templates/appointment-booking/README.md +16 -0
  38. package/src/corpus/templates/appointment-booking/cloudgrid.yaml +250 -0
  39. package/src/corpus/templates/appointment-booking/index.md +72 -0
  40. package/src/corpus/templates/approval-workflow/AGENTS.md +170 -0
  41. package/src/corpus/templates/approval-workflow/README.md +12 -0
  42. package/src/corpus/templates/approval-workflow/cloudgrid.yaml +237 -0
  43. package/src/corpus/templates/approval-workflow/index.md +58 -0
  44. package/src/corpus/templates/billing-dashboard/AGENTS.md +199 -0
  45. package/src/corpus/templates/billing-dashboard/README.md +18 -0
  46. package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +235 -0
  47. package/src/corpus/templates/billing-dashboard/index.md +87 -0
  48. package/src/corpus/templates/blog-cms/README.md +94 -0
  49. package/src/corpus/templates/blog-cms/cloudgrid.yaml +233 -0
  50. package/src/corpus/templates/blog-cms/index.md +358 -0
  51. package/src/corpus/templates/blog-cms/services/web/app/admin/admin-editor.js +133 -0
  52. package/src/corpus/templates/blog-cms/services/web/app/admin/page.js +33 -0
  53. package/src/corpus/templates/blog-cms/services/web/app/api/posts/route.js +84 -0
  54. package/src/corpus/templates/blog-cms/services/web/app/layout.js +47 -0
  55. package/src/corpus/templates/blog-cms/services/web/app/page.js +56 -0
  56. package/src/corpus/templates/blog-cms/services/web/app/posts/[slug]/page.js +45 -0
  57. package/src/corpus/templates/blog-cms/services/web/lib/db.js +32 -0
  58. package/src/corpus/templates/blog-cms/services/web/package.json +16 -0
  59. package/src/corpus/templates/booking-system/AGENTS.md +189 -0
  60. package/src/corpus/templates/booking-system/README.md +17 -0
  61. package/src/corpus/templates/booking-system/cloudgrid.yaml +248 -0
  62. package/src/corpus/templates/booking-system/index.md +86 -0
  63. package/src/corpus/templates/calendar-scheduler/AGENTS.md +226 -0
  64. package/src/corpus/templates/calendar-scheduler/README.md +25 -0
  65. package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +259 -0
  66. package/src/corpus/templates/calendar-scheduler/index.md +85 -0
  67. package/src/corpus/templates/changelog/cloudgrid.yaml +222 -4
  68. package/src/corpus/templates/changelog/index.md +3 -5
  69. package/src/corpus/templates/company-website/README.md +54 -0
  70. package/src/corpus/templates/company-website/cloudgrid.yaml +233 -0
  71. package/src/corpus/templates/company-website/index.html +309 -0
  72. package/src/corpus/templates/company-website/index.md +29 -0
  73. package/src/corpus/templates/course-platform/AGENTS.md +161 -0
  74. package/src/corpus/templates/course-platform/README.md +26 -0
  75. package/src/corpus/templates/course-platform/cloudgrid.yaml +237 -0
  76. package/src/corpus/templates/course-platform/index.md +70 -0
  77. package/src/corpus/templates/crm/cloudgrid.yaml +226 -8
  78. package/src/corpus/templates/crm/index.md +3 -0
  79. package/src/corpus/templates/dashboard/cloudgrid.yaml +228 -4
  80. package/src/corpus/templates/dashboard/index.md +3 -5
  81. package/src/corpus/templates/deck/cloudgrid.yaml +228 -4
  82. package/src/corpus/templates/deck/index.md +3 -5
  83. package/src/corpus/templates/directory/README.md +75 -0
  84. package/src/corpus/templates/directory/cloudgrid.yaml +233 -0
  85. package/src/corpus/templates/directory/index.md +334 -0
  86. package/src/corpus/templates/directory/services/web/app/api/entries/route.js +63 -0
  87. package/src/corpus/templates/directory/services/web/app/directory-list.js +146 -0
  88. package/src/corpus/templates/directory/services/web/app/layout.js +44 -0
  89. package/src/corpus/templates/directory/services/web/app/page.js +38 -0
  90. package/src/corpus/templates/directory/services/web/lib/db.js +32 -0
  91. package/src/corpus/templates/directory/services/web/package.json +16 -0
  92. package/src/corpus/templates/docs-site/cloudgrid.yaml +222 -4
  93. package/src/corpus/templates/docs-site/index.md +3 -5
  94. package/src/corpus/templates/erp/AGENTS.md +116 -0
  95. package/src/corpus/templates/erp/README.md +17 -0
  96. package/src/corpus/templates/erp/cloudgrid.yaml +235 -0
  97. package/src/corpus/templates/erp/index.md +81 -0
  98. package/src/corpus/templates/event-board/README.md +74 -0
  99. package/src/corpus/templates/event-board/cloudgrid.yaml +233 -0
  100. package/src/corpus/templates/event-board/index.md +299 -0
  101. package/src/corpus/templates/event-board/services/web/app/api/events/route.js +61 -0
  102. package/src/corpus/templates/event-board/services/web/app/event-form.js +118 -0
  103. package/src/corpus/templates/event-board/services/web/app/layout.js +39 -0
  104. package/src/corpus/templates/event-board/services/web/app/page.js +34 -0
  105. package/src/corpus/templates/event-board/services/web/lib/db.js +32 -0
  106. package/src/corpus/templates/event-board/services/web/package.json +16 -0
  107. package/src/corpus/templates/expense-tracker/README.md +76 -0
  108. package/src/corpus/templates/expense-tracker/cloudgrid.yaml +233 -0
  109. package/src/corpus/templates/expense-tracker/index.md +305 -0
  110. package/src/corpus/templates/expense-tracker/services/web/app/api/expenses/route.js +61 -0
  111. package/src/corpus/templates/expense-tracker/services/web/app/expense-form.js +145 -0
  112. package/src/corpus/templates/expense-tracker/services/web/app/layout.js +42 -0
  113. package/src/corpus/templates/expense-tracker/services/web/app/page.js +34 -0
  114. package/src/corpus/templates/expense-tracker/services/web/lib/db.js +32 -0
  115. package/src/corpus/templates/expense-tracker/services/web/package.json +16 -0
  116. package/src/corpus/templates/feature-request-board/README.md +87 -0
  117. package/src/corpus/templates/feature-request-board/cloudgrid.yaml +233 -0
  118. package/src/corpus/templates/feature-request-board/index.md +317 -0
  119. package/src/corpus/templates/feature-request-board/services/web/app/api/requests/route.js +92 -0
  120. package/src/corpus/templates/feature-request-board/services/web/app/board.js +91 -0
  121. package/src/corpus/templates/feature-request-board/services/web/app/layout.js +43 -0
  122. package/src/corpus/templates/feature-request-board/services/web/app/page.js +35 -0
  123. package/src/corpus/templates/feature-request-board/services/web/lib/db.js +32 -0
  124. package/src/corpus/templates/feature-request-board/services/web/package.json +16 -0
  125. package/src/corpus/templates/financial-dashboard/README.md +80 -0
  126. package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +233 -0
  127. package/src/corpus/templates/financial-dashboard/index.md +326 -0
  128. package/src/corpus/templates/financial-dashboard/services/web/app/api/entries/route.js +63 -0
  129. package/src/corpus/templates/financial-dashboard/services/web/app/entry-board.js +130 -0
  130. package/src/corpus/templates/financial-dashboard/services/web/app/layout.js +46 -0
  131. package/src/corpus/templates/financial-dashboard/services/web/app/page.js +31 -0
  132. package/src/corpus/templates/financial-dashboard/services/web/lib/db.js +32 -0
  133. package/src/corpus/templates/financial-dashboard/services/web/package.json +16 -0
  134. package/src/corpus/templates/forum/AGENTS.md +196 -0
  135. package/src/corpus/templates/forum/README.md +12 -0
  136. package/src/corpus/templates/forum/cloudgrid.yaml +237 -0
  137. package/src/corpus/templates/forum/index.md +66 -0
  138. package/src/corpus/templates/hr-portal/AGENTS.md +174 -0
  139. package/src/corpus/templates/hr-portal/README.md +14 -0
  140. package/src/corpus/templates/hr-portal/cloudgrid.yaml +237 -0
  141. package/src/corpus/templates/hr-portal/index.md +56 -0
  142. package/src/corpus/templates/internal-tools-portal/AGENTS.md +201 -0
  143. package/src/corpus/templates/internal-tools-portal/README.md +17 -0
  144. package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +237 -0
  145. package/src/corpus/templates/internal-tools-portal/index.md +62 -0
  146. package/src/corpus/templates/inventory/README.md +71 -0
  147. package/src/corpus/templates/inventory/cloudgrid.yaml +233 -0
  148. package/src/corpus/templates/inventory/index.md +68 -0
  149. package/src/corpus/templates/inventory/services/web/app/api/items/route.js +88 -0
  150. package/src/corpus/templates/inventory/services/web/app/inventory-manager.js +101 -0
  151. package/src/corpus/templates/inventory/services/web/app/layout.js +36 -0
  152. package/src/corpus/templates/inventory/services/web/app/page.js +37 -0
  153. package/src/corpus/templates/inventory/services/web/lib/db.js +32 -0
  154. package/src/corpus/templates/inventory/services/web/package.json +16 -0
  155. package/src/corpus/templates/invoice/README.md +71 -0
  156. package/src/corpus/templates/invoice/cloudgrid.yaml +233 -0
  157. package/src/corpus/templates/invoice/index.md +68 -0
  158. package/src/corpus/templates/invoice/services/web/app/api/invoices/route.js +82 -0
  159. package/src/corpus/templates/invoice/services/web/app/invoice-manager.js +101 -0
  160. package/src/corpus/templates/invoice/services/web/app/layout.js +35 -0
  161. package/src/corpus/templates/invoice/services/web/app/page.js +34 -0
  162. package/src/corpus/templates/invoice/services/web/lib/db.js +32 -0
  163. package/src/corpus/templates/invoice/services/web/package.json +16 -0
  164. package/src/corpus/templates/job-board/README.md +71 -0
  165. package/src/corpus/templates/job-board/cloudgrid.yaml +233 -0
  166. package/src/corpus/templates/job-board/index.md +68 -0
  167. package/src/corpus/templates/job-board/services/web/app/api/jobs/route.js +66 -0
  168. package/src/corpus/templates/job-board/services/web/app/job-board.js +73 -0
  169. package/src/corpus/templates/job-board/services/web/app/layout.js +35 -0
  170. package/src/corpus/templates/job-board/services/web/app/page.js +32 -0
  171. package/src/corpus/templates/job-board/services/web/lib/db.js +32 -0
  172. package/src/corpus/templates/job-board/services/web/package.json +16 -0
  173. package/src/corpus/templates/kanban/cloudgrid.yaml +226 -8
  174. package/src/corpus/templates/kanban/index.md +3 -0
  175. package/src/corpus/templates/landing-page/cloudgrid.yaml +228 -4
  176. package/src/corpus/templates/landing-page/index.md +3 -5
  177. package/src/corpus/templates/lms/AGENTS.md +193 -0
  178. package/src/corpus/templates/lms/README.md +27 -0
  179. package/src/corpus/templates/lms/cloudgrid.yaml +237 -0
  180. package/src/corpus/templates/lms/index.md +79 -0
  181. package/src/corpus/templates/marketplace/AGENTS.md +208 -0
  182. package/src/corpus/templates/marketplace/README.md +22 -0
  183. package/src/corpus/templates/marketplace/cloudgrid.yaml +233 -0
  184. package/src/corpus/templates/marketplace/index.md +76 -0
  185. package/src/corpus/templates/membership-site/AGENTS.md +160 -0
  186. package/src/corpus/templates/membership-site/README.md +18 -0
  187. package/src/corpus/templates/membership-site/cloudgrid.yaml +236 -0
  188. package/src/corpus/templates/membership-site/index.md +66 -0
  189. package/src/corpus/templates/monitoring-dashboard/README.md +84 -0
  190. package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +233 -0
  191. package/src/corpus/templates/monitoring-dashboard/index.md +328 -0
  192. package/src/corpus/templates/monitoring-dashboard/services/web/app/api/checks/route.js +76 -0
  193. package/src/corpus/templates/monitoring-dashboard/services/web/app/check-form.js +124 -0
  194. package/src/corpus/templates/monitoring-dashboard/services/web/app/layout.js +44 -0
  195. package/src/corpus/templates/monitoring-dashboard/services/web/app/page.js +49 -0
  196. package/src/corpus/templates/monitoring-dashboard/services/web/lib/db.js +32 -0
  197. package/src/corpus/templates/monitoring-dashboard/services/web/package.json +16 -0
  198. package/src/corpus/templates/online-store/AGENTS.md +153 -0
  199. package/src/corpus/templates/online-store/README.md +16 -0
  200. package/src/corpus/templates/online-store/cloudgrid.yaml +234 -0
  201. package/src/corpus/templates/online-store/index.md +81 -0
  202. package/src/corpus/templates/portfolio/cloudgrid.yaml +222 -4
  203. package/src/corpus/templates/portfolio/index.md +3 -5
  204. package/src/corpus/templates/product-catalog/README.md +74 -0
  205. package/src/corpus/templates/product-catalog/cloudgrid.yaml +232 -0
  206. package/src/corpus/templates/product-catalog/index.md +330 -0
  207. package/src/corpus/templates/product-catalog/services/web/app/api/products/route.js +69 -0
  208. package/src/corpus/templates/product-catalog/services/web/app/catalog.js +153 -0
  209. package/src/corpus/templates/product-catalog/services/web/app/layout.js +49 -0
  210. package/src/corpus/templates/product-catalog/services/web/app/page.js +36 -0
  211. package/src/corpus/templates/product-catalog/services/web/lib/db.js +32 -0
  212. package/src/corpus/templates/product-catalog/services/web/package.json +16 -0
  213. package/src/corpus/templates/product-launch/README.md +46 -0
  214. package/src/corpus/templates/product-launch/cloudgrid.yaml +234 -0
  215. package/src/corpus/templates/product-launch/index.html +320 -0
  216. package/src/corpus/templates/product-launch/index.md +34 -0
  217. package/src/corpus/templates/project-management/README.md +83 -0
  218. package/src/corpus/templates/project-management/cloudgrid.yaml +233 -0
  219. package/src/corpus/templates/project-management/index.md +346 -0
  220. package/src/corpus/templates/project-management/services/web/app/api/projects/route.js +48 -0
  221. package/src/corpus/templates/project-management/services/web/app/api/tasks/route.js +85 -0
  222. package/src/corpus/templates/project-management/services/web/app/board.js +182 -0
  223. package/src/corpus/templates/project-management/services/web/app/layout.js +45 -0
  224. package/src/corpus/templates/project-management/services/web/app/page.js +49 -0
  225. package/src/corpus/templates/project-management/services/web/lib/db.js +32 -0
  226. package/src/corpus/templates/project-management/services/web/package.json +16 -0
  227. package/src/corpus/templates/property-listings/README.md +76 -0
  228. package/src/corpus/templates/property-listings/cloudgrid.yaml +233 -0
  229. package/src/corpus/templates/property-listings/index.md +335 -0
  230. package/src/corpus/templates/property-listings/services/web/app/api/properties/route.js +73 -0
  231. package/src/corpus/templates/property-listings/services/web/app/layout.js +45 -0
  232. package/src/corpus/templates/property-listings/services/web/app/listings.js +152 -0
  233. package/src/corpus/templates/property-listings/services/web/app/page.js +53 -0
  234. package/src/corpus/templates/property-listings/services/web/lib/db.js +32 -0
  235. package/src/corpus/templates/property-listings/services/web/package.json +16 -0
  236. package/src/corpus/templates/quiz-platform/README.md +84 -0
  237. package/src/corpus/templates/quiz-platform/cloudgrid.yaml +233 -0
  238. package/src/corpus/templates/quiz-platform/index.md +313 -0
  239. package/src/corpus/templates/quiz-platform/services/web/app/api/questions/route.js +69 -0
  240. package/src/corpus/templates/quiz-platform/services/web/app/layout.js +47 -0
  241. package/src/corpus/templates/quiz-platform/services/web/app/page.js +37 -0
  242. package/src/corpus/templates/quiz-platform/services/web/app/quiz.js +188 -0
  243. package/src/corpus/templates/quiz-platform/services/web/lib/db.js +32 -0
  244. package/src/corpus/templates/quiz-platform/services/web/package.json +16 -0
  245. package/src/corpus/templates/report/cloudgrid.yaml +228 -4
  246. package/src/corpus/templates/report/index.md +3 -5
  247. package/src/corpus/templates/restaurant-reservations/AGENTS.md +258 -0
  248. package/src/corpus/templates/restaurant-reservations/README.md +17 -0
  249. package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +258 -0
  250. package/src/corpus/templates/restaurant-reservations/index.md +62 -0
  251. package/src/corpus/templates/revenue-dashboard/README.md +75 -0
  252. package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +233 -0
  253. package/src/corpus/templates/revenue-dashboard/index.md +307 -0
  254. package/src/corpus/templates/revenue-dashboard/services/web/app/api/sales/route.js +60 -0
  255. package/src/corpus/templates/revenue-dashboard/services/web/app/layout.js +40 -0
  256. package/src/corpus/templates/revenue-dashboard/services/web/app/page.js +87 -0
  257. package/src/corpus/templates/revenue-dashboard/services/web/app/sale-form.js +63 -0
  258. package/src/corpus/templates/revenue-dashboard/services/web/lib/db.js +32 -0
  259. package/src/corpus/templates/revenue-dashboard/services/web/package.json +16 -0
  260. package/src/corpus/templates/saas-marketing/cloudgrid.yaml +222 -4
  261. package/src/corpus/templates/saas-marketing/index.md +3 -5
  262. package/src/corpus/templates/semantic-search/AGENTS.md +192 -0
  263. package/src/corpus/templates/semantic-search/README.md +74 -0
  264. package/src/corpus/templates/semantic-search/cloudgrid.yaml +217 -0
  265. package/src/corpus/templates/semantic-search/index.md +97 -0
  266. package/src/corpus/templates/semantic-search/services/backend/requirements.txt +7 -0
  267. package/src/corpus/templates/semantic-search/services/backend/src/app/__init__.py +0 -0
  268. package/src/corpus/templates/semantic-search/services/backend/src/app/answer.py +90 -0
  269. package/src/corpus/templates/semantic-search/services/backend/src/app/auth.py +65 -0
  270. package/src/corpus/templates/semantic-search/services/backend/src/app/config.py +110 -0
  271. package/src/corpus/templates/semantic-search/services/backend/src/app/db.py +89 -0
  272. package/src/corpus/templates/semantic-search/services/backend/src/app/embeddings.py +44 -0
  273. package/src/corpus/templates/semantic-search/services/backend/src/app/indexing.py +222 -0
  274. package/src/corpus/templates/semantic-search/services/backend/src/app/main.py +259 -0
  275. package/src/corpus/templates/semantic-search/services/backend/src/app/search.py +222 -0
  276. package/src/corpus/templates/semantic-search/services/backend/src/app/source.py +259 -0
  277. package/src/corpus/templates/semantic-search/services/backend/src/main.py +12 -0
  278. package/src/corpus/templates/semantic-search/services/web/index.html +12 -0
  279. package/src/corpus/templates/semantic-search/services/web/package-lock.json +1680 -0
  280. package/src/corpus/templates/semantic-search/services/web/package.json +19 -0
  281. package/src/corpus/templates/semantic-search/services/web/src/App.jsx +55 -0
  282. package/src/corpus/templates/semantic-search/services/web/src/api.js +125 -0
  283. package/src/corpus/templates/semantic-search/services/web/src/components/Dashboard.jsx +61 -0
  284. package/src/corpus/templates/semantic-search/services/web/src/components/ManagerLogin.jsx +39 -0
  285. package/src/corpus/templates/semantic-search/services/web/src/components/SearchView.jsx +166 -0
  286. package/src/corpus/templates/semantic-search/services/web/src/components/Settings.jsx +148 -0
  287. package/src/corpus/templates/semantic-search/services/web/src/main.jsx +10 -0
  288. package/src/corpus/templates/semantic-search/services/web/src/styles.css +78 -0
  289. package/src/corpus/templates/semantic-search/services/web/vite.config.js +10 -0
  290. package/src/corpus/templates/status-page/cloudgrid.yaml +222 -4
  291. package/src/corpus/templates/status-page/index.md +3 -5
  292. package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
  293. package/src/corpus/templates/subscription-management/README.md +21 -0
  294. package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
  295. package/src/corpus/templates/subscription-management/index.md +73 -0
  296. package/src/corpus/templates/task-manager/cloudgrid.yaml +226 -8
  297. package/src/corpus/templates/task-manager/index.md +3 -0
  298. package/src/corpus/templates/ticket-system/README.md +71 -0
  299. package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
  300. package/src/corpus/templates/ticket-system/index.md +68 -0
  301. package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
  302. package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
  303. package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
  304. package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
  305. package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
  306. package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
  307. package/src/corpus/templates/time-tracking/README.md +81 -0
  308. package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
  309. package/src/corpus/templates/time-tracking/index.md +298 -0
  310. package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
  311. package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
  312. package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
  313. package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
  314. package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
  315. package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
  316. package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
  317. package/src/corpus/templates/travel-booking/README.md +17 -0
  318. package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
  319. package/src/corpus/templates/travel-booking/index.md +88 -0
  320. package/src/corpus/templates/waitlist/cloudgrid.yaml +222 -4
  321. package/src/corpus/templates/waitlist/index.md +3 -5
  322. package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
  323. package/src/corpus/templates/web-app/index.md +3 -5
  324. package/src/corpus/workflows/ai-knowledge-base.md +137 -0
  325. package/src/corpus/workflows/analytics-dashboard.md +104 -0
  326. package/src/corpus/workflows/api-dashboard.md +102 -0
  327. package/src/corpus/workflows/appointment-booking.md +143 -0
  328. package/src/corpus/workflows/approval-workflow.md +124 -0
  329. package/src/corpus/workflows/billing-dashboard.md +120 -0
  330. package/src/corpus/workflows/blog-cms.md +104 -0
  331. package/src/corpus/workflows/booking-system.md +116 -0
  332. package/src/corpus/workflows/calendar-scheduler.md +134 -0
  333. package/src/corpus/workflows/company-website.md +46 -0
  334. package/src/corpus/workflows/course-platform.md +126 -0
  335. package/src/corpus/workflows/directory.md +101 -0
  336. package/src/corpus/workflows/erp.md +125 -0
  337. package/src/corpus/workflows/event-board.md +102 -0
  338. package/src/corpus/workflows/expense-tracker.md +102 -0
  339. package/src/corpus/workflows/feature-request-board.md +105 -0
  340. package/src/corpus/workflows/financial-dashboard.md +103 -0
  341. package/src/corpus/workflows/forum.md +128 -0
  342. package/src/corpus/workflows/hr-portal.md +115 -0
  343. package/src/corpus/workflows/internal-tools-portal.md +125 -0
  344. package/src/corpus/workflows/inventory.md +101 -0
  345. package/src/corpus/workflows/invoice.md +101 -0
  346. package/src/corpus/workflows/job-board.md +101 -0
  347. package/src/corpus/workflows/lms.md +113 -0
  348. package/src/corpus/workflows/marketplace.md +123 -0
  349. package/src/corpus/workflows/membership-site.md +128 -0
  350. package/src/corpus/workflows/monitoring-dashboard.md +104 -0
  351. package/src/corpus/workflows/online-store.md +114 -0
  352. package/src/corpus/workflows/product-catalog.md +105 -0
  353. package/src/corpus/workflows/product-launch.md +43 -0
  354. package/src/corpus/workflows/project-management.md +106 -0
  355. package/src/corpus/workflows/property-listings.md +101 -0
  356. package/src/corpus/workflows/quiz-platform.md +105 -0
  357. package/src/corpus/workflows/restaurant-reservations.md +123 -0
  358. package/src/corpus/workflows/revenue-dashboard.md +102 -0
  359. package/src/corpus/workflows/semantic-search.md +133 -0
  360. package/src/corpus/workflows/subscription-management.md +141 -0
  361. package/src/corpus/workflows/ticket-system.md +101 -0
  362. package/src/corpus/workflows/time-tracking.md +104 -0
  363. package/src/corpus/workflows/travel-booking.md +115 -0
  364. package/src/tools.js +73 -12
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "quiz-platform",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "start": "next start"
9
+ },
10
+ "dependencies": {
11
+ "next": "^15.1.0",
12
+ "react": "^19.0.0",
13
+ "react-dom": "^19.0.0",
14
+ "mongodb": "^6.12.0"
15
+ }
16
+ }
@@ -1,10 +1,234 @@
1
- # static — deploys as an inspiration (instant, works on hosted) via gridctl_drop;
2
- # this yaml is only for plugging it as an OWNED static runtime (async, local
3
- # edition only). To publish the page, prefer gridctl_drop, not grid plug.
1
+ # ============================================================================
2
+ # cloudgrid.yaml — Complete Example
3
+ # ============================================================================
4
4
  #
5
- # needs: {} # none — static, no infrastructure
5
+ # This file shows EVERY field the platform supports, with comments explaining
6
+ # each one. It is a reference — no real project would use all of these at once.
7
+ #
8
+ # STANDARD: every CloudGrid template ships its cloudgrid.yaml in THIS full form.
9
+ # Uncomment ONLY the fields the archetype needs (always: name + services; plus
10
+ # needs: for runtime apps). Leave everything else commented. Comments are
11
+ # ignored by the parser, so the file deploys to exactly the active fields.
12
+ #
13
+ # Only two fields are required: name and services. Everything else is optional.
14
+ # Full docs: docs/cloudgrid-yaml-reference.md
15
+ #
16
+ # THIS TEMPLATE (report): a single self-contained static page. The active fields
17
+ # are exactly name + services.web{type: static, path: /}; there are no needs.
18
+ # This cloudgrid.yaml is the reference for plugging it as an OWNED static
19
+ # runtime; the fast path is to deploy it as an INSPIRATION via gridctl_drop
20
+ # (instant, and works on the hosted edition too).
21
+ # ============================================================================
22
+
23
+
24
+ # ─── IDENTITY ───────────────────────────────────────────────────────────────
25
+
26
+ # Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
27
+ # Must start and end with a letter or digit.
28
+ # Becomes part of your public URL: <name>-<4hex>.<org>.cloudgrid.io
6
29
  name: report
30
+
31
+ # One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
32
+ # description: Order processing API for the e-commerce platform
33
+
34
+ # Single emoji or short text shown as the entity icon. Max 64 chars.
35
+ # icon: "📦"
36
+
37
+ # Entity type: 'app' (default) or 'agent'. An agent is an app with an agent: block.
38
+ # kind: app
39
+
40
+
41
+ # ─── NETWORKING ─────────────────────────────────────────────────────────────
42
+
43
+ # Whether this entity serves public HTTP traffic.
44
+ # true = public URL + Ingress (default). false = internal only.
45
+ # expose: true
46
+
47
+ # Additional domain names this entity serves on (the platform URL is always active).
48
+ # custom_domains:
49
+ # - orders.example.com
50
+ # - shop.example.com
51
+
52
+
53
+ # ─── HEALTH PROBE (entity-level override) ──────────────────────────────────
54
+
55
+ # Override the default health check for the entire entity.
56
+ # probe:
57
+ # path: /healthz # HTTP path to probe (default: /).
58
+ # expected: "<500" # '<500' (default), '200', '2xx'.
59
+
60
+
61
+ # ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
62
+
63
+ # Slack notification to the org's default channel on deploy failure.
64
+ # true = notify (default), false = silent.
65
+ # notify: true
66
+
67
+
68
+ # ─── SCALING ────────────────────────────────────────────────────────────────
69
+
70
+ # Replica scaling intent.
71
+ # 'auto' — platform decides from the grid tier (default).
72
+ # 'alert' — single-replica, emit a SPOF warning at plug time.
73
+ # 1-10 — explicit replica count, clamped to the grid max.
74
+ # scale: auto
75
+
76
+
77
+ # ─── INFRASTRUCTURE NEEDS ──────────────────────────────────────────────────
78
+ #
79
+ # Declare infrastructure; the platform provisions it and injects connection
80
+ # details as env vars. Nine needs: database, cache, kv, queue, pubsub, vector,
81
+ # object_storage, disk, ai. Simplest form is `true`.
82
+ #
83
+ # needs:
84
+ # # database — MongoDB. Injects DATABASE_MONGODB_URL (+ legacy MONGODB_URL).
85
+ # # true | pool | dedicated | { tier: external, secret: MY_DB }
86
+ # database: true
87
+ # # cache — Redis, LRU eviction (derived data). Injects CACHE_REDIS_URL (+ REDIS_URL).
88
+ # # true | redis | { engine: external, secret: MY_REDIS_URL }
89
+ # cache: true
90
+ # # kv — Redis, no eviction (durable: flags, idempotency). Injects KV_REDIS_URL.
91
+ # kv: true
92
+ # # queue — Redis job-queue substrate (BullMQ). Injects QUEUE_REDIS_URL.
93
+ # queue: true
94
+ # # pubsub — Redis broadcast pub/sub. Injects PUBSUB_REDIS_URL.
95
+ # pubsub: true
96
+ # # vector — pgvector on Postgres. Injects VECTOR_PGVECTOR_URL (+ PGVECTOR_URL).
97
+ # # true | pgvector | { engine: pgvector, dim: 1536 }
98
+ # vector: pgvector
99
+ # # object_storage — GCS bucket. Injects OBJECT_STORAGE_GCS_BUCKET, _GCS_REGION.
100
+ # # true | { size: 10Gi }
101
+ # object_storage: true
102
+ # # disk — persistent FS mount (PVC). Injects DISK_PATH. Pins to 1 replica.
103
+ # # true | { size: 1Gi, mount: /var/data } (forbidden: /proc /sys /dev)
104
+ # disk: true
105
+ # # ai — AI Gateway via @cloudgrid-io/ai. Injects AI_GATEWAY_URL. true | false.
106
+ # ai: true
107
+
108
+
109
+ # ─── INTER-ENTITY COMMUNICATION ────────────────────────────────────────────
110
+
111
+ # Entities this app calls (outbound). Service-account token injected per pair.
112
+ # calls:
113
+ # - org:atomic/billing-api
114
+
115
+ # Inbound caller policy — who can call YOUR entity.
116
+ # callers:
117
+ # policy: auto # 'auto' | 'manual' (default).
118
+ # scope: org # 'org' (default) | 'space' | 'explicit'.
119
+ # fallback: deny # 'deny' (default) | 'warn'.
120
+ # # allowed_apps: # required only when scope: explicit
121
+ # # - org:atomic/frontend
122
+
123
+
124
+ # ─── VAULT ──────────────────────────────────────────────────────────────────
125
+
126
+ # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
127
+ # vault:
128
+ # STRIPE_KEY: stripe-live-key
129
+ # SENDGRID_API_KEY: sendgrid-key
130
+
131
+
132
+ # ─── CONNECTORS AND HOOKS ──────────────────────────────────────────────────
133
+
134
+ # connectors:
135
+ # - id: team-slack
136
+ # target: org # 'system' | 'org'.
137
+ # channel: "#deploys"
138
+ # hooks:
139
+ # - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
140
+ # via: team-slack
141
+ # template: "Deploy failed for {entity_name}: {error}"
142
+ # channel: "#alerts"
143
+ # triggers:
144
+ # - from: team-slack
145
+ # event: message
146
+ # channel: "#support"
147
+ # route: /webhooks/slack
148
+
149
+
150
+ # ─── LOCAL DEVELOPMENT ──────────────────────────────────────────────────────
151
+
152
+ # Config for `grid dev`. Redact fields in dev data snapshots.
153
+ # dev:
154
+ # snapshot:
155
+ # mask:
156
+ # - users.email
157
+ # - users.phone
158
+
159
+
160
+ # ─── AGENT METADATA ────────────────────────────────────────────────────────
161
+
162
+ # An agent is an app with kind: agent (above) and an agent: block.
163
+ # agent:
164
+ # purpose: Sync customer data from external CRM every night
165
+ # schedule: "0 2 * * *"
166
+ # trigger: webhook
167
+
168
+
169
+ # ─── PRIVATE RESOURCE AUTO-DEPENDENCIES ────────────────────────────────────
170
+
171
+ # When true (default), private resources are auto-injected as depends_on.
172
+ # auto_depends_on_private_requires: true
173
+
174
+
175
+ # ─── SERVICES (REQUIRED) ───────────────────────────────────────────────────
176
+ #
177
+ # At least one service is required. Key = service name (slug rules).
178
+ # Types: node, nextjs, python, static, cron.
179
+ #
7
180
  services:
8
181
  web:
182
+ # type (REQUIRED): node | nextjs | python | static | cron
9
183
  type: static
184
+ # HTTP route: '/' | '/api' | false (internal) | omitted (=false + warning).
185
+ # Only one service per entity can claim '/'.
10
186
  path: /
187
+ # Container port (default 8080; read process.env.PORT). Not for cron.
188
+ # port: 3000
189
+ # nextjs only: base_image: distroless (default) | alpine
190
+ # base_image: distroless
191
+ # node only: lang: javascript (default) | typescript
192
+ # lang: typescript
193
+ # Custom source location (default services/<name>/). '.' = project root.
194
+ # source:
195
+ # path: src/worker
196
+ # Health probe: false/omitted (TCP) | true (/health) | "/path" | {path,expected}
197
+ # health:
198
+ # path: /api/health
199
+ # expected: "200"
200
+ # Static runtime env vars (strings). Reserved: PORT, APP_NAME, SERVICE_NAME,
201
+ # NODE_ENV, MONGODB_URL, REDIS_URL, AI_GATEWAY_URL, N8N_WEBHOOK_URL, CLOUDGRID_*.
202
+ # env:
203
+ # LOG_LEVEL: info
204
+ # Sibling services/private resources that must be Ready first (no cron, no cycles).
205
+ # depends_on:
206
+ # - worker
207
+ # Per-service needs override (merges with app-level needs).
208
+ # needs:
209
+ # queue: true
210
+ # Static-only build step:
211
+ # build:
212
+ # command: npm run build
213
+ # output: dist
214
+ # env:
215
+ # VITE_API_URL: https://api.example.com
216
+ # node_version: "22" # static build step: '18'|'20'|'22'|'24' (quoted)
217
+ # Cron-only: schedule (REQUIRED), timezone (UTC|EST|PST), run (job | https URL)
218
+ # schedule: "0 9 * * 1"
219
+ # timezone: UTC
220
+ # run: job
221
+ # Verbose per-service persistence (prefer needs.disk):
222
+ # persist:
223
+ # - name: scratch
224
+ # path: /tmp/scratch
225
+ # size: 500Mi
226
+
227
+
228
+ # ============================================================================
229
+ # NOTES
230
+ # - NOT here: org:/entity_id: (→ .cloudgrid/link.json), secrets (→ grid secrets set),
231
+ # Dockerfile (platform generates from services.*.type).
232
+ # - Deploy: grid plug | Local with grid resources: grid dev
233
+ # - Full reference: docs/cloudgrid-yaml-reference.md | CLI: docs/cli-reference.md
234
+ # ============================================================================
@@ -17,11 +17,9 @@ The fillable HTML is the real template — fetch it with
17
17
  ## cloudgrid.yaml (reference only)
18
18
 
19
19
  ```yaml
20
- # static — deploys as an inspiration (instant, works on hosted) via gridctl_drop;
21
- # this yaml is only for plugging it as an OWNED static runtime (async, local
22
- # edition only). To publish the page, prefer gridctl_drop, not grid plug.
23
- #
24
- # needs: {} # none — static, no infrastructure
20
+ # On disk this file is the full-annotated reference (templates/_cloudgrid.yaml.reference) with EVERY
21
+ # field present as a comment; only the fields below are uncommented, so it
22
+ # deploys to exactly these active fields.
25
23
  name: report
26
24
  services:
27
25
  web:
@@ -0,0 +1,258 @@
1
+ # AGENTS.md — restaurant-reservations (BLUEPRINT)
2
+
3
+ This is a **structure guide**, not runnable code. It tells an agent how to build a
4
+ restaurant website with online reservations correctly **on CloudGrid**: a public
5
+ Next.js site (menu + booking form) backed by grid-shared MongoDB, with the
6
+ CloudGrid-native wiring for the DB, secrets, optional payments/auth, and a
7
+ scheduled reminder job. Read it end to end, then build the app under
8
+ `services/web/` following the same proven shape as the `app-with-data` template.
9
+
10
+ Do NOT ship this as-is — there is no app code here. Adapt the tree below.
11
+
12
+ ---
13
+
14
+ ## 1. File tree
15
+
16
+ App code MUST live under `services/<service-name>/`. The service is named `web`,
17
+ so the CLI looks for `services/web/`. `path: /` in `cloudgrid.yaml` is the URL
18
+ mount, NOT the filesystem path — files at the repo root fail with
19
+ `Error: Service directory not found: …/services/web`.
20
+
21
+ ```
22
+ cloudgrid.yaml # name + services.web (nextjs) + needs:{database:true} + vault:
23
+ AGENTS.md # this guide
24
+ services/web/package.json # next, react, react-dom, mongodb (+ stripe if deposits)
25
+ services/web/lib/db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
26
+ services/web/lib/mail.js # SendGrid client from process.env.SENDGRID_API_KEY (vault-injected)
27
+ services/web/app/layout.js # root layout + site chrome / inline CSS
28
+ services/web/app/page.js # home: hero + menu (server component, reads menu collection)
29
+ services/web/app/reserve/page.js # reservation page (renders the booking form)
30
+ services/web/app/reserve/reservation-form.js # "use client" form: POST a reservation
31
+ services/web/app/api/menu/route.js # GET menu items (public)
32
+ services/web/app/api/reservations/route.js # POST create reservation, GET list (staff)
33
+ services/web/app/api/reservations/[id]/route.js # PATCH status (confirm/seat/cancel), DELETE
34
+ # ─ optional: card deposit to hold a table (Stripe) ─
35
+ services/web/app/api/checkout/route.js # POST → create Stripe Checkout Session for a deposit
36
+ services/web/app/api/webhooks/stripe/route.js # POST ← Stripe webhook: mark reservation deposit paid
37
+ # ─ optional: staff auth (Clerk/Auth0) ─
38
+ services/web/middleware.js # protect /staff/* routes with the provider SDK
39
+ services/web/app/staff/page.js # staff dashboard: today's reservations
40
+ # ─ scheduled reminders (SEE §7 — cron deploy PENDING #1543) ─
41
+ services/reminder/package.json # mongodb + sendgrid; a one-shot job entry
42
+ services/reminder/index.js # find tomorrow's reservations → send reminder emails
43
+ ```
44
+
45
+ Keep the public reservation flow **unauthenticated** — a diner should book
46
+ without an account. Auth is only for the staff dashboard.
47
+
48
+ ---
49
+
50
+ ## 2. MongoDB collections + fields
51
+
52
+ The grid provisions one shared Mongo database (see §3). Use these collections:
53
+
54
+ ### `menu`
55
+ Menu content shown on the home page. Seed it once (script or an admin route).
56
+ | field | type | notes |
57
+ |-------|------|-------|
58
+ | `_id` | ObjectId | |
59
+ | `section` | string | e.g. "Starters", "Mains", "Desserts" |
60
+ | `name` | string | dish name |
61
+ | `description` | string | short copy |
62
+ | `price` | number | in cents, or a display string — pick one and be consistent |
63
+ | `order` | number | sort order within a section |
64
+ | `available` | boolean | hide sold-out items |
65
+
66
+ ### `reservations`
67
+ The booking records — the persistent core of this app.
68
+ | field | type | notes |
69
+ |-------|------|-------|
70
+ | `_id` | ObjectId | |
71
+ | `name` | string | guest name |
72
+ | `email` | string | for confirmation + reminder |
73
+ | `phone` | string | optional |
74
+ | `partySize` | number | number of covers |
75
+ | `date` | string (`YYYY-MM-DD`) | requested date |
76
+ | `time` | string (`HH:mm`) | requested slot |
77
+ | `tableId` | ObjectId \| null | assigned table (nullable until seated) |
78
+ | `status` | string | `pending` → `confirmed` → `seated` / `cancelled` / `no_show` |
79
+ | `notes` | string | allergies, occasion, seating pref |
80
+ | `depositPaid` | boolean | true after Stripe webhook (if deposits on) |
81
+ | `reminderSentAt` | Date \| null | set by the cron job so it never double-sends |
82
+ | `createdAt` | Date | index + sort |
83
+
84
+ ### `tables` (optional — table booking)
85
+ | field | type | notes |
86
+ |-------|------|-------|
87
+ | `_id` | ObjectId | |
88
+ | `label` | string | "T1", "Window 4" |
89
+ | `seats` | number | capacity |
90
+ | `zone` | string | "patio", "main", "bar" |
91
+
92
+ Availability = look up reservations for a `date`/`time` window and subtract from
93
+ `tables` capacity. Add a unique index on `{ tableId, date, time }` to prevent
94
+ double-booking a specific table, and index `reservations.createdAt` and
95
+ `{ date: 1, time: 1 }` for the availability query and the reminder job.
96
+
97
+ ---
98
+
99
+ ## 3. How CloudGrid injects things (the whole point)
100
+
101
+ You never provision infra or set connection strings by hand. Declare intent in
102
+ `cloudgrid.yaml`; the platform provisions and injects env vars.
103
+
104
+ - **Database (Mongo).** `needs: { database: true }` → the grid provisions shared
105
+ Mongo and injects the connection string as **`DATABASE_MONGODB_URL`** (plus the
106
+ legacy **`MONGODB_URL`** alias) at `grid dev` (locally) and at runtime (after
107
+ `grid plug`). Read it **lazily** inside a getter, `process.env.DATABASE_MONGODB_URL
108
+ || process.env.MONGODB_URL` — **never at module top level**, or `next build`
109
+ throws when it imports the module for route analysis before the var exists.
110
+ `db.client.db()` returns the DB from the connection-string path segment.
111
+ Do NOT set `DATABASE_MONGODB_URL`/`MONGODB_URL` yourself.
112
+
113
+ - **Secrets (Stripe, email, auth) → `vault:` block.** Map an org vault item to an
114
+ env var in `cloudgrid.yaml` `vault:` (already uncommented in this blueprint):
115
+ `STRIPE_KEY: stripe-live-key`, `SENDGRID_API_KEY: sendgrid-key`,
116
+ `AUTH_PROVIDER_KEY: auth-provider-secret`. The platform reads the named item
117
+ from the org vault and injects it as that env var at runtime. Store the actual
118
+ secret value with `gridctl_secrets` (or the org vault UI) — never commit it. In
119
+ code read `process.env.STRIPE_KEY`, `process.env.SENDGRID_API_KEY`, etc. Vault
120
+ is the CloudGrid-correct path for third-party keys; `gridctl_env` is for
121
+ non-secret config only.
122
+
123
+ - **AI (optional).** If you add AI (e.g. menu-copy generation, natural-language
124
+ booking parsing), declare `needs: { ai: true }` → the grid injects
125
+ **`AI_GATEWAY_URL`**; call it via `@cloudgrid-io/ai`. Not required for the base
126
+ blueprint.
127
+
128
+ Reserved env var names you must NOT set: `PORT`, `APP_NAME`, `SERVICE_NAME`,
129
+ `NODE_ENV`, `MONGODB_URL`, `REDIS_URL`, `AI_GATEWAY_URL`, `CLOUDGRID_*`.
130
+
131
+ ---
132
+
133
+ ## 4. Wiring auth and/or payments
134
+
135
+ ### Payments — Stripe deposit to hold a table (optional)
136
+ 1. `vault: { STRIPE_KEY: stripe-live-key }` (present in `cloudgrid.yaml`); add
137
+ `stripe` to `services/web/package.json`.
138
+ 2. `app/api/checkout/route.js` — read `process.env.STRIPE_KEY`, construct the
139
+ Stripe client, create a Checkout Session for the deposit amount, tuck the
140
+ `reservationId` into the session `metadata`, return the session URL; the client
141
+ redirects to it.
142
+ 3. `app/api/webhooks/stripe/route.js` — verify the Stripe signature, and on
143
+ `checkout.session.completed` set `depositPaid: true` (and `status: confirmed`)
144
+ on the reservation from `metadata.reservationId`. This route MUST be public
145
+ (exclude it from auth middleware) and read the raw request body for signature
146
+ verification. Register its URL in the Stripe dashboard as the webhook endpoint
147
+ after the app is live.
148
+
149
+ ### Auth — staff dashboard login (optional)
150
+ 1. `vault: { AUTH_PROVIDER_KEY: auth-provider-secret }` (uncomment it), add the
151
+ provider SDK (e.g. `@clerk/nextjs` or `@auth0/nextjs-auth0`) to
152
+ `package.json`.
153
+ 2. `middleware.js` — protect `/staff/*` (and staff-only API routes) with the
154
+ provider; leave `/`, `/reserve`, `/api/menu`, `/api/reservations` (POST),
155
+ `/api/webhooks/stripe` public.
156
+ 3. Initialize the SDK from `process.env.AUTH_PROVIDER_KEY` (+ any public
157
+ publishable key via `gridctl_env`). The public booking flow needs no login.
158
+
159
+ Keep the public reservation POST open; only staff read/mutate endpoints
160
+ (`GET /api/reservations`, `PATCH/DELETE /api/reservations/[id]`, `/staff/*`) sit
161
+ behind auth.
162
+
163
+ ---
164
+
165
+ ## 5. Deploy steps
166
+
167
+ Runtime app → **local edition** only (Claude Desktop / Claude Code / CLI); the
168
+ build is **asynchronous**.
169
+
170
+ 1. `gridctl_login_status` (→ `gridctl_login` if needed). Pick the grid if the
171
+ user has more than one.
172
+ 2. `gridctl_init` an app `<name>` — creates the entity + `.cloudgrid/link.json`
173
+ and a `cloudgrid.yaml` with empty `services: {}`. Run `init` FIRST (plug needs
174
+ a linked dir).
175
+ 3. **Fill** — write the app under `services/web/`, then set `cloudgrid.yaml` to
176
+ this blueprint's active fields: `name`, `services.web { type: nextjs, path: / }`,
177
+ `needs: { database: true }`, and the `vault:` mappings you actually use.
178
+ 4. Store secrets: `gridctl_secrets` for the vault item values (Stripe/SendGrid/
179
+ auth). Non-secret config (publishable keys, feature flags) → `gridctl_env`.
180
+ 5. (Optional) `grid dev` — runs Next.js locally with `DATABASE_MONGODB_URL` and
181
+ vault vars injected against dev Mongo. Seed `menu`, test a booking.
182
+ 6. `gridctl_plug` — builds + deploys `services/web/`. **Async**: the first
183
+ response is `status: building`, not a URL. Poll `gridctl_status` (or the
184
+ returned poll URL) until live; surface a liveness signal while it builds
185
+ (never a bare silent wait). Only then return the **live app URL** (not the
186
+ build/log link).
187
+ 7. Iterate by re-plugging the SAME entity — it updates the same URL. If you
188
+ turned on Stripe, register the live `/api/webhooks/stripe` URL in Stripe.
189
+
190
+ ---
191
+
192
+ ## 6. Edition note
193
+
194
+ This is a **runtime app** (built + deployed container), so it requires the
195
+ **local edition** (Claude Desktop / Claude Code) or the CLI. On the **hosted**
196
+ edition (Claude Web / hosted MCP) you CANNOT build a runtime app — hosted is
197
+ inline-only and can publish static pages only. If the user is on hosted, say so
198
+ plainly and offer a static, non-persistent menu page instead (no bookings), then
199
+ stop the runtime path.
200
+
201
+ ---
202
+
203
+ ## 7. Cron reminders — INTENDED SHAPE, NOT YET DEPLOYABLE (#1543)
204
+
205
+ The design calls for a scheduled job that emails confirmation reminders to guests
206
+ with a booking the next day. On CloudGrid this is a second **cron service** in the
207
+ same entity:
208
+
209
+ ```yaml
210
+ services:
211
+ reminder:
212
+ type: cron
213
+ schedule: "0 15 * * *" # daily 15:00
214
+ timezone: UTC
215
+ run: job # runs services/reminder/ as a one-shot job
216
+ ```
217
+
218
+ The cron job (`services/reminder/index.js`) reads the SAME grid-injected
219
+ `DATABASE_MONGODB_URL` and the vault-injected `SENDGRID_API_KEY`, queries
220
+ `reservations` where `date` is tomorrow and `reminderSentAt` is null and
221
+ `status` is `confirmed`, sends each a reminder, and stamps `reminderSentAt` so it
222
+ never double-sends.
223
+
224
+ > **PENDING platform issue #1543:** cron deploy is not yet available. Keep the
225
+ > `reminder:` cron block **commented out** in `cloudgrid.yaml` (as shipped) —
226
+ > plugging an entity with an active cron service will be rejected until #1543
227
+ > lands. Build the rest now; enable the cron block once cron ships. Interim
228
+ > workaround: trigger the same reminder logic from an external scheduler hitting
229
+ > a protected HTTP route, or run it manually.
230
+
231
+ ---
232
+
233
+ ## 8. DB wiring reference (copy the app-with-data shape)
234
+
235
+ `services/web/lib/db.js` — lazy cached Mongo client (identical pattern to the
236
+ `app-with-data` template):
237
+
238
+ ```js
239
+ import { MongoClient } from "mongodb";
240
+
241
+ function clientPromise() {
242
+ const uri = process.env.DATABASE_MONGODB_URL || process.env.MONGODB_URL;
243
+ if (!uri) throw new Error("DATABASE_MONGODB_URL not set — the grid injects it; use grid dev / grid plug.");
244
+ if (!globalThis.__mongoClientPromise) {
245
+ globalThis.__mongoClientPromise = new MongoClient(uri).connect();
246
+ }
247
+ return globalThis.__mongoClientPromise;
248
+ }
249
+
250
+ export async function getDb() {
251
+ const client = await clientPromise();
252
+ return client.db();
253
+ }
254
+ ```
255
+
256
+ Every route/server component imports `getDb()` from here. Mark reservation and
257
+ menu routes `export const dynamic = "force-dynamic"` so they always hit Mongo.
258
+ Validate `partySize`, `date`, `time`, `email` on the server before insert.
@@ -0,0 +1,17 @@
1
+ # restaurant-reservations template — BLUEPRINT (structure + cloudgrid.yaml)
2
+
3
+ A restaurant website with online reservations: a public Next.js site (menu
4
+ content + a booking form / table booking) backed by grid-shared MongoDB, with
5
+ CloudGrid-native wiring for the database, third-party secrets (Stripe deposit,
6
+ email/SMS via the `vault:` block), optional staff auth, and a scheduled reminder
7
+ job. Reservations persist in Mongo (`needs: { database: true }` → injected
8
+ `DATABASE_MONGODB_URL`); this is a runtime app (local edition, async deploy) —
9
+ not a static page.
10
+
11
+ **This is a blueprint: structure + `cloudgrid.yaml`, adapt and build.** There is
12
+ no app code here. Read `AGENTS.md` for the file tree, the Mongo collections
13
+ (`menu`, `reservations`, `tables`), how CloudGrid injects the DB and vault
14
+ secrets, how to wire Stripe/auth, and the deploy steps — then build the app under
15
+ `services/web/` following it. Note: the confirmation-reminder **cron** service is
16
+ documented but NOT yet deployable (platform issue #1543) — keep that block
17
+ commented.