@cloudgrid-io/mcp 0.12.0 → 0.14.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 (390) hide show
  1. package/package.json +1 -1
  2. package/src/corpus/capability-map.md +82 -2
  3. package/src/corpus/examples/crm/index.md +273 -0
  4. package/src/corpus/examples/kanban/index.md +256 -0
  5. package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
  6. package/src/corpus/templates/admin-dashboard/README.md +75 -0
  7. package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +233 -0
  8. package/src/corpus/templates/admin-dashboard/index.md +81 -0
  9. package/src/corpus/templates/admin-dashboard/services/web/app/api/orders/route.js +64 -0
  10. package/src/corpus/templates/admin-dashboard/services/web/app/api/users/route.js +63 -0
  11. package/src/corpus/templates/admin-dashboard/services/web/app/layout.js +39 -0
  12. package/src/corpus/templates/admin-dashboard/services/web/app/page.js +73 -0
  13. package/src/corpus/templates/admin-dashboard/services/web/app/resource-table.js +94 -0
  14. package/src/corpus/templates/admin-dashboard/services/web/lib/db.js +32 -0
  15. package/src/corpus/templates/admin-dashboard/services/web/package.json +16 -0
  16. package/src/corpus/templates/ai-app/cloudgrid.yaml +225 -11
  17. package/src/corpus/templates/ai-app/index.md +3 -11
  18. package/src/corpus/templates/ai-knowledge-base/AGENTS.md +254 -0
  19. package/src/corpus/templates/ai-knowledge-base/README.md +28 -0
  20. package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +238 -0
  21. package/src/corpus/templates/ai-knowledge-base/index.md +81 -0
  22. package/src/corpus/templates/analytics-dashboard/README.md +85 -0
  23. package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +232 -0
  24. package/src/corpus/templates/analytics-dashboard/index.md +316 -0
  25. package/src/corpus/templates/analytics-dashboard/services/web/app/api/events/route.js +60 -0
  26. package/src/corpus/templates/analytics-dashboard/services/web/app/event-form.js +100 -0
  27. package/src/corpus/templates/analytics-dashboard/services/web/app/layout.js +41 -0
  28. package/src/corpus/templates/analytics-dashboard/services/web/app/page.js +54 -0
  29. package/src/corpus/templates/analytics-dashboard/services/web/lib/db.js +32 -0
  30. package/src/corpus/templates/analytics-dashboard/services/web/package.json +16 -0
  31. package/src/corpus/templates/api-dashboard/README.md +84 -0
  32. package/src/corpus/templates/api-dashboard/cloudgrid.yaml +233 -0
  33. package/src/corpus/templates/api-dashboard/index.md +310 -0
  34. package/src/corpus/templates/api-dashboard/services/web/app/api/requests/route.js +62 -0
  35. package/src/corpus/templates/api-dashboard/services/web/app/dashboard.js +156 -0
  36. package/src/corpus/templates/api-dashboard/services/web/app/layout.js +42 -0
  37. package/src/corpus/templates/api-dashboard/services/web/app/page.js +39 -0
  38. package/src/corpus/templates/api-dashboard/services/web/lib/db.js +32 -0
  39. package/src/corpus/templates/api-dashboard/services/web/package.json +16 -0
  40. package/src/corpus/templates/api-docs/README.md +28 -0
  41. package/src/corpus/templates/api-docs/cloudgrid.yaml +228 -0
  42. package/src/corpus/templates/api-docs/index.html +136 -0
  43. package/src/corpus/templates/api-docs/index.md +28 -0
  44. package/src/corpus/templates/api-service/cloudgrid.yaml +224 -9
  45. package/src/corpus/templates/api-service/index.md +3 -11
  46. package/src/corpus/templates/app-with-data/cloudgrid.yaml +226 -8
  47. package/src/corpus/templates/app-with-data/index.md +3 -8
  48. package/src/corpus/templates/appointment-booking/AGENTS.md +223 -0
  49. package/src/corpus/templates/appointment-booking/README.md +16 -0
  50. package/src/corpus/templates/appointment-booking/cloudgrid.yaml +250 -0
  51. package/src/corpus/templates/appointment-booking/index.md +72 -0
  52. package/src/corpus/templates/approval-workflow/AGENTS.md +170 -0
  53. package/src/corpus/templates/approval-workflow/README.md +12 -0
  54. package/src/corpus/templates/approval-workflow/cloudgrid.yaml +237 -0
  55. package/src/corpus/templates/approval-workflow/index.md +58 -0
  56. package/src/corpus/templates/billing-dashboard/AGENTS.md +199 -0
  57. package/src/corpus/templates/billing-dashboard/README.md +18 -0
  58. package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +235 -0
  59. package/src/corpus/templates/billing-dashboard/index.md +87 -0
  60. package/src/corpus/templates/blog-cms/README.md +94 -0
  61. package/src/corpus/templates/blog-cms/cloudgrid.yaml +233 -0
  62. package/src/corpus/templates/blog-cms/index.md +358 -0
  63. package/src/corpus/templates/blog-cms/services/web/app/admin/admin-editor.js +133 -0
  64. package/src/corpus/templates/blog-cms/services/web/app/admin/page.js +33 -0
  65. package/src/corpus/templates/blog-cms/services/web/app/api/posts/route.js +84 -0
  66. package/src/corpus/templates/blog-cms/services/web/app/layout.js +47 -0
  67. package/src/corpus/templates/blog-cms/services/web/app/page.js +56 -0
  68. package/src/corpus/templates/blog-cms/services/web/app/posts/[slug]/page.js +45 -0
  69. package/src/corpus/templates/blog-cms/services/web/lib/db.js +32 -0
  70. package/src/corpus/templates/blog-cms/services/web/package.json +16 -0
  71. package/src/corpus/templates/booking-system/AGENTS.md +189 -0
  72. package/src/corpus/templates/booking-system/README.md +17 -0
  73. package/src/corpus/templates/booking-system/cloudgrid.yaml +248 -0
  74. package/src/corpus/templates/booking-system/index.md +86 -0
  75. package/src/corpus/templates/calendar-scheduler/AGENTS.md +226 -0
  76. package/src/corpus/templates/calendar-scheduler/README.md +25 -0
  77. package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +259 -0
  78. package/src/corpus/templates/calendar-scheduler/index.md +85 -0
  79. package/src/corpus/templates/changelog/README.md +27 -0
  80. package/src/corpus/templates/changelog/cloudgrid.yaml +228 -0
  81. package/src/corpus/templates/changelog/index.html +80 -0
  82. package/src/corpus/templates/changelog/index.md +28 -0
  83. package/src/corpus/templates/company-website/README.md +54 -0
  84. package/src/corpus/templates/company-website/cloudgrid.yaml +233 -0
  85. package/src/corpus/templates/company-website/index.html +309 -0
  86. package/src/corpus/templates/company-website/index.md +29 -0
  87. package/src/corpus/templates/course-platform/AGENTS.md +161 -0
  88. package/src/corpus/templates/course-platform/README.md +26 -0
  89. package/src/corpus/templates/course-platform/cloudgrid.yaml +237 -0
  90. package/src/corpus/templates/course-platform/index.md +70 -0
  91. package/src/corpus/templates/crm/README.md +72 -0
  92. package/src/corpus/templates/crm/cloudgrid.yaml +233 -0
  93. package/src/corpus/templates/crm/index.md +71 -0
  94. package/src/corpus/templates/crm/services/web/app/api/contacts/route.js +80 -0
  95. package/src/corpus/templates/crm/services/web/app/contact-manager.js +102 -0
  96. package/src/corpus/templates/crm/services/web/app/layout.js +35 -0
  97. package/src/corpus/templates/crm/services/web/app/page.js +34 -0
  98. package/src/corpus/templates/crm/services/web/lib/db.js +32 -0
  99. package/src/corpus/templates/crm/services/web/package.json +16 -0
  100. package/src/corpus/templates/dashboard/cloudgrid.yaml +228 -4
  101. package/src/corpus/templates/dashboard/index.md +3 -5
  102. package/src/corpus/templates/deck/cloudgrid.yaml +228 -4
  103. package/src/corpus/templates/deck/index.md +3 -5
  104. package/src/corpus/templates/directory/README.md +75 -0
  105. package/src/corpus/templates/directory/cloudgrid.yaml +233 -0
  106. package/src/corpus/templates/directory/index.md +334 -0
  107. package/src/corpus/templates/directory/services/web/app/api/entries/route.js +63 -0
  108. package/src/corpus/templates/directory/services/web/app/directory-list.js +146 -0
  109. package/src/corpus/templates/directory/services/web/app/layout.js +44 -0
  110. package/src/corpus/templates/directory/services/web/app/page.js +38 -0
  111. package/src/corpus/templates/directory/services/web/lib/db.js +32 -0
  112. package/src/corpus/templates/directory/services/web/package.json +16 -0
  113. package/src/corpus/templates/docs-site/README.md +28 -0
  114. package/src/corpus/templates/docs-site/cloudgrid.yaml +228 -0
  115. package/src/corpus/templates/docs-site/index.html +122 -0
  116. package/src/corpus/templates/docs-site/index.md +28 -0
  117. package/src/corpus/templates/erp/AGENTS.md +116 -0
  118. package/src/corpus/templates/erp/README.md +17 -0
  119. package/src/corpus/templates/erp/cloudgrid.yaml +235 -0
  120. package/src/corpus/templates/erp/index.md +81 -0
  121. package/src/corpus/templates/event-board/README.md +74 -0
  122. package/src/corpus/templates/event-board/cloudgrid.yaml +233 -0
  123. package/src/corpus/templates/event-board/index.md +299 -0
  124. package/src/corpus/templates/event-board/services/web/app/api/events/route.js +61 -0
  125. package/src/corpus/templates/event-board/services/web/app/event-form.js +118 -0
  126. package/src/corpus/templates/event-board/services/web/app/layout.js +39 -0
  127. package/src/corpus/templates/event-board/services/web/app/page.js +34 -0
  128. package/src/corpus/templates/event-board/services/web/lib/db.js +32 -0
  129. package/src/corpus/templates/event-board/services/web/package.json +16 -0
  130. package/src/corpus/templates/expense-tracker/README.md +76 -0
  131. package/src/corpus/templates/expense-tracker/cloudgrid.yaml +233 -0
  132. package/src/corpus/templates/expense-tracker/index.md +305 -0
  133. package/src/corpus/templates/expense-tracker/services/web/app/api/expenses/route.js +61 -0
  134. package/src/corpus/templates/expense-tracker/services/web/app/expense-form.js +145 -0
  135. package/src/corpus/templates/expense-tracker/services/web/app/layout.js +42 -0
  136. package/src/corpus/templates/expense-tracker/services/web/app/page.js +34 -0
  137. package/src/corpus/templates/expense-tracker/services/web/lib/db.js +32 -0
  138. package/src/corpus/templates/expense-tracker/services/web/package.json +16 -0
  139. package/src/corpus/templates/feature-request-board/README.md +87 -0
  140. package/src/corpus/templates/feature-request-board/cloudgrid.yaml +233 -0
  141. package/src/corpus/templates/feature-request-board/index.md +317 -0
  142. package/src/corpus/templates/feature-request-board/services/web/app/api/requests/route.js +92 -0
  143. package/src/corpus/templates/feature-request-board/services/web/app/board.js +91 -0
  144. package/src/corpus/templates/feature-request-board/services/web/app/layout.js +43 -0
  145. package/src/corpus/templates/feature-request-board/services/web/app/page.js +35 -0
  146. package/src/corpus/templates/feature-request-board/services/web/lib/db.js +32 -0
  147. package/src/corpus/templates/feature-request-board/services/web/package.json +16 -0
  148. package/src/corpus/templates/financial-dashboard/README.md +80 -0
  149. package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +233 -0
  150. package/src/corpus/templates/financial-dashboard/index.md +326 -0
  151. package/src/corpus/templates/financial-dashboard/services/web/app/api/entries/route.js +63 -0
  152. package/src/corpus/templates/financial-dashboard/services/web/app/entry-board.js +130 -0
  153. package/src/corpus/templates/financial-dashboard/services/web/app/layout.js +46 -0
  154. package/src/corpus/templates/financial-dashboard/services/web/app/page.js +31 -0
  155. package/src/corpus/templates/financial-dashboard/services/web/lib/db.js +32 -0
  156. package/src/corpus/templates/financial-dashboard/services/web/package.json +16 -0
  157. package/src/corpus/templates/forum/AGENTS.md +196 -0
  158. package/src/corpus/templates/forum/README.md +12 -0
  159. package/src/corpus/templates/forum/cloudgrid.yaml +237 -0
  160. package/src/corpus/templates/forum/index.md +66 -0
  161. package/src/corpus/templates/hr-portal/AGENTS.md +174 -0
  162. package/src/corpus/templates/hr-portal/README.md +14 -0
  163. package/src/corpus/templates/hr-portal/cloudgrid.yaml +237 -0
  164. package/src/corpus/templates/hr-portal/index.md +56 -0
  165. package/src/corpus/templates/internal-tools-portal/AGENTS.md +201 -0
  166. package/src/corpus/templates/internal-tools-portal/README.md +17 -0
  167. package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +237 -0
  168. package/src/corpus/templates/internal-tools-portal/index.md +62 -0
  169. package/src/corpus/templates/inventory/README.md +71 -0
  170. package/src/corpus/templates/inventory/cloudgrid.yaml +233 -0
  171. package/src/corpus/templates/inventory/index.md +68 -0
  172. package/src/corpus/templates/inventory/services/web/app/api/items/route.js +88 -0
  173. package/src/corpus/templates/inventory/services/web/app/inventory-manager.js +101 -0
  174. package/src/corpus/templates/inventory/services/web/app/layout.js +36 -0
  175. package/src/corpus/templates/inventory/services/web/app/page.js +37 -0
  176. package/src/corpus/templates/inventory/services/web/lib/db.js +32 -0
  177. package/src/corpus/templates/inventory/services/web/package.json +16 -0
  178. package/src/corpus/templates/invoice/README.md +71 -0
  179. package/src/corpus/templates/invoice/cloudgrid.yaml +233 -0
  180. package/src/corpus/templates/invoice/index.md +68 -0
  181. package/src/corpus/templates/invoice/services/web/app/api/invoices/route.js +82 -0
  182. package/src/corpus/templates/invoice/services/web/app/invoice-manager.js +101 -0
  183. package/src/corpus/templates/invoice/services/web/app/layout.js +35 -0
  184. package/src/corpus/templates/invoice/services/web/app/page.js +34 -0
  185. package/src/corpus/templates/invoice/services/web/lib/db.js +32 -0
  186. package/src/corpus/templates/invoice/services/web/package.json +16 -0
  187. package/src/corpus/templates/job-board/README.md +71 -0
  188. package/src/corpus/templates/job-board/cloudgrid.yaml +233 -0
  189. package/src/corpus/templates/job-board/index.md +68 -0
  190. package/src/corpus/templates/job-board/services/web/app/api/jobs/route.js +66 -0
  191. package/src/corpus/templates/job-board/services/web/app/job-board.js +73 -0
  192. package/src/corpus/templates/job-board/services/web/app/layout.js +35 -0
  193. package/src/corpus/templates/job-board/services/web/app/page.js +32 -0
  194. package/src/corpus/templates/job-board/services/web/lib/db.js +32 -0
  195. package/src/corpus/templates/job-board/services/web/package.json +16 -0
  196. package/src/corpus/templates/kanban/README.md +72 -0
  197. package/src/corpus/templates/kanban/cloudgrid.yaml +233 -0
  198. package/src/corpus/templates/kanban/index.md +71 -0
  199. package/src/corpus/templates/kanban/services/web/app/api/cards/route.js +70 -0
  200. package/src/corpus/templates/kanban/services/web/app/board.js +93 -0
  201. package/src/corpus/templates/kanban/services/web/app/layout.js +37 -0
  202. package/src/corpus/templates/kanban/services/web/app/page.js +32 -0
  203. package/src/corpus/templates/kanban/services/web/lib/db.js +32 -0
  204. package/src/corpus/templates/kanban/services/web/package.json +16 -0
  205. package/src/corpus/templates/landing-page/cloudgrid.yaml +228 -4
  206. package/src/corpus/templates/landing-page/index.md +3 -5
  207. package/src/corpus/templates/lms/AGENTS.md +193 -0
  208. package/src/corpus/templates/lms/README.md +27 -0
  209. package/src/corpus/templates/lms/cloudgrid.yaml +237 -0
  210. package/src/corpus/templates/lms/index.md +79 -0
  211. package/src/corpus/templates/marketplace/AGENTS.md +208 -0
  212. package/src/corpus/templates/marketplace/README.md +22 -0
  213. package/src/corpus/templates/marketplace/cloudgrid.yaml +233 -0
  214. package/src/corpus/templates/marketplace/index.md +76 -0
  215. package/src/corpus/templates/membership-site/AGENTS.md +160 -0
  216. package/src/corpus/templates/membership-site/README.md +18 -0
  217. package/src/corpus/templates/membership-site/cloudgrid.yaml +236 -0
  218. package/src/corpus/templates/membership-site/index.md +66 -0
  219. package/src/corpus/templates/monitoring-dashboard/README.md +84 -0
  220. package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +233 -0
  221. package/src/corpus/templates/monitoring-dashboard/index.md +328 -0
  222. package/src/corpus/templates/monitoring-dashboard/services/web/app/api/checks/route.js +76 -0
  223. package/src/corpus/templates/monitoring-dashboard/services/web/app/check-form.js +124 -0
  224. package/src/corpus/templates/monitoring-dashboard/services/web/app/layout.js +44 -0
  225. package/src/corpus/templates/monitoring-dashboard/services/web/app/page.js +49 -0
  226. package/src/corpus/templates/monitoring-dashboard/services/web/lib/db.js +32 -0
  227. package/src/corpus/templates/monitoring-dashboard/services/web/package.json +16 -0
  228. package/src/corpus/templates/online-store/AGENTS.md +153 -0
  229. package/src/corpus/templates/online-store/README.md +16 -0
  230. package/src/corpus/templates/online-store/cloudgrid.yaml +234 -0
  231. package/src/corpus/templates/online-store/index.md +81 -0
  232. package/src/corpus/templates/portfolio/README.md +29 -0
  233. package/src/corpus/templates/portfolio/cloudgrid.yaml +228 -0
  234. package/src/corpus/templates/portfolio/index.html +126 -0
  235. package/src/corpus/templates/portfolio/index.md +28 -0
  236. package/src/corpus/templates/product-catalog/README.md +74 -0
  237. package/src/corpus/templates/product-catalog/cloudgrid.yaml +232 -0
  238. package/src/corpus/templates/product-catalog/index.md +330 -0
  239. package/src/corpus/templates/product-catalog/services/web/app/api/products/route.js +69 -0
  240. package/src/corpus/templates/product-catalog/services/web/app/catalog.js +153 -0
  241. package/src/corpus/templates/product-catalog/services/web/app/layout.js +49 -0
  242. package/src/corpus/templates/product-catalog/services/web/app/page.js +36 -0
  243. package/src/corpus/templates/product-catalog/services/web/lib/db.js +32 -0
  244. package/src/corpus/templates/product-catalog/services/web/package.json +16 -0
  245. package/src/corpus/templates/product-launch/README.md +46 -0
  246. package/src/corpus/templates/product-launch/cloudgrid.yaml +234 -0
  247. package/src/corpus/templates/product-launch/index.html +320 -0
  248. package/src/corpus/templates/product-launch/index.md +34 -0
  249. package/src/corpus/templates/project-management/README.md +83 -0
  250. package/src/corpus/templates/project-management/cloudgrid.yaml +233 -0
  251. package/src/corpus/templates/project-management/index.md +346 -0
  252. package/src/corpus/templates/project-management/services/web/app/api/projects/route.js +48 -0
  253. package/src/corpus/templates/project-management/services/web/app/api/tasks/route.js +85 -0
  254. package/src/corpus/templates/project-management/services/web/app/board.js +182 -0
  255. package/src/corpus/templates/project-management/services/web/app/layout.js +45 -0
  256. package/src/corpus/templates/project-management/services/web/app/page.js +49 -0
  257. package/src/corpus/templates/project-management/services/web/lib/db.js +32 -0
  258. package/src/corpus/templates/project-management/services/web/package.json +16 -0
  259. package/src/corpus/templates/property-listings/README.md +76 -0
  260. package/src/corpus/templates/property-listings/cloudgrid.yaml +233 -0
  261. package/src/corpus/templates/property-listings/index.md +335 -0
  262. package/src/corpus/templates/property-listings/services/web/app/api/properties/route.js +73 -0
  263. package/src/corpus/templates/property-listings/services/web/app/layout.js +45 -0
  264. package/src/corpus/templates/property-listings/services/web/app/listings.js +152 -0
  265. package/src/corpus/templates/property-listings/services/web/app/page.js +53 -0
  266. package/src/corpus/templates/property-listings/services/web/lib/db.js +32 -0
  267. package/src/corpus/templates/property-listings/services/web/package.json +16 -0
  268. package/src/corpus/templates/quiz-platform/README.md +84 -0
  269. package/src/corpus/templates/quiz-platform/cloudgrid.yaml +233 -0
  270. package/src/corpus/templates/quiz-platform/index.md +313 -0
  271. package/src/corpus/templates/quiz-platform/services/web/app/api/questions/route.js +69 -0
  272. package/src/corpus/templates/quiz-platform/services/web/app/layout.js +47 -0
  273. package/src/corpus/templates/quiz-platform/services/web/app/page.js +37 -0
  274. package/src/corpus/templates/quiz-platform/services/web/app/quiz.js +188 -0
  275. package/src/corpus/templates/quiz-platform/services/web/lib/db.js +32 -0
  276. package/src/corpus/templates/quiz-platform/services/web/package.json +16 -0
  277. package/src/corpus/templates/report/cloudgrid.yaml +228 -4
  278. package/src/corpus/templates/report/index.md +3 -5
  279. package/src/corpus/templates/restaurant-reservations/AGENTS.md +258 -0
  280. package/src/corpus/templates/restaurant-reservations/README.md +17 -0
  281. package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +258 -0
  282. package/src/corpus/templates/restaurant-reservations/index.md +62 -0
  283. package/src/corpus/templates/revenue-dashboard/README.md +75 -0
  284. package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +233 -0
  285. package/src/corpus/templates/revenue-dashboard/index.md +307 -0
  286. package/src/corpus/templates/revenue-dashboard/services/web/app/api/sales/route.js +60 -0
  287. package/src/corpus/templates/revenue-dashboard/services/web/app/layout.js +40 -0
  288. package/src/corpus/templates/revenue-dashboard/services/web/app/page.js +87 -0
  289. package/src/corpus/templates/revenue-dashboard/services/web/app/sale-form.js +63 -0
  290. package/src/corpus/templates/revenue-dashboard/services/web/lib/db.js +32 -0
  291. package/src/corpus/templates/revenue-dashboard/services/web/package.json +16 -0
  292. package/src/corpus/templates/saas-marketing/README.md +30 -0
  293. package/src/corpus/templates/saas-marketing/cloudgrid.yaml +228 -0
  294. package/src/corpus/templates/saas-marketing/index.html +212 -0
  295. package/src/corpus/templates/saas-marketing/index.md +28 -0
  296. package/src/corpus/templates/status-page/README.md +28 -0
  297. package/src/corpus/templates/status-page/cloudgrid.yaml +228 -0
  298. package/src/corpus/templates/status-page/index.html +117 -0
  299. package/src/corpus/templates/status-page/index.md +28 -0
  300. package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
  301. package/src/corpus/templates/subscription-management/README.md +21 -0
  302. package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
  303. package/src/corpus/templates/subscription-management/index.md +73 -0
  304. package/src/corpus/templates/task-manager/README.md +72 -0
  305. package/src/corpus/templates/task-manager/cloudgrid.yaml +233 -0
  306. package/src/corpus/templates/task-manager/index.md +71 -0
  307. package/src/corpus/templates/task-manager/services/web/app/api/tasks/route.js +77 -0
  308. package/src/corpus/templates/task-manager/services/web/app/layout.js +39 -0
  309. package/src/corpus/templates/task-manager/services/web/app/page.js +33 -0
  310. package/src/corpus/templates/task-manager/services/web/app/task-list.js +110 -0
  311. package/src/corpus/templates/task-manager/services/web/lib/db.js +32 -0
  312. package/src/corpus/templates/task-manager/services/web/package.json +16 -0
  313. package/src/corpus/templates/ticket-system/README.md +71 -0
  314. package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
  315. package/src/corpus/templates/ticket-system/index.md +68 -0
  316. package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
  317. package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
  318. package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
  319. package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
  320. package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
  321. package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
  322. package/src/corpus/templates/time-tracking/README.md +81 -0
  323. package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
  324. package/src/corpus/templates/time-tracking/index.md +298 -0
  325. package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
  326. package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
  327. package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
  328. package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
  329. package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
  330. package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
  331. package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
  332. package/src/corpus/templates/travel-booking/README.md +17 -0
  333. package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
  334. package/src/corpus/templates/travel-booking/index.md +88 -0
  335. package/src/corpus/templates/waitlist/README.md +38 -0
  336. package/src/corpus/templates/waitlist/cloudgrid.yaml +228 -0
  337. package/src/corpus/templates/waitlist/index.html +69 -0
  338. package/src/corpus/templates/waitlist/index.md +39 -0
  339. package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
  340. package/src/corpus/templates/web-app/index.md +3 -5
  341. package/src/corpus/workflows/admin-dashboard.md +102 -0
  342. package/src/corpus/workflows/ai-knowledge-base.md +137 -0
  343. package/src/corpus/workflows/analytics-dashboard.md +104 -0
  344. package/src/corpus/workflows/api-dashboard.md +102 -0
  345. package/src/corpus/workflows/api-docs.md +36 -0
  346. package/src/corpus/workflows/appointment-booking.md +143 -0
  347. package/src/corpus/workflows/approval-workflow.md +124 -0
  348. package/src/corpus/workflows/billing-dashboard.md +120 -0
  349. package/src/corpus/workflows/blog-cms.md +104 -0
  350. package/src/corpus/workflows/booking-system.md +116 -0
  351. package/src/corpus/workflows/calendar-scheduler.md +134 -0
  352. package/src/corpus/workflows/changelog.md +33 -0
  353. package/src/corpus/workflows/company-website.md +46 -0
  354. package/src/corpus/workflows/course-platform.md +126 -0
  355. package/src/corpus/workflows/crm.md +101 -0
  356. package/src/corpus/workflows/directory.md +101 -0
  357. package/src/corpus/workflows/docs-site.md +35 -0
  358. package/src/corpus/workflows/erp.md +125 -0
  359. package/src/corpus/workflows/event-board.md +102 -0
  360. package/src/corpus/workflows/expense-tracker.md +102 -0
  361. package/src/corpus/workflows/feature-request-board.md +105 -0
  362. package/src/corpus/workflows/financial-dashboard.md +103 -0
  363. package/src/corpus/workflows/forum.md +128 -0
  364. package/src/corpus/workflows/hr-portal.md +115 -0
  365. package/src/corpus/workflows/internal-tools-portal.md +125 -0
  366. package/src/corpus/workflows/inventory.md +101 -0
  367. package/src/corpus/workflows/invoice.md +101 -0
  368. package/src/corpus/workflows/job-board.md +101 -0
  369. package/src/corpus/workflows/kanban.md +102 -0
  370. package/src/corpus/workflows/lms.md +113 -0
  371. package/src/corpus/workflows/marketplace.md +123 -0
  372. package/src/corpus/workflows/membership-site.md +128 -0
  373. package/src/corpus/workflows/monitoring-dashboard.md +104 -0
  374. package/src/corpus/workflows/online-store.md +114 -0
  375. package/src/corpus/workflows/portfolio.md +35 -0
  376. package/src/corpus/workflows/product-catalog.md +105 -0
  377. package/src/corpus/workflows/product-launch.md +43 -0
  378. package/src/corpus/workflows/project-management.md +106 -0
  379. package/src/corpus/workflows/property-listings.md +101 -0
  380. package/src/corpus/workflows/quiz-platform.md +105 -0
  381. package/src/corpus/workflows/restaurant-reservations.md +123 -0
  382. package/src/corpus/workflows/revenue-dashboard.md +102 -0
  383. package/src/corpus/workflows/saas-marketing.md +37 -0
  384. package/src/corpus/workflows/status-page.md +35 -0
  385. package/src/corpus/workflows/subscription-management.md +141 -0
  386. package/src/corpus/workflows/task-manager.md +101 -0
  387. package/src/corpus/workflows/ticket-system.md +101 -0
  388. package/src/corpus/workflows/time-tracking.md +104 -0
  389. package/src/corpus/workflows/travel-booking.md +115 -0
  390. package/src/corpus/workflows/waitlist.md +42 -0
@@ -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.
@@ -0,0 +1,258 @@
1
+ # ============================================================================
2
+ # cloudgrid.yaml — Complete Example
3
+ # ============================================================================
4
+ #
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
+
17
+
18
+ # ─── IDENTITY ───────────────────────────────────────────────────────────────
19
+
20
+ # Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
21
+ # Must start and end with a letter or digit.
22
+ # Becomes part of your public URL: <name>-<4hex>.<org>.cloudgrid.io
23
+ name: restaurant-reservations
24
+
25
+ # One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
26
+ # description: Order processing API for the e-commerce platform
27
+
28
+ # Single emoji or short text shown as the entity icon. Max 64 chars.
29
+ # icon: "📦"
30
+
31
+ # Entity type: 'app' (default) or 'agent'. An agent is an app with an agent: block.
32
+ # kind: app
33
+
34
+
35
+ # ─── NETWORKING ─────────────────────────────────────────────────────────────
36
+
37
+ # Whether this entity serves public HTTP traffic.
38
+ # true = public URL + Ingress (default). false = internal only.
39
+ # expose: true
40
+
41
+ # Additional domain names this entity serves on (the platform URL is always active).
42
+ # custom_domains:
43
+ # - orders.example.com
44
+ # - shop.example.com
45
+
46
+
47
+ # ─── HEALTH PROBE (entity-level override) ──────────────────────────────────
48
+
49
+ # Override the default health check for the entire entity.
50
+ # probe:
51
+ # path: /healthz # HTTP path to probe (default: /).
52
+ # expected: "<500" # '<500' (default), '200', '2xx'.
53
+
54
+
55
+ # ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
56
+
57
+ # Slack notification to the org's default channel on deploy failure.
58
+ # true = notify (default), false = silent.
59
+ # notify: true
60
+
61
+
62
+ # ─── SCALING ────────────────────────────────────────────────────────────────
63
+
64
+ # Replica scaling intent.
65
+ # 'auto' — platform decides from the grid tier (default).
66
+ # 'alert' — single-replica, emit a SPOF warning at plug time.
67
+ # 1-10 — explicit replica count, clamped to the grid max.
68
+ # scale: auto
69
+
70
+
71
+ # ─── INFRASTRUCTURE NEEDS ──────────────────────────────────────────────────
72
+ #
73
+ # Declare infrastructure; the platform provisions it and injects connection
74
+ # details as env vars. Nine needs: database, cache, kv, queue, pubsub, vector,
75
+ # object_storage, disk, ai. Simplest form is `true`.
76
+ #
77
+ # needs:
78
+ # # database — MongoDB. Injects DATABASE_MONGODB_URL (+ legacy MONGODB_URL).
79
+ # # true | pool | dedicated | { tier: external, secret: MY_DB }
80
+ # database: true
81
+ # # cache — Redis, LRU eviction (derived data). Injects CACHE_REDIS_URL (+ REDIS_URL).
82
+ # # true | redis | { engine: external, secret: MY_REDIS_URL }
83
+ # cache: true
84
+ # # kv — Redis, no eviction (durable: flags, idempotency). Injects KV_REDIS_URL.
85
+ # kv: true
86
+ # # queue — Redis job-queue substrate (BullMQ). Injects QUEUE_REDIS_URL.
87
+ # queue: true
88
+ # # pubsub — Redis broadcast pub/sub. Injects PUBSUB_REDIS_URL.
89
+ # pubsub: true
90
+ # # vector — pgvector on Postgres. Injects VECTOR_PGVECTOR_URL (+ PGVECTOR_URL).
91
+ # # true | pgvector | { engine: pgvector, dim: 1536 }
92
+ # vector: pgvector
93
+ # # object_storage — GCS bucket. Injects OBJECT_STORAGE_GCS_BUCKET, _GCS_REGION.
94
+ # # true | { size: 10Gi }
95
+ # object_storage: true
96
+ # # disk — persistent FS mount (PVC). Injects DISK_PATH. Pins to 1 replica.
97
+ # # true | { size: 1Gi, mount: /var/data } (forbidden: /proc /sys /dev)
98
+ # disk: true
99
+ # # ai — AI Gateway via @cloudgrid-io/ai. Injects AI_GATEWAY_URL. true | false.
100
+ # ai: true
101
+
102
+
103
+ # ─── INTER-ENTITY COMMUNICATION ────────────────────────────────────────────
104
+
105
+ # Entities this app calls (outbound). Service-account token injected per pair.
106
+ # calls:
107
+ # - org:atomic/billing-api
108
+
109
+ # Inbound caller policy — who can call YOUR entity.
110
+ # callers:
111
+ # policy: auto # 'auto' | 'manual' (default).
112
+ # scope: org # 'org' (default) | 'space' | 'explicit'.
113
+ # fallback: deny # 'deny' (default) | 'warn'.
114
+ # # allowed_apps: # required only when scope: explicit
115
+ # # - org:atomic/frontend
116
+
117
+
118
+ # ─── VAULT ──────────────────────────────────────────────────────────────────
119
+ #
120
+ # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
121
+ # This is the CloudGrid-correct way to inject third-party secrets (auth provider,
122
+ # Stripe, email). The platform reads the named item from the org vault and injects
123
+ # it as the env var at runtime — never hardcode or commit these.
124
+ #
125
+ # This blueprint uses a booking-provider / notification secret and (optional)
126
+ # Stripe deposit for reservations. Uncomment only the ones you actually wire.
127
+ vault:
128
+ # Stripe secret key — required only if you take a card deposit to hold a table.
129
+ # Used by the Stripe SDK in the deposit checkout + webhook routes.
130
+ STRIPE_KEY: stripe-live-key
131
+ # Transactional email/SMS provider key for confirmation + reminder messages.
132
+ SENDGRID_API_KEY: sendgrid-key
133
+ # Auth provider (Clerk/Auth0) key — only if the restaurant staff dashboard
134
+ # needs a login. Public reservation form needs no auth.
135
+ # AUTH_PROVIDER_KEY: auth-provider-secret
136
+
137
+
138
+ # ─── CONNECTORS AND HOOKS ──────────────────────────────────────────────────
139
+
140
+ # connectors:
141
+ # - id: team-slack
142
+ # target: org # 'system' | 'org'.
143
+ # channel: "#deploys"
144
+ # hooks:
145
+ # - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
146
+ # via: team-slack
147
+ # template: "Deploy failed for {entity_name}: {error}"
148
+ # channel: "#alerts"
149
+ # triggers:
150
+ # - from: team-slack
151
+ # event: message
152
+ # channel: "#support"
153
+ # route: /webhooks/slack
154
+
155
+
156
+ # ─── LOCAL DEVELOPMENT ──────────────────────────────────────────────────────
157
+
158
+ # Config for `grid dev`. Redact fields in dev data snapshots.
159
+ # dev:
160
+ # snapshot:
161
+ # mask:
162
+ # - reservations.email
163
+ # - reservations.phone
164
+
165
+
166
+ # ─── AGENT METADATA ────────────────────────────────────────────────────────
167
+
168
+ # An agent is an app with kind: agent (above) and an agent: block.
169
+ # agent:
170
+ # purpose: Sync customer data from external CRM every night
171
+ # schedule: "0 2 * * *"
172
+ # trigger: webhook
173
+
174
+
175
+ # ─── PRIVATE RESOURCE AUTO-DEPENDENCIES ────────────────────────────────────
176
+
177
+ # When true (default), private resources are auto-injected as depends_on.
178
+ # auto_depends_on_private_requires: true
179
+
180
+
181
+ # ─── SERVICES (REQUIRED) ───────────────────────────────────────────────────
182
+ #
183
+ # At least one service is required. Key = service name (slug rules).
184
+ # Types: node, nextjs, python, static, cron.
185
+ #
186
+ services:
187
+ web:
188
+ # type (REQUIRED): node | nextjs | python | static | cron
189
+ type: nextjs
190
+ # HTTP route: '/' | '/api' | false (internal) | omitted (=false + warning).
191
+ # Only one service per entity can claim '/'.
192
+ path: /
193
+ # Container port (default 8080; read process.env.PORT). Not for cron.
194
+ # port: 3000
195
+ # nextjs only: base_image: distroless (default) | alpine
196
+ # base_image: distroless
197
+ # node only: lang: javascript (default) | typescript
198
+ # lang: typescript
199
+ # Custom source location (default services/<name>/). '.' = project root.
200
+ # source:
201
+ # path: src/worker
202
+ # Health probe: false/omitted (TCP) | true (/health) | "/path" | {path,expected}
203
+ # health:
204
+ # path: /api/health
205
+ # expected: "200"
206
+ # Static runtime env vars (strings). Reserved: PORT, APP_NAME, SERVICE_NAME,
207
+ # NODE_ENV, MONGODB_URL, REDIS_URL, AI_GATEWAY_URL, N8N_WEBHOOK_URL, CLOUDGRID_*.
208
+ # env:
209
+ # LOG_LEVEL: info
210
+ # Sibling services/private resources that must be Ready first (no cron, no cycles).
211
+ # depends_on:
212
+ # - worker
213
+ # Per-service needs override (merges with app-level needs).
214
+ # needs:
215
+ # queue: true
216
+ # Static-only build step:
217
+ # build:
218
+ # command: npm run build
219
+ # output: dist
220
+ # env:
221
+ # VITE_API_URL: https://api.example.com
222
+ # node_version: "22" # static build step: '18'|'20'|'22'|'24' (quoted)
223
+ # Cron-only: schedule (REQUIRED), timezone (UTC|EST|PST), run (job | https URL)
224
+ # schedule: "0 9 * * 1"
225
+ # timezone: UTC
226
+ # run: job
227
+ # Verbose per-service persistence (prefer needs.disk):
228
+ # persist:
229
+ # - name: scratch
230
+ # path: /tmp/scratch
231
+ # size: 500Mi
232
+
233
+ # ─── CRON SERVICE (INTENDED SHAPE — NOT YET DEPLOYABLE) ──────────────────
234
+ # Scheduled confirmation / reminder sender for upcoming reservations.
235
+ # A cron service has no HTTP path; it runs `run: job` on `schedule`.
236
+ # NOTE: cron deploy is currently a PENDING platform issue (#1543). This block
237
+ # documents the intended shape only — leave it COMMENTED until cron ships,
238
+ # or the plug will reject the entity. See AGENTS.md → "Cron reminders".
239
+ # reminder:
240
+ # type: cron
241
+ # schedule: "0 15 * * *" # daily 15:00 — remind next-day bookings
242
+ # timezone: UTC
243
+ # run: job # runs services/reminder/ as a one-shot job
244
+ # # The cron job reads the SAME injected DATABASE_MONGODB_URL + vault secrets
245
+ # # (SENDGRID_API_KEY) to find tomorrow's reservations and send reminders.
246
+
247
+
248
+ needs:
249
+ database: true
250
+
251
+
252
+ # ============================================================================
253
+ # NOTES
254
+ # - NOT here: org:/entity_id: (→ .cloudgrid/link.json), secrets (→ grid secrets set),
255
+ # Dockerfile (platform generates from services.*.type).
256
+ # - Deploy: grid plug | Local with grid resources: grid dev
257
+ # - Full reference: docs/cloudgrid-yaml-reference.md | CLI: docs/cli-reference.md
258
+ # ============================================================================
@@ -0,0 +1,62 @@
1
+ # Template: restaurant-reservations (BLUEPRINT — Next.js + Mongo)
2
+
3
+ A restaurant website with online reservations. A public Next.js site (menu +
4
+ booking form / table booking) backed by grid-shared MongoDB, with CloudGrid-native
5
+ wiring for the DB, third-party secrets (`vault:`), optional Stripe deposit and
6
+ staff auth, and a scheduled reminder job. Reservations persist in Mongo — this is
7
+ a **runtime app** (local edition, async deploy), not a static page.
8
+
9
+ **This is a blueprint, not runnable code.** It ships a `cloudgrid.yaml` (active:
10
+ `name` + `services.web` nextjs + `needs: { database: true }` + a `vault:` block)
11
+ and an `AGENTS.md` structure guide. Fetch both, read `AGENTS.md`, then build the
12
+ app under `services/web/` following it — the proven `app-with-data` shape with a
13
+ `reservations` domain.
14
+
15
+ **Key rules:**
16
+
17
+ 1. **App code MUST live under `services/web/`**, not the template root. `path: /`
18
+ is the URL mount, NOT the filesystem path.
19
+ 2. **Read `DATABASE_MONGODB_URL` LAZILY** (inside the getter), legacy
20
+ `MONGODB_URL` fallback — the grid injects it; never hardcode, never commit.
21
+ 3. **Third-party secrets go through the `vault:` block** (Stripe `STRIPE_KEY`,
22
+ email `SENDGRID_API_KEY`, optional `AUTH_PROVIDER_KEY`) → injected env vars;
23
+ store values with `gridctl_secrets`.
24
+ 4. **Declare `needs: { database: true }`** (canonical) — never mix `needs:` and
25
+ `requires:`.
26
+ 5. **Cron reminder service is documented but NOT deployable yet** (platform issue
27
+ #1543) — keep the `reminder:` cron block commented.
28
+
29
+ ## Fetch bundle
30
+
31
+ ```
32
+ gridctl_fetch("template", "restaurant-reservations") # cloudgrid.yaml + AGENTS.md + README
33
+ ```
34
+
35
+ Then read `AGENTS.md` (file tree, `menu`/`reservations`/`tables` collections,
36
+ CloudGrid env/vault/deploy wiring, Stripe + auth, cron shape) and build under
37
+ `services/web/`. Deploy: `grid init` → fill → `grid plug` (async — poll to a live
38
+ URL). Local edition only.
39
+
40
+ ## cloudgrid.yaml (active fields)
41
+
42
+ ```yaml
43
+ # On disk this file is the full-annotated reference (templates/_cloudgrid.yaml.reference)
44
+ # with EVERY field present as a comment; only the fields below are uncommented
45
+ # (plus a vault: block and a COMMENTED cron reminder service), so it deploys to
46
+ # exactly these active fields.
47
+ name: restaurant-reservations
48
+ vault:
49
+ STRIPE_KEY: stripe-live-key
50
+ SENDGRID_API_KEY: sendgrid-key
51
+ services:
52
+ web:
53
+ type: nextjs
54
+ path: /
55
+ needs:
56
+ database: true
57
+ ```
58
+
59
+ > **Capability:** `needs: { database: true }` → the deployer provisions Mongo and
60
+ > injects `DATABASE_MONGODB_URL` (+ legacy `MONGODB_URL`). Vault items are injected
61
+ > as the mapped env vars. `requires:` is the deprecated v1 alias — don't mix it
62
+ > with `needs:`. See the capability-map for the full injection table.
@@ -0,0 +1,75 @@
1
+ # revenue-dashboard template — persistent Next.js + Mongo revenue dashboard
2
+
3
+ A minimal but real, deployable revenue/sales dashboard. Sales live in the
4
+ grid-shared MongoDB, so they survive refresh and are shared across
5
+ users/sessions — unlike a static page whose state is in memory only.
6
+
7
+ It shows a **total revenue** figure, a **per-product breakdown**, a **recent
8
+ sales table**, and a form to **add a sale**. Each sale is a document in a `sales`
9
+ collection: `{ product: string, amount: number, at: Date }`.
10
+
11
+ ## How the grid gives you a database
12
+
13
+ You do **not** provision a database or set a connection string. In
14
+ `cloudgrid.yaml` you declare `needs: { database: true }`, and the grid:
15
+
16
+ - provisions shared Mongo for the app, and
17
+ - injects the connection string as the **`DATABASE_MONGODB_URL`** environment
18
+ variable (plus the legacy `MONGODB_URL` alias) — at dev-time (`grid dev`) and
19
+ at runtime (after `grid plug`).
20
+
21
+ The app reads it via `process.env.DATABASE_MONGODB_URL` (with a legacy
22
+ `process.env.MONGODB_URL` fallback) in `services/web/lib/db.js` — **lazily,
23
+ inside the `getDb` getter, never at module top level** (a top-level read fails
24
+ `next build`, which imports the module for route analysis before the grid injects
25
+ the var). Never hardcode a connection string; never commit a secret.
26
+
27
+ > **Declare `needs: { database: true }` (the canonical shape).** The deployer
28
+ > provisions Mongo and injects `DATABASE_MONGODB_URL` (plus the legacy
29
+ > `MONGODB_URL` alias). `requires:` is the deprecated v1 alias — don't author new
30
+ > yaml with it, and never set `needs:` and `requires:` together (the validator
31
+ > rejects the combination).
32
+
33
+ ## Service layout
34
+
35
+ App code lives under **`services/web/`**, not the template root. `path:` in
36
+ `cloudgrid.yaml` is the URL mount, not the filesystem path — the service named
37
+ `web` means the CLI looks for `services/web/`. Files at the root fail with
38
+ `Error: Service directory not found: …/services/web`.
39
+
40
+ ## Run locally
41
+
42
+ ```bash
43
+ npm install
44
+ grid dev # runs Next.js with DATABASE_MONGODB_URL injected against dev Mongo
45
+ ```
46
+
47
+ ## Deploy
48
+
49
+ ```bash
50
+ grid plug # builds + deploys the folder (async — poll status until live)
51
+ ```
52
+
53
+ A runtime deploy is asynchronous: `plug` returns `status: building`; poll status
54
+ until the app is live, then use the returned live URL. Re-plug the same entity
55
+ to update the same URL.
56
+
57
+ ## File tree
58
+
59
+ ```
60
+ cloudgrid.yaml # name + services.web (nextjs) + needs: { database: true }
61
+ services/web/package.json # next, react, react-dom, mongodb driver only
62
+ services/web/lib/db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
63
+ services/web/app/layout.js # root layout + inline CSS
64
+ services/web/app/page.js # server component: total + per-product breakdown + recent table
65
+ services/web/app/sale-form.js # client form: POST a sale, refresh the server component
66
+ services/web/app/api/sales/route.js # GET (list) / POST (add) / DELETE (remove)
67
+ ```
68
+
69
+ ## Adapt it
70
+
71
+ - Rename the `sales` collection in `services/web/app/api/sales/route.js` and
72
+ `services/web/app/page.js` (e.g. `invoices`, `orders`, `payments`).
73
+ - Change the document fields (add currency, region, customer, MRR flags).
74
+ - Add a chart, date filters, or per-period rollups as the app grows.
75
+ - Add `cache: true` to `needs:` only if you actually need Redis.