@cloudgrid-io/mcp 0.13.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 (334) hide show
  1. package/package.json +1 -1
  2. package/src/corpus/capability-map.md +68 -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/status-page/cloudgrid.yaml +222 -4
  263. package/src/corpus/templates/status-page/index.md +3 -5
  264. package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
  265. package/src/corpus/templates/subscription-management/README.md +21 -0
  266. package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
  267. package/src/corpus/templates/subscription-management/index.md +73 -0
  268. package/src/corpus/templates/task-manager/cloudgrid.yaml +226 -8
  269. package/src/corpus/templates/task-manager/index.md +3 -0
  270. package/src/corpus/templates/ticket-system/README.md +71 -0
  271. package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
  272. package/src/corpus/templates/ticket-system/index.md +68 -0
  273. package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
  274. package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
  275. package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
  276. package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
  277. package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
  278. package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
  279. package/src/corpus/templates/time-tracking/README.md +81 -0
  280. package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
  281. package/src/corpus/templates/time-tracking/index.md +298 -0
  282. package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
  283. package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
  284. package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
  285. package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
  286. package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
  287. package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
  288. package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
  289. package/src/corpus/templates/travel-booking/README.md +17 -0
  290. package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
  291. package/src/corpus/templates/travel-booking/index.md +88 -0
  292. package/src/corpus/templates/waitlist/cloudgrid.yaml +222 -4
  293. package/src/corpus/templates/waitlist/index.md +3 -5
  294. package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
  295. package/src/corpus/templates/web-app/index.md +3 -5
  296. package/src/corpus/workflows/ai-knowledge-base.md +137 -0
  297. package/src/corpus/workflows/analytics-dashboard.md +104 -0
  298. package/src/corpus/workflows/api-dashboard.md +102 -0
  299. package/src/corpus/workflows/appointment-booking.md +143 -0
  300. package/src/corpus/workflows/approval-workflow.md +124 -0
  301. package/src/corpus/workflows/billing-dashboard.md +120 -0
  302. package/src/corpus/workflows/blog-cms.md +104 -0
  303. package/src/corpus/workflows/booking-system.md +116 -0
  304. package/src/corpus/workflows/calendar-scheduler.md +134 -0
  305. package/src/corpus/workflows/company-website.md +46 -0
  306. package/src/corpus/workflows/course-platform.md +126 -0
  307. package/src/corpus/workflows/directory.md +101 -0
  308. package/src/corpus/workflows/erp.md +125 -0
  309. package/src/corpus/workflows/event-board.md +102 -0
  310. package/src/corpus/workflows/expense-tracker.md +102 -0
  311. package/src/corpus/workflows/feature-request-board.md +105 -0
  312. package/src/corpus/workflows/financial-dashboard.md +103 -0
  313. package/src/corpus/workflows/forum.md +128 -0
  314. package/src/corpus/workflows/hr-portal.md +115 -0
  315. package/src/corpus/workflows/internal-tools-portal.md +125 -0
  316. package/src/corpus/workflows/inventory.md +101 -0
  317. package/src/corpus/workflows/invoice.md +101 -0
  318. package/src/corpus/workflows/job-board.md +101 -0
  319. package/src/corpus/workflows/lms.md +113 -0
  320. package/src/corpus/workflows/marketplace.md +123 -0
  321. package/src/corpus/workflows/membership-site.md +128 -0
  322. package/src/corpus/workflows/monitoring-dashboard.md +104 -0
  323. package/src/corpus/workflows/online-store.md +114 -0
  324. package/src/corpus/workflows/product-catalog.md +105 -0
  325. package/src/corpus/workflows/product-launch.md +43 -0
  326. package/src/corpus/workflows/project-management.md +106 -0
  327. package/src/corpus/workflows/property-listings.md +101 -0
  328. package/src/corpus/workflows/quiz-platform.md +105 -0
  329. package/src/corpus/workflows/restaurant-reservations.md +123 -0
  330. package/src/corpus/workflows/revenue-dashboard.md +102 -0
  331. package/src/corpus/workflows/subscription-management.md +141 -0
  332. package/src/corpus/workflows/ticket-system.md +101 -0
  333. package/src/corpus/workflows/time-tracking.md +104 -0
  334. package/src/corpus/workflows/travel-booking.md +115 -0
@@ -0,0 +1,106 @@
1
+ ---
2
+ name: project-management
3
+ when: "project management, projects and tasks tracker, team project board — a persistent app that tracks projects and their tasks on a status board. Needs a database → runtime → local edition."
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ capabilities_note: persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
8
+ summary: Build a persistent Next.js + Mongo project management app on the grid — a `projects` collection (name) plus a `tasks` collection (projectId, title, status todo/doing/done, assignee) with a project list and a per-project task board. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
9
+ ---
10
+
11
+ # Workflow: project-management
12
+
13
+ The user wants a project & task tracker — a team project board that **remembers**
14
+ its projects and tasks so they survive refresh and are shared across sessions.
15
+ That is a **runtime app** backed by the grid's shared Mongo, not a static page.
16
+ It is the same proven shape as `app-with-data`, with two collections:
17
+
18
+ - **projects** — `{ name }`
19
+ - **tasks** — `{ projectId, title, status: todo | doing | done, assignee }`
20
+
21
+ The UI is a project list plus a per-project task board with three status columns
22
+ (to do / doing / done); cards move between columns and carry an optional assignee.
23
+
24
+ Follow this recipe. Be honest that a runtime deploy is async (not instant like a
25
+ static drop) and that it needs the local edition.
26
+
27
+ ## 1. Edition check FIRST (hard gate)
28
+
29
+ A persistent app is a built + deployed container. It requires the **local
30
+ edition** (Claude Desktop / Claude Code) or the CLI.
31
+
32
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
33
+ hosted is inline-only and can only publish static pages. Tell the user
34
+ plainly, offer a **static version** instead, and STOP the runtime path here.
35
+ - **Local edition:** continue.
36
+
37
+ ## 2. Auth + grid
38
+
39
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
40
+ 2. A grid is required. Respect the grid picker: if the user has more than one
41
+ grid, ask which to use; do not assume a target.
42
+
43
+ ## 3. Scaffold
44
+
45
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
46
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
47
+ directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
48
+ and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
49
+ { database: true }`).
50
+
51
+ ## 4. Add the datastore + wire Mongo
52
+
53
+ 1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
54
+ `path:` is the URL mount, NOT the filesystem path.
55
+ ```yaml
56
+ name: my-project-board
57
+ services:
58
+ web:
59
+ type: nextjs
60
+ path: /
61
+ needs:
62
+ database: true
63
+ ```
64
+ **Declare the datastore with `needs: { database: true }`** — the canonical
65
+ shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
66
+ the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
67
+ author new yaml with it, and never set `needs:` and `requires:` together (the
68
+ validator rejects it).
69
+ 2. Fetch the template for the Mongo wiring + CRUD shape:
70
+ `gridctl_fetch("template", "project-management")`. It is a minimal, real
71
+ Next.js + `mongodb`-driver app under `services/web/`: a lazy client in
72
+ `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `projects`
73
+ collection, a GET/POST/PATCH/DELETE route on a `tasks` collection, a
74
+ server-component page, and a client board component.
75
+ 3. Adapt it (rename the collections, change fields, adjust the UI). **Read the DB
76
+ from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
77
+ fallback) — the grid injects it at dev-time and runtime.
78
+ - **Put the DB connection behind a lazy getter — never read the connection
79
+ string at module top level, or `next build` fails.**
80
+ - Every route file exports `const dynamic = "force-dynamic"` so data is never
81
+ cached.
82
+
83
+ ## 5. (Optional) Run locally
84
+
85
+ Mention that the user can `grid dev` to run locally against the injected Mongo
86
+ before deploying. Don't require it.
87
+
88
+ ## 6. Config
89
+
90
+ - API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
91
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
92
+ legacy `MONGODB_URL`) — the grid injects them.
93
+
94
+ ## 7. Deploy (async)
95
+
96
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
97
+ response is `status: "building"`, NOT a live URL yet.
98
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
99
+ - Surface a liveness signal while it builds — never a bare silent wait.
100
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
101
+
102
+ ## 8. Return the live URL + iterate
103
+
104
+ Give the user the live app URL — that is the deliverable. To iterate, re-plug the
105
+ SAME entity so it updates the same URL. Keep it honest: async build, local-edition
106
+ only, credentials injected by the grid.
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: property-listings
3
+ when: property listings, real estate site, rentals/homes listings — a persistent site that stores and browses properties by location and price. Needs a database → runtime → local edition.
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ capabilities_note: persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
8
+ summary: Build a persistent Next.js + Mongo property listings site on the grid — a `properties` collection (title, price:number, location, beds:number, description) with a card grid, a location/price filter, a detail view, and an admin add form. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
9
+ ---
10
+
11
+ # Workflow: property-listings
12
+
13
+ The user wants a real-estate / property listings site that **remembers** its
14
+ properties — listings that survive refresh and are shared across sessions. That
15
+ is a **runtime app** backed by the grid's shared Mongo, not a static page. It is
16
+ the same proven shape as `app-with-data`, with a `properties` domain
17
+ (title, price:number, location, beds:number, description) rendered as a card grid
18
+ with a location/price filter, a per-property detail view, and an admin add form.
19
+
20
+ Follow this recipe. Be honest that a runtime deploy is async (not instant like a
21
+ static drop) and that it needs the local edition.
22
+
23
+ ## 1. Edition check FIRST (hard gate)
24
+
25
+ A persistent app is a built + deployed container. It requires the **local
26
+ edition** (Claude Desktop / Claude Code) or the CLI.
27
+
28
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
29
+ hosted is inline-only and can only publish static pages. Tell the user
30
+ plainly, offer a **static version** instead, and STOP the runtime path here.
31
+ - **Local edition:** continue.
32
+
33
+ ## 2. Auth + grid
34
+
35
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
36
+ 2. A grid is required. Respect the grid picker: if the user has more than one
37
+ grid, ask which to use; do not assume a target.
38
+
39
+ ## 3. Scaffold
40
+
41
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
42
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
43
+ directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
44
+ and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
45
+ { database: true }`).
46
+
47
+ ## 4. Add the datastore + wire Mongo
48
+
49
+ 1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
50
+ `path:` is the URL mount, NOT the filesystem path.
51
+ ```yaml
52
+ name: my-listings
53
+ services:
54
+ web:
55
+ type: nextjs
56
+ path: /
57
+ needs:
58
+ database: true
59
+ ```
60
+ **Declare the datastore with `needs: { database: true }`** — the canonical
61
+ shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
62
+ the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
63
+ author new yaml with it, and never set `needs:` and `requires:` together (the
64
+ validator rejects it).
65
+ 2. Fetch the template for the Mongo wiring + CRUD shape:
66
+ `gridctl_fetch("template", "property-listings")`. It is a minimal, real
67
+ Next.js + `mongodb`-driver listings site under `services/web/`: a lazy client
68
+ in `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a
69
+ `properties` collection (GET supports `?location=` and `?maxPrice=` filters), a
70
+ server-component page that reads + filters, and a client card grid with a
71
+ detail view and admin add form.
72
+ 3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
73
+ from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
74
+ fallback) — the grid injects it at dev-time and runtime.
75
+ - **Put the DB connection behind a lazy getter — never read the connection
76
+ string at module top level, or `next build` fails.**
77
+
78
+ ## 5. (Optional) Run locally
79
+
80
+ Mention that the user can `grid dev` to run locally against the injected Mongo
81
+ before deploying. Don't require it.
82
+
83
+ ## 6. Config
84
+
85
+ - API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
86
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
87
+ legacy `MONGODB_URL`) — the grid injects them.
88
+
89
+ ## 7. Deploy (async)
90
+
91
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
92
+ response is `status: "building"`, NOT a live URL yet.
93
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
94
+ - Surface a liveness signal while it builds — never a bare silent wait.
95
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
96
+
97
+ ## 8. Return the live URL + iterate
98
+
99
+ Give the user the live app URL — that is the deliverable. To iterate, re-plug the
100
+ SAME entity so it updates the same URL. Keep it honest: async build, local-edition
101
+ only, credentials injected by the grid.
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: quiz-platform
3
+ when: quiz, quiz platform, trivia, assessment, questionnaire — a persistent app that stores questions and lets people take a scored quiz, with an admin form to add questions. Needs a database → runtime → local edition.
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ capabilities_note: persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
8
+ summary: Build a persistent Next.js + Mongo quiz/trivia platform on the grid — a `questions` collection ({ prompt, options: string[], answerIndex: number }) with a take-quiz UI that computes a score and an admin add-question form. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
9
+ ---
10
+
11
+ # Workflow: quiz-platform
12
+
13
+ The user wants a quiz / trivia / assessment app that **remembers** its questions
14
+ — a quiz whose question bank survives refresh and is shared across sessions.
15
+ That is a **runtime app** backed by the grid's shared Mongo, not a static page.
16
+ It is the same proven shape as `app-with-data`, with a `questions` domain
17
+ (`{ prompt: string, options: string[], answerIndex: number }`): a take-quiz UI
18
+ that lets a visitor pick one option per question and submit for a computed score,
19
+ plus an admin form that adds new questions.
20
+
21
+ Follow this recipe. Be honest that a runtime deploy is async (not instant like a
22
+ static drop) and that it needs the local edition.
23
+
24
+ ## 1. Edition check FIRST (hard gate)
25
+
26
+ A persistent app is a built + deployed container. It requires the **local
27
+ edition** (Claude Desktop / Claude Code) or the CLI.
28
+
29
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
30
+ hosted is inline-only and can only publish static pages. Tell the user
31
+ plainly, offer a **static version** instead, and STOP the runtime path here.
32
+ - **Local edition:** continue.
33
+
34
+ ## 2. Auth + grid
35
+
36
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
37
+ 2. A grid is required. Respect the grid picker: if the user has more than one
38
+ grid, ask which to use; do not assume a target.
39
+
40
+ ## 3. Scaffold
41
+
42
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
43
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
44
+ directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
45
+ and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
46
+ { database: true }`).
47
+
48
+ ## 4. Add the datastore + wire Mongo
49
+
50
+ 1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
51
+ `path:` is the URL mount, NOT the filesystem path.
52
+ ```yaml
53
+ name: my-quiz
54
+ services:
55
+ web:
56
+ type: nextjs
57
+ path: /
58
+ needs:
59
+ database: true
60
+ ```
61
+ **Declare the datastore with `needs: { database: true }`** — the canonical
62
+ shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
63
+ the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
64
+ author new yaml with it, and never set `needs:` and `requires:` together (the
65
+ validator rejects it).
66
+ 2. Fetch the template for the Mongo wiring + CRUD shape:
67
+ `gridctl_fetch("template", "quiz-platform")`. It is a minimal, real Next.js +
68
+ `mongodb`-driver quiz platform under `services/web/`: a lazy client in
69
+ `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a
70
+ `questions` collection, a server-component page that reads the collection, and
71
+ a client component (`quiz.js`) that runs the take-quiz UI (score computed by
72
+ comparing each chosen option index against the question's `answerIndex`) and
73
+ an admin add-question form.
74
+ 3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
75
+ from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
76
+ fallback) — the grid injects it at dev-time and runtime.
77
+ - **Put the DB connection behind a lazy getter — never read the connection
78
+ string at module top level, or `next build` fails.**
79
+ - Keep route handlers `export const dynamic = "force-dynamic"` so questions
80
+ are always read/written live.
81
+
82
+ ## 5. (Optional) Run locally
83
+
84
+ Mention that the user can `grid dev` to run locally against the injected Mongo
85
+ before deploying. Don't require it.
86
+
87
+ ## 6. Config
88
+
89
+ - API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
90
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
91
+ legacy `MONGODB_URL`) — the grid injects them.
92
+
93
+ ## 7. Deploy (async)
94
+
95
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
96
+ response is `status: "building"`, NOT a live URL yet.
97
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
98
+ - Surface a liveness signal while it builds — never a bare silent wait.
99
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
100
+
101
+ ## 8. Return the live URL + iterate
102
+
103
+ Give the user the live quiz URL — that is the deliverable. To iterate, re-plug
104
+ the SAME entity so it updates the same URL. Keep it honest: async build,
105
+ local-edition only, credentials injected by the grid.
@@ -0,0 +1,123 @@
1
+ ---
2
+ name: restaurant-reservations
3
+ when: "restaurant website with reservations, table booking, restaurant site — a public Next.js site with menu content and a persistent reservations/table-booking collection backed by Mongo. Runtime app → local edition. This is a BLUEPRINT: read AGENTS.md for the structure, then build the app."
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ kind: blueprint
8
+ capabilities_note: "persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Third-party secrets (Stripe deposit, email) go through the `vault:` block. A confirmation-reminder cron service is DESIGNED but NOT deployable yet (platform issue #1543)."
9
+ summary: "BLUEPRINT for a restaurant website with online reservations — a public Next.js + Mongo site (menu content + a reservations / table-booking collection) on the grid. It is structure + cloudgrid.yaml, not runnable code: fetch the template, READ AGENTS.md for the file tree, the menu/reservations/tables collections, and the CloudGrid wiring (DATABASE_MONGODB_URL injection, vault: for Stripe/email secrets, optional auth, deploy/poll), then build the app under services/web/ following it. needs:{database:true} (not requires:). Async runtime deploy, local edition only. Cron reminders are designed but PENDING #1543."
10
+ ---
11
+
12
+ # Workflow: restaurant-reservations
13
+
14
+ The user wants a **restaurant website with online reservations** — a public site
15
+ with menu content and a booking form (optionally table booking) whose
16
+ reservations **persist** and are shared across sessions. That is a **runtime app**
17
+ backed by the grid's shared Mongo, not a static page.
18
+
19
+ **This is a BLUEPRINT.** The template does NOT contain app code — it ships a
20
+ `cloudgrid.yaml` and an `AGENTS.md` structure guide. The recipe is: fetch it,
21
+ **read `AGENTS.md`**, then build the app under `services/web/` following that
22
+ structure (the proven `app-with-data` shape, with a `reservations` domain).
23
+
24
+ Be honest that a runtime deploy is async (not instant like a static drop), that
25
+ it needs the local edition, and that the confirmation-reminder **cron** service
26
+ is designed but **not yet deployable** (platform issue #1543).
27
+
28
+ ## 1. Edition check FIRST (hard gate)
29
+
30
+ A persistent app is a built + deployed container. It requires the **local
31
+ edition** (Claude Desktop / Claude Code) or the CLI.
32
+
33
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
34
+ hosted is inline-only and can only publish static pages. Tell the user plainly,
35
+ offer a **static menu page** (no bookings) instead, and STOP the runtime path.
36
+ - **Local edition:** continue.
37
+
38
+ ## 2. Auth + grid
39
+
40
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
41
+ 2. A grid is required. Respect the grid picker: if the user has more than one
42
+ grid, ask which to use; do not assume a target.
43
+
44
+ ## 3. Fetch the blueprint and READ AGENTS.md
45
+
46
+ `gridctl_fetch("template", "restaurant-reservations")`. This is a **blueprint**,
47
+ so the deliverable is `cloudgrid.yaml` + `AGENTS.md`, not app code.
48
+
49
+ **Read `AGENTS.md` before building.** It defines:
50
+ - the file tree (`services/web/{app/, lib/, api routes, package.json}`, optional
51
+ Stripe checkout + webhook routes, optional staff auth, a `services/reminder/`
52
+ cron job),
53
+ - the Mongo collections + fields (`menu`, `reservations`, `tables`),
54
+ - how CloudGrid injects the DB (`DATABASE_MONGODB_URL` / legacy `MONGODB_URL`) and
55
+ vault secrets, how to wire Stripe/auth, deploy steps, and the cron shape.
56
+
57
+ ## 4. Scaffold + fill
58
+
59
+ 1. `gridctl_init` an app `<name>` — creates the entity + `.cloudgrid/link.json`
60
+ and a `cloudgrid.yaml` with an EMPTY `services: {}`. Run `init` FIRST (plug
61
+ needs a linked directory).
62
+ 2. Write the app under **`services/web/`** (`path:` is the URL mount, NOT the
63
+ filesystem path), following `AGENTS.md`.
64
+ 3. Set `cloudgrid.yaml` to the blueprint's active fields:
65
+ ```yaml
66
+ name: my-restaurant
67
+ vault:
68
+ STRIPE_KEY: stripe-live-key # only if taking a deposit
69
+ SENDGRID_API_KEY: sendgrid-key # confirmation / reminder email
70
+ services:
71
+ web:
72
+ type: nextjs
73
+ path: /
74
+ needs:
75
+ database: true
76
+ ```
77
+ Declare `needs: { database: true }` (canonical) — the deployer provisions Mongo
78
+ and injects `DATABASE_MONGODB_URL` (+ legacy `MONGODB_URL`). `requires:` is the
79
+ deprecated v1 alias; never author it and never set `needs:` and `requires:`
80
+ together (the validator rejects the combination).
81
+ 4. **Read the DB from `process.env.DATABASE_MONGODB_URL`** (legacy `MONGODB_URL`
82
+ fallback) behind a **lazy getter** — never at module top level, or `next build`
83
+ fails. Third-party keys come from the vault-injected env vars
84
+ (`process.env.STRIPE_KEY`, `process.env.SENDGRID_API_KEY`).
85
+
86
+ ## 5. Config / secrets
87
+
88
+ - Secret values (Stripe, SendGrid, auth) → `gridctl_secrets` (the `vault:` block
89
+ maps them to env vars). Non-secret config (publishable keys, flags) →
90
+ `gridctl_env`.
91
+ - Do **NOT** set the DB vars yourself (`DATABASE_MONGODB_URL` / `MONGODB_URL`) —
92
+ the grid injects them.
93
+
94
+ ## 6. (Optional) Run locally
95
+
96
+ `grid dev` runs Next.js with `DATABASE_MONGODB_URL` and vault vars injected
97
+ against dev Mongo. Seed the `menu` collection, test a booking. Don't require it.
98
+
99
+ ## 7. Deploy (async)
100
+
101
+ Deploy `services/web/` with `gridctl_plug`. A **runtime deploy is ASYNC**: the
102
+ first response is `status: building`, NOT a live URL.
103
+ - Poll `gridctl_status` (or the returned poll URL) until live.
104
+ - Surface a liveness signal while it builds — never a bare silent wait.
105
+ - Only once live, return the deployed app URL (NOT the build/log link).
106
+ - If Stripe deposits are on, register the live `/api/webhooks/stripe` URL in the
107
+ Stripe dashboard.
108
+
109
+ ## 8. Cron reminders — PENDING #1543
110
+
111
+ The design includes a daily cron job that emails reminders to next-day bookings
112
+ (a `reminder:` cron service reading the same injected `DATABASE_MONGODB_URL` +
113
+ `SENDGRID_API_KEY`). **Cron deploy is not yet available (platform issue #1543)** —
114
+ keep the `reminder:` cron block **commented** in `cloudgrid.yaml`; an active cron
115
+ service will be rejected at plug until #1543 lands. Build the rest now; enable
116
+ cron once it ships. See `AGENTS.md` §7 for the intended shape and interim
117
+ workaround.
118
+
119
+ ## 9. Return the live URL + iterate
120
+
121
+ Give the user the live app URL — that is the deliverable. To iterate, re-plug the
122
+ SAME entity so it updates the same URL. Keep it honest: blueprint you built out,
123
+ async build, local-edition only, DB + secrets injected by the grid, cron pending.
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: revenue-dashboard
3
+ when: revenue dashboard, sales dashboard, MRR/revenue view — a persistent app that records sales and shows total revenue, a per-product breakdown, and recent activity. Needs a database → runtime → local edition.
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ capabilities_note: persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
8
+ summary: Build a persistent Next.js + Mongo revenue dashboard on the grid — a `sales` collection (product, amount:number, at) rendered as a total-revenue figure, a per-product breakdown, and a recent-sales table with an add form. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
9
+ ---
10
+
11
+ # Workflow: revenue-dashboard
12
+
13
+ The user wants a revenue / sales dashboard that **remembers** its sales — a view
14
+ whose numbers survive refresh and are shared across sessions. That is a
15
+ **runtime app** backed by the grid's shared Mongo, not a static page. It is the
16
+ same proven shape as `app-with-data`, with a `sales` domain
17
+ (`product`, `amount` as a number, `at` timestamp) and a dashboard view: a total
18
+ revenue figure, a per-product breakdown, a recent-sales table, and an add form.
19
+
20
+ Follow this recipe. Be honest that a runtime deploy is async (not instant like a
21
+ static drop) and that it needs the local edition.
22
+
23
+ ## 1. Edition check FIRST (hard gate)
24
+
25
+ A persistent app is a built + deployed container. It requires the **local
26
+ edition** (Claude Desktop / Claude Code) or the CLI.
27
+
28
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
29
+ hosted is inline-only and can only publish static pages. Tell the user
30
+ plainly, offer a **static version** instead, and STOP the runtime path here.
31
+ - **Local edition:** continue.
32
+
33
+ ## 2. Auth + grid
34
+
35
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
36
+ 2. A grid is required. Respect the grid picker: if the user has more than one
37
+ grid, ask which to use; do not assume a target.
38
+
39
+ ## 3. Scaffold
40
+
41
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
42
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
43
+ directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
44
+ and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
45
+ { database: true }`).
46
+
47
+ ## 4. Add the datastore + wire Mongo
48
+
49
+ 1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
50
+ `path:` is the URL mount, NOT the filesystem path.
51
+ ```yaml
52
+ name: my-revenue-dashboard
53
+ services:
54
+ web:
55
+ type: nextjs
56
+ path: /
57
+ needs:
58
+ database: true
59
+ ```
60
+ **Declare the datastore with `needs: { database: true }`** — the canonical
61
+ shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
62
+ the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
63
+ author new yaml with it, and never set `needs:` and `requires:` together (the
64
+ validator rejects it).
65
+ 2. Fetch the template for the Mongo wiring + CRUD shape:
66
+ `gridctl_fetch("template", "revenue-dashboard")`. It is a minimal, real
67
+ Next.js + `mongodb`-driver dashboard under `services/web/`: a lazy client in
68
+ `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `sales`
69
+ collection, a server-component page that computes the total + per-product
70
+ breakdown + recent table, and a client add-sale form.
71
+ 3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
72
+ from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
73
+ fallback) — the grid injects it at dev-time and runtime.
74
+ - **Put the DB connection behind a lazy getter — never read the connection
75
+ string at module top level, or `next build` fails.**
76
+ - Sales documents are `{ product: string, amount: number, at: Date }`; keep
77
+ `amount` numeric so the total and breakdown sums are correct.
78
+
79
+ ## 5. (Optional) Run locally
80
+
81
+ Mention that the user can `grid dev` to run locally against the injected Mongo
82
+ before deploying. Don't require it.
83
+
84
+ ## 6. Config
85
+
86
+ - API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
87
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
88
+ legacy `MONGODB_URL`) — the grid injects them.
89
+
90
+ ## 7. Deploy (async)
91
+
92
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
93
+ response is `status: "building"`, NOT a live URL yet.
94
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
95
+ - Surface a liveness signal while it builds — never a bare silent wait.
96
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
97
+
98
+ ## 8. Return the live URL + iterate
99
+
100
+ Give the user the live app URL — that is the deliverable. To iterate, re-plug the
101
+ SAME entity so it updates the same URL. Keep it honest: async build, local-edition
102
+ only, credentials injected by the grid.