@cloudgrid-io/mcp 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/package.json +1 -1
  2. package/src/corpus/capability-map.md +81 -7
  3. package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
  4. package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +226 -8
  5. package/src/corpus/templates/admin-dashboard/index.md +3 -0
  6. package/src/corpus/templates/ai-app/cloudgrid.yaml +225 -11
  7. package/src/corpus/templates/ai-app/index.md +3 -11
  8. package/src/corpus/templates/ai-knowledge-base/AGENTS.md +254 -0
  9. package/src/corpus/templates/ai-knowledge-base/README.md +28 -0
  10. package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +238 -0
  11. package/src/corpus/templates/ai-knowledge-base/index.md +81 -0
  12. package/src/corpus/templates/analytics-dashboard/README.md +85 -0
  13. package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +232 -0
  14. package/src/corpus/templates/analytics-dashboard/index.md +316 -0
  15. package/src/corpus/templates/analytics-dashboard/services/web/app/api/events/route.js +60 -0
  16. package/src/corpus/templates/analytics-dashboard/services/web/app/event-form.js +100 -0
  17. package/src/corpus/templates/analytics-dashboard/services/web/app/layout.js +41 -0
  18. package/src/corpus/templates/analytics-dashboard/services/web/app/page.js +54 -0
  19. package/src/corpus/templates/analytics-dashboard/services/web/lib/db.js +32 -0
  20. package/src/corpus/templates/analytics-dashboard/services/web/package.json +16 -0
  21. package/src/corpus/templates/api-dashboard/README.md +84 -0
  22. package/src/corpus/templates/api-dashboard/cloudgrid.yaml +233 -0
  23. package/src/corpus/templates/api-dashboard/index.md +310 -0
  24. package/src/corpus/templates/api-dashboard/services/web/app/api/requests/route.js +62 -0
  25. package/src/corpus/templates/api-dashboard/services/web/app/dashboard.js +156 -0
  26. package/src/corpus/templates/api-dashboard/services/web/app/layout.js +42 -0
  27. package/src/corpus/templates/api-dashboard/services/web/app/page.js +39 -0
  28. package/src/corpus/templates/api-dashboard/services/web/lib/db.js +32 -0
  29. package/src/corpus/templates/api-dashboard/services/web/package.json +16 -0
  30. package/src/corpus/templates/api-docs/cloudgrid.yaml +222 -4
  31. package/src/corpus/templates/api-docs/index.md +3 -5
  32. package/src/corpus/templates/api-service/cloudgrid.yaml +224 -9
  33. package/src/corpus/templates/api-service/index.md +3 -11
  34. package/src/corpus/templates/app-with-data/cloudgrid.yaml +226 -8
  35. package/src/corpus/templates/app-with-data/index.md +3 -8
  36. package/src/corpus/templates/appointment-booking/AGENTS.md +223 -0
  37. package/src/corpus/templates/appointment-booking/README.md +16 -0
  38. package/src/corpus/templates/appointment-booking/cloudgrid.yaml +250 -0
  39. package/src/corpus/templates/appointment-booking/index.md +72 -0
  40. package/src/corpus/templates/approval-workflow/AGENTS.md +170 -0
  41. package/src/corpus/templates/approval-workflow/README.md +12 -0
  42. package/src/corpus/templates/approval-workflow/cloudgrid.yaml +237 -0
  43. package/src/corpus/templates/approval-workflow/index.md +58 -0
  44. package/src/corpus/templates/billing-dashboard/AGENTS.md +199 -0
  45. package/src/corpus/templates/billing-dashboard/README.md +18 -0
  46. package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +235 -0
  47. package/src/corpus/templates/billing-dashboard/index.md +87 -0
  48. package/src/corpus/templates/blog-cms/README.md +94 -0
  49. package/src/corpus/templates/blog-cms/cloudgrid.yaml +233 -0
  50. package/src/corpus/templates/blog-cms/index.md +358 -0
  51. package/src/corpus/templates/blog-cms/services/web/app/admin/admin-editor.js +133 -0
  52. package/src/corpus/templates/blog-cms/services/web/app/admin/page.js +33 -0
  53. package/src/corpus/templates/blog-cms/services/web/app/api/posts/route.js +84 -0
  54. package/src/corpus/templates/blog-cms/services/web/app/layout.js +47 -0
  55. package/src/corpus/templates/blog-cms/services/web/app/page.js +56 -0
  56. package/src/corpus/templates/blog-cms/services/web/app/posts/[slug]/page.js +45 -0
  57. package/src/corpus/templates/blog-cms/services/web/lib/db.js +32 -0
  58. package/src/corpus/templates/blog-cms/services/web/package.json +16 -0
  59. package/src/corpus/templates/booking-system/AGENTS.md +189 -0
  60. package/src/corpus/templates/booking-system/README.md +17 -0
  61. package/src/corpus/templates/booking-system/cloudgrid.yaml +248 -0
  62. package/src/corpus/templates/booking-system/index.md +86 -0
  63. package/src/corpus/templates/calendar-scheduler/AGENTS.md +226 -0
  64. package/src/corpus/templates/calendar-scheduler/README.md +25 -0
  65. package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +259 -0
  66. package/src/corpus/templates/calendar-scheduler/index.md +85 -0
  67. package/src/corpus/templates/changelog/cloudgrid.yaml +222 -4
  68. package/src/corpus/templates/changelog/index.md +3 -5
  69. package/src/corpus/templates/company-website/README.md +54 -0
  70. package/src/corpus/templates/company-website/cloudgrid.yaml +233 -0
  71. package/src/corpus/templates/company-website/index.html +309 -0
  72. package/src/corpus/templates/company-website/index.md +29 -0
  73. package/src/corpus/templates/course-platform/AGENTS.md +161 -0
  74. package/src/corpus/templates/course-platform/README.md +26 -0
  75. package/src/corpus/templates/course-platform/cloudgrid.yaml +237 -0
  76. package/src/corpus/templates/course-platform/index.md +70 -0
  77. package/src/corpus/templates/crm/cloudgrid.yaml +226 -8
  78. package/src/corpus/templates/crm/index.md +3 -0
  79. package/src/corpus/templates/dashboard/cloudgrid.yaml +228 -4
  80. package/src/corpus/templates/dashboard/index.md +3 -5
  81. package/src/corpus/templates/deck/cloudgrid.yaml +228 -4
  82. package/src/corpus/templates/deck/index.md +3 -5
  83. package/src/corpus/templates/directory/README.md +75 -0
  84. package/src/corpus/templates/directory/cloudgrid.yaml +233 -0
  85. package/src/corpus/templates/directory/index.md +334 -0
  86. package/src/corpus/templates/directory/services/web/app/api/entries/route.js +63 -0
  87. package/src/corpus/templates/directory/services/web/app/directory-list.js +146 -0
  88. package/src/corpus/templates/directory/services/web/app/layout.js +44 -0
  89. package/src/corpus/templates/directory/services/web/app/page.js +38 -0
  90. package/src/corpus/templates/directory/services/web/lib/db.js +32 -0
  91. package/src/corpus/templates/directory/services/web/package.json +16 -0
  92. package/src/corpus/templates/docs-site/cloudgrid.yaml +222 -4
  93. package/src/corpus/templates/docs-site/index.md +3 -5
  94. package/src/corpus/templates/erp/AGENTS.md +116 -0
  95. package/src/corpus/templates/erp/README.md +17 -0
  96. package/src/corpus/templates/erp/cloudgrid.yaml +235 -0
  97. package/src/corpus/templates/erp/index.md +81 -0
  98. package/src/corpus/templates/event-board/README.md +74 -0
  99. package/src/corpus/templates/event-board/cloudgrid.yaml +233 -0
  100. package/src/corpus/templates/event-board/index.md +299 -0
  101. package/src/corpus/templates/event-board/services/web/app/api/events/route.js +61 -0
  102. package/src/corpus/templates/event-board/services/web/app/event-form.js +118 -0
  103. package/src/corpus/templates/event-board/services/web/app/layout.js +39 -0
  104. package/src/corpus/templates/event-board/services/web/app/page.js +34 -0
  105. package/src/corpus/templates/event-board/services/web/lib/db.js +32 -0
  106. package/src/corpus/templates/event-board/services/web/package.json +16 -0
  107. package/src/corpus/templates/expense-tracker/README.md +76 -0
  108. package/src/corpus/templates/expense-tracker/cloudgrid.yaml +233 -0
  109. package/src/corpus/templates/expense-tracker/index.md +305 -0
  110. package/src/corpus/templates/expense-tracker/services/web/app/api/expenses/route.js +61 -0
  111. package/src/corpus/templates/expense-tracker/services/web/app/expense-form.js +145 -0
  112. package/src/corpus/templates/expense-tracker/services/web/app/layout.js +42 -0
  113. package/src/corpus/templates/expense-tracker/services/web/app/page.js +34 -0
  114. package/src/corpus/templates/expense-tracker/services/web/lib/db.js +32 -0
  115. package/src/corpus/templates/expense-tracker/services/web/package.json +16 -0
  116. package/src/corpus/templates/feature-request-board/README.md +87 -0
  117. package/src/corpus/templates/feature-request-board/cloudgrid.yaml +233 -0
  118. package/src/corpus/templates/feature-request-board/index.md +317 -0
  119. package/src/corpus/templates/feature-request-board/services/web/app/api/requests/route.js +92 -0
  120. package/src/corpus/templates/feature-request-board/services/web/app/board.js +91 -0
  121. package/src/corpus/templates/feature-request-board/services/web/app/layout.js +43 -0
  122. package/src/corpus/templates/feature-request-board/services/web/app/page.js +35 -0
  123. package/src/corpus/templates/feature-request-board/services/web/lib/db.js +32 -0
  124. package/src/corpus/templates/feature-request-board/services/web/package.json +16 -0
  125. package/src/corpus/templates/financial-dashboard/README.md +80 -0
  126. package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +233 -0
  127. package/src/corpus/templates/financial-dashboard/index.md +326 -0
  128. package/src/corpus/templates/financial-dashboard/services/web/app/api/entries/route.js +63 -0
  129. package/src/corpus/templates/financial-dashboard/services/web/app/entry-board.js +130 -0
  130. package/src/corpus/templates/financial-dashboard/services/web/app/layout.js +46 -0
  131. package/src/corpus/templates/financial-dashboard/services/web/app/page.js +31 -0
  132. package/src/corpus/templates/financial-dashboard/services/web/lib/db.js +32 -0
  133. package/src/corpus/templates/financial-dashboard/services/web/package.json +16 -0
  134. package/src/corpus/templates/forum/AGENTS.md +196 -0
  135. package/src/corpus/templates/forum/README.md +12 -0
  136. package/src/corpus/templates/forum/cloudgrid.yaml +237 -0
  137. package/src/corpus/templates/forum/index.md +66 -0
  138. package/src/corpus/templates/hr-portal/AGENTS.md +174 -0
  139. package/src/corpus/templates/hr-portal/README.md +14 -0
  140. package/src/corpus/templates/hr-portal/cloudgrid.yaml +237 -0
  141. package/src/corpus/templates/hr-portal/index.md +56 -0
  142. package/src/corpus/templates/internal-tools-portal/AGENTS.md +201 -0
  143. package/src/corpus/templates/internal-tools-portal/README.md +17 -0
  144. package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +237 -0
  145. package/src/corpus/templates/internal-tools-portal/index.md +62 -0
  146. package/src/corpus/templates/inventory/README.md +71 -0
  147. package/src/corpus/templates/inventory/cloudgrid.yaml +233 -0
  148. package/src/corpus/templates/inventory/index.md +68 -0
  149. package/src/corpus/templates/inventory/services/web/app/api/items/route.js +88 -0
  150. package/src/corpus/templates/inventory/services/web/app/inventory-manager.js +101 -0
  151. package/src/corpus/templates/inventory/services/web/app/layout.js +36 -0
  152. package/src/corpus/templates/inventory/services/web/app/page.js +37 -0
  153. package/src/corpus/templates/inventory/services/web/lib/db.js +32 -0
  154. package/src/corpus/templates/inventory/services/web/package.json +16 -0
  155. package/src/corpus/templates/invoice/README.md +71 -0
  156. package/src/corpus/templates/invoice/cloudgrid.yaml +233 -0
  157. package/src/corpus/templates/invoice/index.md +68 -0
  158. package/src/corpus/templates/invoice/services/web/app/api/invoices/route.js +82 -0
  159. package/src/corpus/templates/invoice/services/web/app/invoice-manager.js +101 -0
  160. package/src/corpus/templates/invoice/services/web/app/layout.js +35 -0
  161. package/src/corpus/templates/invoice/services/web/app/page.js +34 -0
  162. package/src/corpus/templates/invoice/services/web/lib/db.js +32 -0
  163. package/src/corpus/templates/invoice/services/web/package.json +16 -0
  164. package/src/corpus/templates/job-board/README.md +71 -0
  165. package/src/corpus/templates/job-board/cloudgrid.yaml +233 -0
  166. package/src/corpus/templates/job-board/index.md +68 -0
  167. package/src/corpus/templates/job-board/services/web/app/api/jobs/route.js +66 -0
  168. package/src/corpus/templates/job-board/services/web/app/job-board.js +73 -0
  169. package/src/corpus/templates/job-board/services/web/app/layout.js +35 -0
  170. package/src/corpus/templates/job-board/services/web/app/page.js +32 -0
  171. package/src/corpus/templates/job-board/services/web/lib/db.js +32 -0
  172. package/src/corpus/templates/job-board/services/web/package.json +16 -0
  173. package/src/corpus/templates/kanban/cloudgrid.yaml +226 -8
  174. package/src/corpus/templates/kanban/index.md +3 -0
  175. package/src/corpus/templates/landing-page/cloudgrid.yaml +228 -4
  176. package/src/corpus/templates/landing-page/index.md +3 -5
  177. package/src/corpus/templates/lms/AGENTS.md +193 -0
  178. package/src/corpus/templates/lms/README.md +27 -0
  179. package/src/corpus/templates/lms/cloudgrid.yaml +237 -0
  180. package/src/corpus/templates/lms/index.md +79 -0
  181. package/src/corpus/templates/marketplace/AGENTS.md +208 -0
  182. package/src/corpus/templates/marketplace/README.md +22 -0
  183. package/src/corpus/templates/marketplace/cloudgrid.yaml +233 -0
  184. package/src/corpus/templates/marketplace/index.md +76 -0
  185. package/src/corpus/templates/membership-site/AGENTS.md +160 -0
  186. package/src/corpus/templates/membership-site/README.md +18 -0
  187. package/src/corpus/templates/membership-site/cloudgrid.yaml +236 -0
  188. package/src/corpus/templates/membership-site/index.md +66 -0
  189. package/src/corpus/templates/monitoring-dashboard/README.md +84 -0
  190. package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +233 -0
  191. package/src/corpus/templates/monitoring-dashboard/index.md +328 -0
  192. package/src/corpus/templates/monitoring-dashboard/services/web/app/api/checks/route.js +76 -0
  193. package/src/corpus/templates/monitoring-dashboard/services/web/app/check-form.js +124 -0
  194. package/src/corpus/templates/monitoring-dashboard/services/web/app/layout.js +44 -0
  195. package/src/corpus/templates/monitoring-dashboard/services/web/app/page.js +49 -0
  196. package/src/corpus/templates/monitoring-dashboard/services/web/lib/db.js +32 -0
  197. package/src/corpus/templates/monitoring-dashboard/services/web/package.json +16 -0
  198. package/src/corpus/templates/online-store/AGENTS.md +153 -0
  199. package/src/corpus/templates/online-store/README.md +16 -0
  200. package/src/corpus/templates/online-store/cloudgrid.yaml +234 -0
  201. package/src/corpus/templates/online-store/index.md +81 -0
  202. package/src/corpus/templates/portfolio/cloudgrid.yaml +222 -4
  203. package/src/corpus/templates/portfolio/index.md +3 -5
  204. package/src/corpus/templates/product-catalog/README.md +74 -0
  205. package/src/corpus/templates/product-catalog/cloudgrid.yaml +232 -0
  206. package/src/corpus/templates/product-catalog/index.md +330 -0
  207. package/src/corpus/templates/product-catalog/services/web/app/api/products/route.js +69 -0
  208. package/src/corpus/templates/product-catalog/services/web/app/catalog.js +153 -0
  209. package/src/corpus/templates/product-catalog/services/web/app/layout.js +49 -0
  210. package/src/corpus/templates/product-catalog/services/web/app/page.js +36 -0
  211. package/src/corpus/templates/product-catalog/services/web/lib/db.js +32 -0
  212. package/src/corpus/templates/product-catalog/services/web/package.json +16 -0
  213. package/src/corpus/templates/product-launch/README.md +46 -0
  214. package/src/corpus/templates/product-launch/cloudgrid.yaml +234 -0
  215. package/src/corpus/templates/product-launch/index.html +320 -0
  216. package/src/corpus/templates/product-launch/index.md +34 -0
  217. package/src/corpus/templates/project-management/README.md +83 -0
  218. package/src/corpus/templates/project-management/cloudgrid.yaml +233 -0
  219. package/src/corpus/templates/project-management/index.md +346 -0
  220. package/src/corpus/templates/project-management/services/web/app/api/projects/route.js +48 -0
  221. package/src/corpus/templates/project-management/services/web/app/api/tasks/route.js +85 -0
  222. package/src/corpus/templates/project-management/services/web/app/board.js +182 -0
  223. package/src/corpus/templates/project-management/services/web/app/layout.js +45 -0
  224. package/src/corpus/templates/project-management/services/web/app/page.js +49 -0
  225. package/src/corpus/templates/project-management/services/web/lib/db.js +32 -0
  226. package/src/corpus/templates/project-management/services/web/package.json +16 -0
  227. package/src/corpus/templates/property-listings/README.md +76 -0
  228. package/src/corpus/templates/property-listings/cloudgrid.yaml +233 -0
  229. package/src/corpus/templates/property-listings/index.md +335 -0
  230. package/src/corpus/templates/property-listings/services/web/app/api/properties/route.js +73 -0
  231. package/src/corpus/templates/property-listings/services/web/app/layout.js +45 -0
  232. package/src/corpus/templates/property-listings/services/web/app/listings.js +152 -0
  233. package/src/corpus/templates/property-listings/services/web/app/page.js +53 -0
  234. package/src/corpus/templates/property-listings/services/web/lib/db.js +32 -0
  235. package/src/corpus/templates/property-listings/services/web/package.json +16 -0
  236. package/src/corpus/templates/quiz-platform/README.md +84 -0
  237. package/src/corpus/templates/quiz-platform/cloudgrid.yaml +233 -0
  238. package/src/corpus/templates/quiz-platform/index.md +313 -0
  239. package/src/corpus/templates/quiz-platform/services/web/app/api/questions/route.js +69 -0
  240. package/src/corpus/templates/quiz-platform/services/web/app/layout.js +47 -0
  241. package/src/corpus/templates/quiz-platform/services/web/app/page.js +37 -0
  242. package/src/corpus/templates/quiz-platform/services/web/app/quiz.js +188 -0
  243. package/src/corpus/templates/quiz-platform/services/web/lib/db.js +32 -0
  244. package/src/corpus/templates/quiz-platform/services/web/package.json +16 -0
  245. package/src/corpus/templates/report/cloudgrid.yaml +228 -4
  246. package/src/corpus/templates/report/index.md +3 -5
  247. package/src/corpus/templates/restaurant-reservations/AGENTS.md +258 -0
  248. package/src/corpus/templates/restaurant-reservations/README.md +17 -0
  249. package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +258 -0
  250. package/src/corpus/templates/restaurant-reservations/index.md +62 -0
  251. package/src/corpus/templates/revenue-dashboard/README.md +75 -0
  252. package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +233 -0
  253. package/src/corpus/templates/revenue-dashboard/index.md +307 -0
  254. package/src/corpus/templates/revenue-dashboard/services/web/app/api/sales/route.js +60 -0
  255. package/src/corpus/templates/revenue-dashboard/services/web/app/layout.js +40 -0
  256. package/src/corpus/templates/revenue-dashboard/services/web/app/page.js +87 -0
  257. package/src/corpus/templates/revenue-dashboard/services/web/app/sale-form.js +63 -0
  258. package/src/corpus/templates/revenue-dashboard/services/web/lib/db.js +32 -0
  259. package/src/corpus/templates/revenue-dashboard/services/web/package.json +16 -0
  260. package/src/corpus/templates/saas-marketing/cloudgrid.yaml +222 -4
  261. package/src/corpus/templates/saas-marketing/index.md +3 -5
  262. package/src/corpus/templates/semantic-search/AGENTS.md +192 -0
  263. package/src/corpus/templates/semantic-search/README.md +74 -0
  264. package/src/corpus/templates/semantic-search/cloudgrid.yaml +217 -0
  265. package/src/corpus/templates/semantic-search/index.md +97 -0
  266. package/src/corpus/templates/semantic-search/services/backend/requirements.txt +7 -0
  267. package/src/corpus/templates/semantic-search/services/backend/src/app/__init__.py +0 -0
  268. package/src/corpus/templates/semantic-search/services/backend/src/app/answer.py +90 -0
  269. package/src/corpus/templates/semantic-search/services/backend/src/app/auth.py +65 -0
  270. package/src/corpus/templates/semantic-search/services/backend/src/app/config.py +110 -0
  271. package/src/corpus/templates/semantic-search/services/backend/src/app/db.py +89 -0
  272. package/src/corpus/templates/semantic-search/services/backend/src/app/embeddings.py +44 -0
  273. package/src/corpus/templates/semantic-search/services/backend/src/app/indexing.py +222 -0
  274. package/src/corpus/templates/semantic-search/services/backend/src/app/main.py +259 -0
  275. package/src/corpus/templates/semantic-search/services/backend/src/app/search.py +222 -0
  276. package/src/corpus/templates/semantic-search/services/backend/src/app/source.py +259 -0
  277. package/src/corpus/templates/semantic-search/services/backend/src/main.py +12 -0
  278. package/src/corpus/templates/semantic-search/services/web/index.html +12 -0
  279. package/src/corpus/templates/semantic-search/services/web/package-lock.json +1680 -0
  280. package/src/corpus/templates/semantic-search/services/web/package.json +19 -0
  281. package/src/corpus/templates/semantic-search/services/web/src/App.jsx +55 -0
  282. package/src/corpus/templates/semantic-search/services/web/src/api.js +125 -0
  283. package/src/corpus/templates/semantic-search/services/web/src/components/Dashboard.jsx +61 -0
  284. package/src/corpus/templates/semantic-search/services/web/src/components/ManagerLogin.jsx +39 -0
  285. package/src/corpus/templates/semantic-search/services/web/src/components/SearchView.jsx +166 -0
  286. package/src/corpus/templates/semantic-search/services/web/src/components/Settings.jsx +148 -0
  287. package/src/corpus/templates/semantic-search/services/web/src/main.jsx +10 -0
  288. package/src/corpus/templates/semantic-search/services/web/src/styles.css +78 -0
  289. package/src/corpus/templates/semantic-search/services/web/vite.config.js +10 -0
  290. package/src/corpus/templates/status-page/cloudgrid.yaml +222 -4
  291. package/src/corpus/templates/status-page/index.md +3 -5
  292. package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
  293. package/src/corpus/templates/subscription-management/README.md +21 -0
  294. package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
  295. package/src/corpus/templates/subscription-management/index.md +73 -0
  296. package/src/corpus/templates/task-manager/cloudgrid.yaml +226 -8
  297. package/src/corpus/templates/task-manager/index.md +3 -0
  298. package/src/corpus/templates/ticket-system/README.md +71 -0
  299. package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
  300. package/src/corpus/templates/ticket-system/index.md +68 -0
  301. package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
  302. package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
  303. package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
  304. package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
  305. package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
  306. package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
  307. package/src/corpus/templates/time-tracking/README.md +81 -0
  308. package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
  309. package/src/corpus/templates/time-tracking/index.md +298 -0
  310. package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
  311. package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
  312. package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
  313. package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
  314. package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
  315. package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
  316. package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
  317. package/src/corpus/templates/travel-booking/README.md +17 -0
  318. package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
  319. package/src/corpus/templates/travel-booking/index.md +88 -0
  320. package/src/corpus/templates/waitlist/cloudgrid.yaml +222 -4
  321. package/src/corpus/templates/waitlist/index.md +3 -5
  322. package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
  323. package/src/corpus/templates/web-app/index.md +3 -5
  324. package/src/corpus/workflows/ai-knowledge-base.md +137 -0
  325. package/src/corpus/workflows/analytics-dashboard.md +104 -0
  326. package/src/corpus/workflows/api-dashboard.md +102 -0
  327. package/src/corpus/workflows/appointment-booking.md +143 -0
  328. package/src/corpus/workflows/approval-workflow.md +124 -0
  329. package/src/corpus/workflows/billing-dashboard.md +120 -0
  330. package/src/corpus/workflows/blog-cms.md +104 -0
  331. package/src/corpus/workflows/booking-system.md +116 -0
  332. package/src/corpus/workflows/calendar-scheduler.md +134 -0
  333. package/src/corpus/workflows/company-website.md +46 -0
  334. package/src/corpus/workflows/course-platform.md +126 -0
  335. package/src/corpus/workflows/directory.md +101 -0
  336. package/src/corpus/workflows/erp.md +125 -0
  337. package/src/corpus/workflows/event-board.md +102 -0
  338. package/src/corpus/workflows/expense-tracker.md +102 -0
  339. package/src/corpus/workflows/feature-request-board.md +105 -0
  340. package/src/corpus/workflows/financial-dashboard.md +103 -0
  341. package/src/corpus/workflows/forum.md +128 -0
  342. package/src/corpus/workflows/hr-portal.md +115 -0
  343. package/src/corpus/workflows/internal-tools-portal.md +125 -0
  344. package/src/corpus/workflows/inventory.md +101 -0
  345. package/src/corpus/workflows/invoice.md +101 -0
  346. package/src/corpus/workflows/job-board.md +101 -0
  347. package/src/corpus/workflows/lms.md +113 -0
  348. package/src/corpus/workflows/marketplace.md +123 -0
  349. package/src/corpus/workflows/membership-site.md +128 -0
  350. package/src/corpus/workflows/monitoring-dashboard.md +104 -0
  351. package/src/corpus/workflows/online-store.md +114 -0
  352. package/src/corpus/workflows/product-catalog.md +105 -0
  353. package/src/corpus/workflows/product-launch.md +43 -0
  354. package/src/corpus/workflows/project-management.md +106 -0
  355. package/src/corpus/workflows/property-listings.md +101 -0
  356. package/src/corpus/workflows/quiz-platform.md +105 -0
  357. package/src/corpus/workflows/restaurant-reservations.md +123 -0
  358. package/src/corpus/workflows/revenue-dashboard.md +102 -0
  359. package/src/corpus/workflows/semantic-search.md +133 -0
  360. package/src/corpus/workflows/subscription-management.md +141 -0
  361. package/src/corpus/workflows/ticket-system.md +101 -0
  362. package/src/corpus/workflows/time-tracking.md +104 -0
  363. package/src/corpus/workflows/travel-booking.md +115 -0
  364. package/src/tools.js +73 -12
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: appointment-booking
3
+ when: "appointment booking, clinic/salon booking, appointment scheduler"
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ kind: blueprint
8
+ capabilities_note: "persistent — needs a database (Mongo) plus auth and optional Stripe deposit secrets. Runtime app, async build, local edition only. Declare needs { database: true } (deployer injects DATABASE_MONGODB_URL / legacy MONGODB_URL) and a vault block mapping AUTH_PROVIDER_KEY (and optionally STRIPE_KEY / STRIPE_WEBHOOK_SECRET) to env vars. This is a BLUEPRINT — read AGENTS.md for the structure, then build. A reminder cron service is designed but cron deploy is PENDING platform issue #1543 (not yet deployable)."
9
+ summary: "Build an appointment / clinic / salon booking app on the grid — a Next.js app where a business defines providers and bookable services, publishes availability, and clients book an open slot, with auth so a provider owns their calendar, optional Stripe deposits, and grid-shared Mongo (providers, services, availability, appointments). This is a BLUEPRINT: fetch the template, read AGENTS.md for the file tree + slot/anti-double-booking rules + CloudGrid wiring (needs database true, vault for auth/Stripe secrets), build the app under services/web/, deploy async, poll to a live URL. Scheduled reminders are designed but PENDING platform issue #1543."
10
+ ---
11
+
12
+ # Workflow: appointment-booking
13
+
14
+ The user wants an appointment scheduler — a clinic/salon/consultant booking app:
15
+ a business defines providers and bookable services, publishes availability, and
16
+ clients book an open time slot that no one else can take. That is a **persistent
17
+ runtime app** — a Next.js app backed by the grid's shared Mongo, with auth so a
18
+ provider owns their calendar and optional Stripe deposits.
19
+
20
+ This is a **blueprint**, not a fill-in template. There is no finished app to
21
+ copy — there is a `cloudgrid.yaml` and a structure guide (`AGENTS.md`). Read the
22
+ guide, then build the app following it. Be honest that a runtime deploy is async
23
+ (not instant like a static drop) and that it needs the local edition.
24
+
25
+ ## 1. Edition check FIRST (hard gate)
26
+
27
+ A booking app is a built + deployed container. It requires the **local edition**
28
+ (Claude Desktop / Claude Code) or the CLI.
29
+
30
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
31
+ hosted is inline-only and can only publish static pages. Tell the user plainly,
32
+ offer a static "book us" landing page instead, and STOP the runtime path here.
33
+ - **Local edition:** continue.
34
+
35
+ ## 2. Auth + grid
36
+
37
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
38
+ 2. A grid is required. Respect the grid picker: if the user has more than one
39
+ grid, ask which to use; do not assume a target.
40
+
41
+ ## 3. Read the blueprint
42
+
43
+ Fetch the template and read its structure guide — this is the core of the
44
+ workflow:
45
+
46
+ - `gridctl_fetch("template", "appointment-booking")` — the `cloudgrid.yaml` +
47
+ **`AGENTS.md`**. AGENTS.md has the file tree, the Mongo collections
48
+ (`providers`, `services`, `availability`, `appointments`), the slot-computation
49
+ and anti-double-booking rules, the CloudGrid injection table, and the auth +
50
+ Stripe wiring. **Read it fully before building.**
51
+ - `gridctl_fetch("template", "app-with-data")` — the proven Next.js + Mongo
52
+ shape this blueprint extends (lazy db client in `lib/db.js`, App-Router
53
+ GET/POST route). Imitate its wiring.
54
+
55
+ ## 4. Scaffold
56
+
57
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
58
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
59
+ directory, so run `init` FIRST. Then write the app under **`services/web/`** and
60
+ set `cloudgrid.yaml` to the active shape below.
61
+
62
+ ## 5. Build the app following AGENTS.md
63
+
64
+ Build the file tree from AGENTS.md under `services/web/`: the lazy Mongo client,
65
+ the slot-computation helper, the auth middleware, the providers/services/
66
+ availability/appointments API routes, the public booking pages, the gated
67
+ provider dashboard, and (optionally) the Stripe deposit checkout + webhook. Adapt
68
+ the providers, services, and availability rules to the user. Key non-negotiables:
69
+
70
+ - **App code under `services/web/`** — `path:` is the URL mount, NOT the
71
+ filesystem path. Root files fail with `Service directory not found`.
72
+ - **Read the DB LAZILY** from `process.env.DATABASE_MONGODB_URL` (legacy
73
+ `process.env.MONGODB_URL` fallback) inside the getter — never at module top
74
+ level, or `next build` fails.
75
+ - **Read secrets LAZILY** too — `process.env.AUTH_PROVIDER_KEY`,
76
+ `STRIPE_KEY`, `STRIPE_WEBHOOK_SECRET` — inside getters, never top-level.
77
+ - **No double-booking.** `appointments` is the source of truth for "taken".
78
+ Compute open slots as availability minus booked, re-check availability at write
79
+ time (never trust the client's slot), and guard the insert with a partial
80
+ unique index on `{ providerId, startAt }` for active statuses.
81
+
82
+ `cloudgrid.yaml` active shape:
83
+
84
+ ```yaml
85
+ name: my-appointment-booking
86
+ services:
87
+ web:
88
+ type: nextjs
89
+ path: /
90
+ needs:
91
+ database: true
92
+ vault:
93
+ AUTH_PROVIDER_KEY: auth-provider-key
94
+ STRIPE_KEY: stripe-live-key # only if taking deposits
95
+ STRIPE_WEBHOOK_SECRET: stripe-webhook-secret # only if taking deposits
96
+ ```
97
+
98
+ **Declare the datastore with `needs: { database: true }`** — the canonical
99
+ shape. `requires:` is the deprecated v1 alias; don't author new yaml with it, and
100
+ never set `needs:` and `requires:` together (the validator rejects it).
101
+
102
+ ## 6. Config / secrets
103
+
104
+ - Auth + Stripe secrets → `gridctl_secrets` (set the vault items `auth-provider-key`,
105
+ and if taking deposits `stripe-live-key`, `stripe-webhook-secret`, that the
106
+ `vault:` block maps from). The deployer injects each as its env var at runtime
107
+ and under `grid dev`.
108
+ - Non-secret config (auth publishable key `NEXT_PUBLIC_...`, Stripe price ids) →
109
+ `gridctl_env` / `services.web.env`.
110
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` / legacy
111
+ `MONGODB_URL`) — the grid injects them.
112
+
113
+ ## 7. (Optional) Run locally
114
+
115
+ Mention that the user can `grid dev` to run locally against the injected Mongo
116
+ and vault secrets before deploying. Don't require it.
117
+
118
+ ## 8. Reminders (cron) — PENDING platform issue #1543
119
+
120
+ The design wants a scheduled reminder job (notify clients ~24h before their
121
+ appointment, stamp `reminderSentAt` so each is reminded once). AGENTS.md § 7
122
+ documents the intended `reminders` cron service shape. **Cron deploy is a PENDING
123
+ platform issue (#1543) and is NOT yet deployable** — keep that service COMMENTED
124
+ in `cloudgrid.yaml`. Ship the booking app without automated reminders (or trigger
125
+ them manually / from an external scheduler) and tell the user plainly; do not
126
+ claim reminders are live.
127
+
128
+ ## 9. Deploy (async)
129
+
130
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
131
+ response is `status: "building"`, NOT a live URL yet.
132
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
133
+ - Surface a liveness signal while it builds — never a bare silent wait.
134
+ - If taking deposits, once live register the `/api/webhook` URL as the Stripe
135
+ webhook endpoint, copy the signing secret into the `stripe-webhook-secret`
136
+ vault item, and re-plug. Return the deployed app URL (NOT the build/log link).
137
+
138
+ ## 10. Return the live URL + iterate
139
+
140
+ Give the user the live app URL — that is the deliverable. To iterate, re-plug the
141
+ SAME entity so it updates the same URL. Keep it honest: async build, local-edition
142
+ only, DB injected by the grid, secrets injected from the vault, and reminders
143
+ pending cron (#1543).
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: approval-workflow
3
+ when: approval workflow, request approvals, multi-step approval system — a persistent app where requests advance through an ordered chain of approver roles (approve/reject/delegate) with an audit log. Needs a database → runtime → local edition.
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ kind: blueprint
8
+ capabilities_note: BLUEPRINT — structure + cloudgrid.yaml, not shipped app code. Persistent Next.js + Mongo. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Auth-provider roles + optional payments wired via a `vault:` secret block → env vars. Runtime app, async build, local edition only.
9
+ summary: Build a multi-step approval system on the grid — requests advance through an ordered chain of approval steps decided by assigned roles (approve/reject/delegate), with an append-only audit log and approver notifications. This is a BLUEPRINT: read AGENTS.md for the file tree, Mongo collections (users/requests/steps/audit), the state machine, and CloudGrid wiring (DB injection, vault: secrets, deploy), then build the Next.js + Mongo app under services/web/ following it. Edition-gate first, scaffold, declare needs:{database:true}, wire auth via a vault: secret, deploy async, poll to a live URL.
10
+ ---
11
+
12
+ # Workflow: approval-workflow
13
+
14
+ The user wants a **multi-step approval system**: a requester submits a request,
15
+ it advances through an ordered chain of approval steps, each step is decided
16
+ (approve / reject / delegate) by an assigned approver role, every action is
17
+ recorded in an audit log, and approvers are notified as their step activates.
18
+ That is a **persistent runtime app** backed by the grid's shared Mongo, with a
19
+ state machine, auth-provider roles, and notifications — the same proven shape as
20
+ `app-with-data`, extended.
21
+
22
+ **This is a BLUEPRINT.** The template ships the *structure* (an `AGENTS.md`
23
+ guide + a `cloudgrid.yaml`), not runnable app code. The recipe is: read the
24
+ blueprint, then build the app following it. Be honest that a runtime deploy is
25
+ async (not instant like a static drop) and that it needs the local edition.
26
+
27
+ ## 1. Edition check FIRST (hard gate)
28
+
29
+ A persistent approval app is a built + deployed container. It requires the
30
+ **local 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 mock** of the approval UI instead, and STOP the
35
+ runtime path here.
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. Read the blueprint
45
+
46
+ Fetch the blueprint and read it before building:
47
+ `gridctl_fetch("template", "approval-workflow")`. Its **`AGENTS.md`** is the
48
+ structure guide — the file tree (under `services/web/`), the Mongo collections
49
+ (`users`, `requests`, `steps`, `audit`), the **state machine** (how a request
50
+ advances / is decided across its ordered steps), how CloudGrid injects the DB
51
+ and secrets, how to wire auth roles (and optional payments), and the deploy
52
+ steps. Also fetch the concrete CRUD shape to adapt from:
53
+ `gridctl_fetch("template", "app-with-data")` (lazy `lib/db.js`, App Router
54
+ route, server page).
55
+
56
+ ## 4. Scaffold
57
+
58
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
59
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
60
+ directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**
61
+ following `AGENTS.md`, and (b) fill `cloudgrid.yaml` to the shape below.
62
+
63
+ ## 5. Build the app + wire Mongo
64
+
65
+ 1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
66
+ `path:` is the URL mount, NOT the filesystem path.
67
+ ```yaml
68
+ name: my-approvals
69
+ services:
70
+ web:
71
+ type: nextjs
72
+ path: /
73
+ needs:
74
+ database: true
75
+ ```
76
+ **Declare the datastore with `needs: { database: true }`** — the canonical
77
+ shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
78
+ the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
79
+ author new yaml with it, and never set `needs:` and `requires:` together (the
80
+ validator rejects the combination).
81
+ 2. Build the collections + state machine from `AGENTS.md`. **Read the DB from
82
+ `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
83
+ fallback) inside a **lazy getter — never at module top level**, or
84
+ `next build` fails.
85
+ 3. Keep the state machine (advance / decide across steps) in one module so the
86
+ API routes and the UI agree on legal transitions; guard every transition
87
+ server-side and never trust the client about which step is active.
88
+
89
+ ## 6. Wire auth roles (and optional payments) via `vault:`
90
+
91
+ Approvals need to know who you are and their role. Add an auth-provider SDK
92
+ (Clerk / Auth0), gate routes in `middleware.js`, and read the user + `role` in
93
+ `lib/auth.js`. The provider secret is injected the CloudGrid-correct way — via
94
+ the **`vault:` block** in `cloudgrid.yaml` mapping a vault item to an env var:
95
+
96
+ ```yaml
97
+ vault:
98
+ AUTH_PROVIDER_KEY: auth-provider-secret-key # → process.env.AUTH_PROVIDER_KEY
99
+ # STRIPE_KEY: stripe-live-key # only if an approved request charges
100
+ ```
101
+
102
+ Store the real value with `grid secrets set` (mapped by `vault:`); non-secret
103
+ config → `grid env`. Do **NOT** hardcode keys and do **NOT** set
104
+ `DATABASE_MONGODB_URL`/`MONGODB_URL` yourself — the grid injects the DB vars.
105
+
106
+ ## 7. (Optional) Run locally
107
+
108
+ Mention that the user can `grid dev` to run locally against the injected Mongo
109
+ before deploying. Don't require it.
110
+
111
+ ## 8. Deploy (async)
112
+
113
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
114
+ response is `status: "building"`, NOT a live URL yet.
115
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
116
+ - Surface a liveness signal while it builds — never a bare silent wait.
117
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
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: this is a blueprint you
123
+ built out, an async runtime build, local-edition only, credentials injected by
124
+ the grid.
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: billing-dashboard
3
+ when: billing dashboard, invoicing and payments dashboard, SaaS billing
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ kind: blueprint
8
+ capabilities_note: persistent + payments — needs a database (Mongo) and Stripe. Runtime app, async build, local edition only. This is a BLUEPRINT — read the template's AGENTS.md for the structure, then build the app. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). The Stripe key comes from the vault: block → STRIPE_KEY.
9
+ summary: Build a persistent Next.js + Mongo + Stripe SaaS billing dashboard on the grid — customers, invoices, charges, usage metering, a revenue view (MRR/outstanding), /api/checkout Stripe session to collect invoices, and a signature-verified Stripe webhook that marks invoices paid and records charges. This is a BLUEPRINT: edition-gate first, scaffold, fetch the template and read AGENTS.md for the file tree + wiring, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL lazily and STRIPE_KEY from the vault, store money as integer cents, declare needs:{database:true} (not requires:), deploy async, poll to a live URL, register the webhook in Stripe.
10
+ ---
11
+
12
+ # Workflow: billing-dashboard
13
+
14
+ The user wants a **billing / invoicing / payments dashboard** for a SaaS — a place
15
+ to track customers, issue and collect invoices, record charges, meter usage, and
16
+ see revenue (MRR, outstanding, recent invoices). That is a **runtime app** backed
17
+ by the grid's shared Mongo (`customers`, `invoices`, `charges`, `usage_events`)
18
+ plus **Stripe** for payments: a `/api/checkout` route that creates a Stripe
19
+ Checkout Session to collect an invoice, and a signature-verified webhook that marks
20
+ it paid and records the charge. Not a static page — it must remember billing state.
21
+
22
+ **This is a BLUEPRINT.** The template ships the structure + `cloudgrid.yaml`, not
23
+ finished app code. The build shape is proven `app-with-data` (Next.js App Router,
24
+ lazy Mongo, app under `services/web/`) plus the billing collections and Stripe
25
+ wiring. Be honest that a runtime deploy is async (not instant) and needs the local
26
+ edition.
27
+
28
+ ## 1. Edition check FIRST (hard gate)
29
+
30
+ A persistent billing dashboard is a built + deployed container. It requires the
31
+ **local 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. Say so plainly, offer a
35
+ **static revenue-view mockup** instead, and STOP the runtime path here.
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 grid,
42
+ ask which to use; do not assume a target.
43
+
44
+ ## 3. Scaffold
45
+
46
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
47
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
48
+ directory, so run `init` FIRST.
49
+
50
+ ## 4. Fetch the blueprint and read AGENTS.md
51
+
52
+ This is a blueprint — the structure guide is the deliverable, not copy-paste code.
53
+
54
+ 1. `gridctl_fetch("template", "billing-dashboard")`.
55
+ 2. **Read `AGENTS.md`** in the fetched template. It has: the file tree (app under
56
+ `services/web/`), the Mongo collections (`customers`, `invoices`, `charges`,
57
+ `usage_events`) and their fields, how the grid injects Mongo
58
+ (`DATABASE_MONGODB_URL`) and the Stripe key (the `vault:` block → `STRIPE_KEY`),
59
+ the checkout + webhook + usage wiring, and the deploy steps. Build the app
60
+ following it.
61
+ 3. Set `cloudgrid.yaml` to the shape below. **App code MUST live under
62
+ `services/web/`** — `path:` is the URL mount, NOT the filesystem path.
63
+ ```yaml
64
+ name: my-billing
65
+ vault:
66
+ STRIPE_KEY: stripe-live-key
67
+ services:
68
+ web:
69
+ type: nextjs
70
+ path: /
71
+ needs:
72
+ database: true
73
+ ```
74
+ **Declare the datastore with `needs: { database: true }`** — the canonical shape.
75
+ The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus the legacy
76
+ `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; never set `needs:`
77
+ and `requires:` together (the validator rejects it).
78
+
79
+ ## 5. Build the app (following AGENTS.md)
80
+
81
+ - **Read the DB from `process.env.DATABASE_MONGODB_URL`** (legacy `MONGODB_URL`
82
+ fallback) inside a **lazy getter** — never at module top level, or `next build`
83
+ fails. Never hardcode a connection string.
84
+ - **Read the Stripe key from `process.env.STRIPE_KEY`** (injected by the `vault:`
85
+ block) lazily. **Store all money as integer cents.** Compute invoice totals
86
+ server-side from the stored line items — never trust an amount sent by the browser.
87
+ - The **webhook** reads the RAW request body (`await request.text()`), verifies the
88
+ Stripe signature, marks the invoice `paid`, and upserts a `charges` doc by the
89
+ Stripe payment id (idempotent) with the authoritative total from the verified event.
90
+ - Meter usage via `/api/usage` into `usage_events`; the revenue view aggregates
91
+ `charges` (revenue), `invoices` (outstanding), and `usage_events` per period.
92
+ - (Optional) `grid dev` to run locally against the injected Mongo + a Stripe test
93
+ key before deploying.
94
+
95
+ ## 6. Config
96
+
97
+ - Stripe secrets → the vault: `gridctl_secrets` to set `stripe-live-key` (and a
98
+ `stripe-webhook-secret` if you map one). The `vault:` block turns them into env
99
+ vars. Non-secret config → `gridctl_env`.
100
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` /
101
+ `MONGODB_URL`) — the grid injects them.
102
+
103
+ ## 7. Deploy (async)
104
+
105
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
106
+ response is `status: "building"`, NOT a live URL yet.
107
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
108
+ - Surface a liveness signal while it builds — never a bare silent wait.
109
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
110
+
111
+ ## 8. Wire the Stripe webhook + return the live URL
112
+
113
+ 1. Register `<live-url>/api/webhook` as a webhook endpoint in the Stripe dashboard,
114
+ copy its `whsec_…` secret into the vault, and re-`gridctl_plug` the SAME entity
115
+ if you changed the `vault:` mapping (same URL).
116
+ 2. Give the user the live dashboard URL — that is the deliverable. To iterate,
117
+ re-plug the SAME entity so it updates the same URL.
118
+
119
+ Keep it honest: blueprint (build from AGENTS.md), async build, local-edition only,
120
+ Mongo + Stripe credentials injected by the grid / vault.
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: blog-cms
3
+ when: blog, CMS, content site with posts, publishing platform, articles — a persistent app that stores and publishes posts (title, body, tags, published flag). 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 blog / CMS on the grid — a `posts` collection (title, slug, body, tags, published, createdAt) with a public list, a single-post page, and an admin create/delete screen. 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: blog-cms
12
+
13
+ The user wants a blog, content site, or CMS that **remembers** its posts — a
14
+ publishing platform whose articles 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 a `posts`
17
+ domain (title, slug, body, tags, published, createdAt): a public post list, a
18
+ single-post page at `/posts/[slug]`, and an admin screen to create and delete
19
+ posts (drafts stay off the public list).
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-blog
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", "blog-cms")`. It is a minimal, real Next.js +
68
+ `mongodb`-driver blog under `services/web/`: a lazy client in
69
+ `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `posts`
70
+ collection, a server-component list page, a single-post page at
71
+ `app/posts/[slug]/page.js`, and an admin server page + client 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 DB-reading pages and the API route `export const dynamic =
78
+ "force-dynamic"`** so they read/write live data instead of being
79
+ statically prerendered at build.
80
+
81
+ ## 5. (Optional) Run locally
82
+
83
+ Mention that the user can `grid dev` to run locally against the injected Mongo
84
+ before deploying. Don't require it.
85
+
86
+ ## 6. Config
87
+
88
+ - API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
89
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
90
+ legacy `MONGODB_URL`) — the grid injects them.
91
+
92
+ ## 7. Deploy (async)
93
+
94
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
95
+ response is `status: "building"`, NOT a live URL yet.
96
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
97
+ - Surface a liveness signal while it builds — never a bare silent wait.
98
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
99
+
100
+ ## 8. Return the live URL + iterate
101
+
102
+ Give the user the live blog URL — that is the deliverable. To iterate, re-plug
103
+ the SAME entity so it updates the same URL. Keep it honest: async build,
104
+ local-edition only, credentials injected by the grid.
@@ -0,0 +1,116 @@
1
+ ---
2
+ name: booking-system
3
+ when: booking system, reservations, appointment booking, scheduling — a persistent app where users reserve time slots / appointments that survive refresh and are shared across sessions. Needs a database → runtime → local edition.
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. BLUEPRINT — ships structure + cloudgrid.yaml, not app code; read AGENTS.md and build. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Payment/auth secrets via the `vault:` block → env vars. Reminder cron is NOT yet deployable (platform issue #1543)."
9
+ summary: "Build a persistent Next.js + Mongo appointment / reservation booking system on the grid — `services`, `availabilityRules`, `bookings` collections with slot-availability logic, Stripe checkout, an auth provider, and a (pending) reminder cron. This is a BLUEPRINT: fetch it, read AGENTS.md for the file tree + data model + CloudGrid wiring, then build the app under services/web/. Edition-gate first, scaffold, declare needs:{database:true} (not requires:), map secrets via vault:, deploy async, poll to a live URL."
10
+ ---
11
+
12
+ # Workflow: booking-system
13
+
14
+ The user wants a booking / reservations / appointment-scheduling app that
15
+ **remembers** its bookings — reservations that survive refresh and are shared
16
+ across sessions. That is a **runtime app** backed by the grid's shared Mongo, not
17
+ a static page. The proven runtime shape is the same as `app-with-data` (Next.js +
18
+ lazy Mongo client under `services/web/`), with a booking domain (bookable
19
+ `services`, `availabilityRules`, and `bookings` with slot-overlap protection),
20
+ Stripe checkout for paid appointments, an auth provider for accounts, and a
21
+ scheduled reminder job.
22
+
23
+ **This is a BLUEPRINT.** It does NOT ship prewritten app code — it ships the
24
+ annotated `cloudgrid.yaml` and an `AGENTS.md` structure guide (file tree, Mongo
25
+ data model, and CloudGrid wiring). Fetch it, **read `AGENTS.md`**, then build the
26
+ app under `services/web/` following it.
27
+
28
+ Follow this recipe. Be honest that a runtime deploy is async (not instant like a
29
+ static drop), that it needs the local edition, and that the reminder **cron
30
+ service is not yet deployable** (platform issue #1543).
31
+
32
+ ## 1. Edition check FIRST (hard gate)
33
+
34
+ A persistent app is a built + deployed container. It requires the **local
35
+ edition** (Claude Desktop / Claude Code) or the CLI.
36
+
37
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
38
+ hosted is inline-only and can only publish static pages. Tell the user plainly,
39
+ offer a **static preview** instead, and STOP the runtime path here.
40
+ - **Local edition:** continue.
41
+
42
+ ## 2. Auth + grid
43
+
44
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
45
+ 2. A grid is required. Respect the grid picker: if the user has more than one
46
+ grid, ask which to use; do not assume a target.
47
+
48
+ ## 3. Read the blueprint, then scaffold
49
+
50
+ 1. Fetch the blueprint: `gridctl_fetch("template", "booking-system")`. **Read its
51
+ `AGENTS.md`** — it is the structure guide (file tree under `services/web/`, the
52
+ `services` / `availabilityRules` / `bookings` collections + the double-booking
53
+ guard, how CloudGrid injects the DB and vault secrets, how to wire Stripe +
54
+ auth, and the reminder-cron design).
55
+ 2. `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
56
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a
57
+ linked directory, so run `init` FIRST.
58
+
59
+ ## 4. Build the app + set cloudgrid.yaml
60
+
61
+ 1. Build the files under **`services/web/`** per the AGENTS.md file tree. **App
62
+ code MUST live under `services/<name>/`** — `path:` is the URL mount, NOT the
63
+ filesystem path.
64
+ 2. Set `cloudgrid.yaml` to the blueprint shape:
65
+ ```yaml
66
+ name: my-booking
67
+ vault:
68
+ STRIPE_KEY: stripe-live-key
69
+ STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
70
+ AUTH_PROVIDER_KEY: auth-provider-key
71
+ services:
72
+ web:
73
+ type: nextjs
74
+ path: /
75
+ needs:
76
+ database: true
77
+ ```
78
+ **Declare the datastore with `needs: { database: true }`** — the canonical
79
+ shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
80
+ the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
81
+ author new yaml with it, and never set `needs:` and `requires:` together (the
82
+ validator rejects it).
83
+ 3. **Read every injected var lazily** (inside a getter), never at module top level
84
+ — `process.env.DATABASE_MONGODB_URL || process.env.MONGODB_URL`, and the vault
85
+ secrets (`STRIPE_KEY`, etc.) the same way. A top-level read fails `next build`.
86
+ 4. **Keep the reminder cron COMMENTED.** cron deploy is PENDING platform issue
87
+ #1543 — `plug` rejects a `type: cron` service. Ship `web` alone; use the
88
+ stopgap in AGENTS.md §7 for reminders until #1543 lands.
89
+
90
+ ## 5. Config (secrets)
91
+
92
+ - Payment/auth secrets → add the vault items with `gridctl_secrets` (e.g.
93
+ `stripe-live-key`, `stripe-webhook-secret`, `auth-provider-key`) BEFORE plug so
94
+ the `vault:` mappings resolve. Non-secret config → `gridctl_env`.
95
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` / legacy
96
+ `MONGODB_URL`) — the grid injects them.
97
+
98
+ ## 6. (Optional) Run locally
99
+
100
+ Mention that the user can `grid dev` to run locally against the injected Mongo +
101
+ vault env vars before deploying. Good for testing slot/availability logic. Don't
102
+ require it.
103
+
104
+ ## 7. Deploy (async)
105
+
106
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
107
+ response is `status: "building"`, NOT a live URL yet.
108
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
109
+ - Surface a liveness signal while it builds — never a bare silent wait.
110
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
111
+
112
+ ## 8. Return the live URL + iterate
113
+
114
+ Give the user the live app URL — that is the deliverable. To iterate, re-plug the
115
+ SAME entity so it updates the same URL. Keep it honest: async build, local-edition
116
+ only, credentials injected by the grid, and the reminder cron pending #1543.