@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,125 @@
1
+ ---
2
+ name: erp
3
+ when: ERP, enterprise resource planning, integrated business system — a large, persistent multi-module app (inventory + orders + finance + HR) with auth/RBAC, backed by a database → runtime → local edition.
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ kind: blueprint
8
+ capabilities_note: persistent + large/multi-module — needs a database (Mongo) plus a provider SDK auth (Clerk/Auth0) and Stripe billing, with keys from the vault. Runtime app, async build, local edition only. Declare `needs: { database: true }` (deployer injects DATABASE_MONGODB_URL / legacy MONGODB_URL) and a `vault:` block for auth + Stripe keys. This is a BLUEPRINT — no app code ships; read AGENTS.md for the structure, then build.
9
+ summary: Build a persistent Next.js + Mongo ERP on the grid — inventory + orders + finance + HR modules in one App-Router service, with auth/RBAC (Clerk/Auth0, keys from vault:) and Stripe billing (STRIPE_KEY from vault:). Collections: items, orders, invoices, payments, employees. This is a BLUEPRINT: fetch it, read AGENTS.md for the file tree + CloudGrid wiring (DATABASE_MONGODB_URL, vault keys, deploy), then build the app under services/web/. Edition-gate first, scaffold, declare needs:{database:true} + vault: auth/Stripe keys (never requires:), deploy async, poll to a live URL.
10
+ ---
11
+
12
+ # Workflow: erp
13
+
14
+ The user wants an ERP / integrated business system — inventory, orders, finance,
15
+ and HR in one place, with authentication and role-based access (RBAC). Every
16
+ module's records must **remember** across refresh and be shared across users, so
17
+ this is a **large, persistent runtime app** backed by the grid's shared Mongo,
18
+ with a provider SDK for auth and Stripe for the finance module — not a static
19
+ page.
20
+
21
+ This is a **blueprint**, and it is large and multi-module. No app code ships.
22
+ Fetch the template, **read its `AGENTS.md` for the structure** (file tree, the
23
+ per-module Mongo collections — `items` / `orders` / `invoices` / `payments` /
24
+ `employees` — CloudGrid wiring for DB + vault-backed auth and Stripe keys, and
25
+ the deploy flow), then build the app following it.
26
+
27
+ Follow this recipe. Be honest that this is a big build, that a runtime deploy is
28
+ async (not instant like a static drop), and that it needs the local edition.
29
+
30
+ ## 1. Edition check FIRST (hard gate)
31
+
32
+ A persistent, auth-gated multi-module app is a built + deployed container. It
33
+ requires the **local edition** (Claude Desktop / Claude Code) or the CLI.
34
+
35
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
36
+ hosted is inline-only and can only publish static pages. Tell the user plainly,
37
+ offer a **static mock** of one screen instead, and STOP the runtime path here.
38
+ - **Local edition:** continue.
39
+
40
+ ## 2. Auth + grid
41
+
42
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
43
+ 2. A grid is required. Respect the grid picker: if the user has more than one
44
+ grid, ask which to use; do not assume a target.
45
+
46
+ ## 3. Fetch the blueprint + read AGENTS.md
47
+
48
+ `gridctl_fetch("template", "erp")`. It returns `cloudgrid.yaml`, `AGENTS.md` (the
49
+ structure guide), and the README — **no app code**. Read `AGENTS.md` end to end
50
+ before writing anything: it defines the `services/web/` file tree, the Mongo
51
+ collections + fields per module, how CloudGrid injects the DB and the
52
+ vault-backed auth + Stripe keys, how to wire auth/RBAC and the Stripe
53
+ checkout/webhook flow, and the deploy steps. Because this is large, agree with
54
+ the user on which modules to build first (e.g. inventory + orders) rather than
55
+ all four at once.
56
+
57
+ ## 4. Scaffold
58
+
59
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
60
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
61
+ directory, so run `init` FIRST. Then (a) build the app under **`services/web/`**
62
+ following `AGENTS.md`, and (b) fill `cloudgrid.yaml` to the shape below.
63
+
64
+ ## 5. Build the app + set cloudgrid.yaml
65
+
66
+ 1. Build the Next.js App-Router app under `services/web/` per `AGENTS.md` — one
67
+ `web` service hosting each module as its own API-route group + UI page
68
+ (`inventory`, `orders`, `finance`, `hr`), the collections, auth middleware,
69
+ `lib/db.js` (lazy Mongo), `lib/auth.js` (session + `requireRole`), and
70
+ `lib/stripe.js` (lazy Stripe). **App code MUST live under `services/<name>/`**
71
+ — `path:` is the URL mount, NOT the filesystem path.
72
+ 2. Set `cloudgrid.yaml` to the active shape:
73
+ ```yaml
74
+ name: my-erp
75
+ vault:
76
+ AUTH_PROVIDER_KEY: auth-provider-secret # Clerk/Auth0 backend key (RBAC)
77
+ STRIPE_KEY: stripe-live-key # Stripe secret key (finance module)
78
+ services:
79
+ web:
80
+ type: nextjs
81
+ path: /
82
+ needs:
83
+ database: true
84
+ ```
85
+ **Declare the datastore with `needs: { database: true }`** — the canonical
86
+ shape. The deployer provisions ONE Mongo (model each module as a collection in
87
+ it) and injects `DATABASE_MONGODB_URL` (plus the legacy `MONGODB_URL` alias).
88
+ Read it **lazily inside a getter**, never at module top level (a top-level read
89
+ fails `next build`). `requires:` is the deprecated v1 alias; don't author new
90
+ yaml with it, and never set `needs:` and `requires:` together (the validator
91
+ rejects it).
92
+ 3. **Auth + Stripe keys come from the `vault:` block, not committed env files.**
93
+ The `vault:` map injects `AUTH_PROVIDER_KEY` and `STRIPE_KEY` as env vars at
94
+ build + runtime. (Add `ai: true` to `needs:` only if a module — e.g. demand
95
+ forecasting — actually uses the AI gateway.)
96
+
97
+ ## 6. Config
98
+
99
+ - Create the vault items the `vault:` block references (the auth provider's
100
+ backend key and the Stripe secret key) — `gridctl_secrets` / vault UI. Never
101
+ commit them. Publishable/front-end auth keys → `gridctl_env`.
102
+ - Register the deployed `/api/finance/webhook` URL as the Stripe webhook endpoint
103
+ once the app is live.
104
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
105
+ legacy `MONGODB_URL`) — the grid injects them.
106
+
107
+ ## 7. (Optional) Run locally
108
+
109
+ Mention that the user can `grid dev` to run locally against the injected Mongo +
110
+ vault env vars before deploying. Don't require it.
111
+
112
+ ## 8. Deploy (async)
113
+
114
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
115
+ response is `status: "building"`, NOT a live URL yet.
116
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
117
+ - Surface a liveness signal while it builds — never a bare silent wait.
118
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
119
+
120
+ ## 9. Return the live URL + iterate
121
+
122
+ Give the user the live app URL — that is the deliverable. To iterate (add the
123
+ remaining modules, refine RBAC, wire more of finance), re-plug the SAME entity so
124
+ it updates the same URL. Keep it honest: large build, async deploy, local-edition
125
+ only, DB + auth + Stripe credentials injected by the grid / vault.
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: event-board
3
+ when: event board, events listing, community events, meetup board — a persistent app that lists upcoming events (title, date, location, description) with add/delete, sorted by date. 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 event board on the grid — an `events` collection (title, date, location, description) shown as an upcoming list sorted by date, with add / delete. 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: event-board
12
+
13
+ The user wants a community event board / events listing that **remembers** its
14
+ events — a board whose entries 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 an `events` domain
17
+ (title, date, location, description) shown as an upcoming list sorted by date
18
+ ascending (soonest first), with add and delete.
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-event-board
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", "event-board")`. It is a minimal, real Next.js +
67
+ `mongodb`-driver event board under `services/web/`: a lazy client in
68
+ `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on an `events`
69
+ collection, a server-component page that reads events sorted by date, and a
70
+ client form + upcoming list.
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
+ - The upcoming board sorts by `date` ascending both server-side (`.sort({ date:
77
+ 1 })`) and client-side after each add.
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.
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: expense-tracker
3
+ when: expense tracker, spending log, budget tracker, expense report — a persistent app that logs expenses (description, amount, category, date), lists them, and totals by category. 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 expense tracker on the grid — an `expenses` collection (description, amount:number, category, date) with add / delete, a table view, and totals by category. 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: expense-tracker
12
+
13
+ The user wants an expense tracker / spending log / budget tracker that
14
+ **remembers** its expenses — records that survive refresh and are shared across
15
+ sessions. That is a **runtime app** backed by the grid's shared Mongo, not a
16
+ static page. It is the same proven shape as `app-with-data`, with an `expenses`
17
+ domain (`description`, `amount` as a number, `category`, `date`), a table view,
18
+ and totals by category (plus a grand total).
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-expenses
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", "expense-tracker")`. It is a minimal, real Next.js +
67
+ `mongodb`-driver expense tracker under `services/web/`: a lazy client in
68
+ `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on an `expenses`
69
+ collection, a server-component page, and a client form with a table + totals
70
+ by category.
71
+ 3. Adapt it (adjust the category list, change fields, tweak the UI). **Read the
72
+ DB 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
+ - Store `amount` as a number and keep `date` as an ISO `YYYY-MM-DD` string so
77
+ totals and sorting stay simple.
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.
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: feature-request-board
3
+ when: feature request board, feedback board, roadmap voting, idea board — a persistent app where users add requests and upvote them, each with a status. 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 feature request board on the grid — a `requests` collection (title, description, votes:number, status of open/planned/done) with list / upvote (atomic increment) / add. 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: feature-request-board
12
+
13
+ The user wants a feature request / feedback board — a page where people add
14
+ requests, **upvote** the ones they care about, and each request carries a status
15
+ (open / planned / done). Votes and requests must **persist** and be shared across
16
+ users, so this is a **runtime app** backed by the grid's shared Mongo, not a
17
+ static page. It is the same proven shape as `app-with-data`, with a `requests`
18
+ domain (title, description, votes:number, status) and a voting board view.
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 (a voting board whose state lives
31
+ in memory only, lost on refresh), 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-board
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", "feature-request-board")`. It is a minimal, real
68
+ Next.js + `mongodb`-driver board under `services/web/`: a lazy client in
69
+ `services/web/lib/db.js`, an App-Router GET/POST/PATCH/DELETE route on a
70
+ `requests` collection (PATCH does an atomic `$inc` upvote), a server-component
71
+ page, and a client voting board.
72
+ 3. Adapt it (rename the collection, change fields, adjust the UI). The domain is
73
+ `requests { title, description, votes:number, status(open/planned/done) }`
74
+ with list (votes desc) + upvote (increment) + add. **Read the DB from
75
+ `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 the vote increment atomic on the server (`$inc`), so concurrent upvotes
80
+ don't clobber each other.
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 app URL — that is the deliverable. To iterate, re-plug the
104
+ SAME entity so it updates the same URL. Keep it honest: async build, local-edition
105
+ only, credentials injected by the grid.
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: financial-dashboard
3
+ when: financial dashboard, finance metrics, P&L, cashflow board — a persistent app that tracks income/expense entries by account and shows income/expense/net totals with a table. 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 financial dashboard on the grid — an `entries` collection (account, amount:number, type income/expense, at) with income/expense/net totals + table + add/delete. 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: financial-dashboard
12
+
13
+ The user wants a financial dashboard / P&L / cashflow board that **remembers**
14
+ its numbers — income and expense entries whose records survive refresh and are
15
+ shared across sessions. That is a **runtime app** backed by the grid's shared
16
+ Mongo, not a static page. It is the same proven shape as `app-with-data`, with an
17
+ `entries` domain (account, amount:number, type of income/expense, at) and a
18
+ dashboard view: income / expense / net totals above a table with add and per-row
19
+ delete.
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-dashboard
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", "financial-dashboard")`. It is a minimal, real
68
+ Next.js + `mongodb`-driver dashboard under `services/web/`: a lazy client in
69
+ `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on an `entries`
70
+ collection, a server-component page that computes income/expense/net totals,
71
+ and a client board (totals cards + table + 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
+ - Keep the API route `export const dynamic = "force-dynamic"` so it always
78
+ reads/writes live data.
79
+
80
+ ## 5. (Optional) Run locally
81
+
82
+ Mention that the user can `grid dev` to run locally against the injected Mongo
83
+ before deploying. Don't require it.
84
+
85
+ ## 6. Config
86
+
87
+ - API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
88
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
89
+ legacy `MONGODB_URL`) — the grid injects them.
90
+
91
+ ## 7. Deploy (async)
92
+
93
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
94
+ response is `status: "building"`, NOT a live URL yet.
95
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
96
+ - Surface a liveness signal while it builds — never a bare silent wait.
97
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
98
+
99
+ ## 8. Return the live URL + iterate
100
+
101
+ Give the user the live app URL — that is the deliverable. To iterate, re-plug the
102
+ SAME entity so it updates the same URL. Keep it honest: async build, local-edition
103
+ only, credentials injected by the grid.
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: forum
3
+ when: "forum, discussion board, community forum, threaded discussions"
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ kind: blueprint
8
+ capabilities_note: >-
9
+ persistent — needs a database (Mongo). Runtime app, async build, local edition
10
+ only. Sign-in-to-post auth via a hosted provider (Clerk/Auth0) with keys from
11
+ the org vault (vault block maps items to env vars). Declare the canonical needs
12
+ database=true; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
13
+ BLUEPRINT — ships structure + cloudgrid.yaml, not app code.
14
+ summary: >-
15
+ Build a persistent threaded community forum on the grid — Next.js + Mongo with
16
+ threads / posts (self-referential parentId nesting) / users collections,
17
+ sign-in-to-post auth via a hosted provider (keys from the vault block), and
18
+ moderation. This is a BLUEPRINT — read templates/forum/AGENTS.md for the file
19
+ tree, Mongo schema, secret/DB injection, and auth wiring, then build the app
20
+ under services/web/. Edition-gate first, scaffold, declare needs database=true
21
+ (not requires) plus a vault block for auth keys, deploy async, poll to a live URL.
22
+ ---
23
+
24
+ # Workflow: forum
25
+
26
+ The user wants a **community forum / discussion board** — members sign in, start
27
+ threads, and post **nested replies**, with moderation. That is a **persistent
28
+ runtime app** backed by the grid's shared Mongo, not a static page: threads and
29
+ replies must survive refresh and be shared across everyone. The shape mirrors the
30
+ proven `app-with-data` template, with a `threads` → `posts` domain (self-referential
31
+ `parentId` nesting) plus a thin `users` mirror, and sign-in-to-post auth via a
32
+ hosted provider.
33
+
34
+ **This is a BLUEPRINT.** The `forum` template ships the STRUCTURE and the
35
+ `cloudgrid.yaml`, not runnable app code. **Read `templates/forum/AGENTS.md`
36
+ first** — it is the structure guide (file tree, Mongo collections + fields, how
37
+ CloudGrid injects the DB + vault secrets, how to wire auth + moderation, deploy
38
+ steps) — then build the app under `services/web/` following it.
39
+
40
+ Be honest that a runtime deploy is async (not instant like a static drop) and
41
+ that it needs the local edition.
42
+
43
+ ## 1. Edition check FIRST (hard gate)
44
+
45
+ A persistent app is a built + deployed container. It requires the **local
46
+ edition** (Claude Desktop / Claude Code) or the CLI.
47
+
48
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
49
+ hosted is inline-only and can only publish static pages. Tell the user
50
+ plainly, offer a **static read-only mock** instead, and STOP the runtime path.
51
+ - **Local edition:** continue.
52
+
53
+ ## 2. Auth + grid
54
+
55
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
56
+ 2. A grid is required. Respect the grid picker: if the user has more than one
57
+ grid, ask which to use; do not assume a target.
58
+
59
+ ## 3. Read the blueprint, then scaffold
60
+
61
+ 1. **Fetch the blueprint: `gridctl_fetch("template", "forum")`** and read
62
+ `AGENTS.md` — it defines the file tree, the `threads` / `posts` / `users`
63
+ collections + fields, the nesting model, and the CloudGrid wiring. This is the
64
+ spec you build to.
65
+ 2. `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
66
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a
67
+ linked directory, so run `init` FIRST. Then write the app under
68
+ **`services/web/`** and fill `cloudgrid.yaml` to the shape below.
69
+
70
+ ## 4. Build the app + wire Mongo, auth, moderation
71
+
72
+ Follow `AGENTS.md`. Set `cloudgrid.yaml` to the active shape (app code lives under
73
+ `services/web/`; `path:` is the URL mount, NOT the filesystem path):
74
+
75
+ ```yaml
76
+ name: my-forum
77
+ services:
78
+ web:
79
+ type: nextjs
80
+ path: /
81
+ vault:
82
+ AUTH_PROVIDER_SECRET_KEY: auth-provider-secret-key
83
+ AUTH_PROVIDER_PUBLISHABLE_KEY: auth-provider-publishable-key
84
+ needs:
85
+ database: true
86
+ ```
87
+
88
+ - **Declare the datastore with `needs: { database: true }`** — the canonical
89
+ shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
90
+ the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias — don't
91
+ author new yaml with it, and never set `needs:` and `requires:` together (the
92
+ validator rejects it).
93
+ - **Read the DB from `process.env.DATABASE_MONGODB_URL`** (legacy `MONGODB_URL`
94
+ fallback) behind a **lazy getter** in `services/web/lib/db.js` — never read the
95
+ connection string at module top level, or `next build` fails.
96
+ - **Auth (sign-in-to-post):** add a hosted provider SDK (Clerk / Auth0). Map the
97
+ provider's keys through the `vault:` block → env vars (rename to the exact env
98
+ names the SDK expects, e.g. `CLERK_SECRET_KEY`). Reading threads is public;
99
+ `POST`/`PATCH`/`DELETE` require a session (guard in `middleware.js` + the write
100
+ routes). See `AGENTS.md` §4.
101
+ - **Moderation:** allow delete/edit only for the author or a `moderator` role;
102
+ prefer **soft delete** on posts (`deleted: true`) so the reply tree stays intact.
103
+
104
+ ## 5. (Optional) Run locally
105
+
106
+ Mention that the user can `grid dev` to run locally against the injected Mongo
107
+ (and vault-injected auth keys) before deploying. Don't require it.
108
+
109
+ ## 6. Config
110
+
111
+ - Auth-provider keys / secrets → the `vault:` block + `gridctl_secrets`. Non-secret
112
+ config → `gridctl_env`.
113
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
114
+ legacy `MONGODB_URL`) — the grid injects them.
115
+
116
+ ## 7. Deploy (async)
117
+
118
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
119
+ response is `status: "building"`, NOT a live URL yet.
120
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
121
+ - Surface a liveness signal while it builds — never a bare silent wait.
122
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
123
+
124
+ ## 8. Return the live URL + iterate
125
+
126
+ Give the user the live forum URL — that is the deliverable. To iterate, re-plug
127
+ the SAME entity so it updates the same URL. Keep it honest: this is a blueprint you
128
+ built out, async build, local-edition only, credentials injected by the grid.