@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,134 @@
1
+ ---
2
+ name: calendar-scheduler
3
+ when: "calendar scheduler, team calendar, scheduling app, meeting scheduler"
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ kind: blueprint
8
+ capabilities_note: "persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical needs:{database:true}; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Scheduled reminders want a type:cron service — BLOCKED on platform issue #1543 (documented, not yet deployable). Optional auth/payments/reminder secrets map through a vault: block (AUTH_PROVIDER_KEY / STRIPE_KEY / SENDGRID_API_KEY) with grid secrets set."
9
+ summary: "A BLUEPRINT for a calendar / scheduling app — events, availability slots, timezones + recurrence, optional bookings, on persistent Next.js + Mongo. This is not fill-in-the-blanks app code; it ships structure + cloudgrid.yaml. Fetch the template, read AGENTS.md for the file tree / collections / CloudGrid wiring (needs + optional vault) + the cron reminder shape (blocked on #1543), then BUILD the app under services/web/ following it, and deploy async to a live URL (local edition only)."
10
+ ---
11
+
12
+ # Workflow: calendar-scheduler
13
+
14
+ The user wants a calendar / scheduling app — a **team calendar**, a **meeting
15
+ scheduler**, or a booking-style **scheduling app**. That is a **persistent runtime
16
+ app** (Next.js + the grid's shared Mongo) whose domain is **events and
17
+ availability**: events on a calendar, bookable time slots, timezones, recurrence,
18
+ and (eventually) scheduled reminders. It is the `app-with-data` / `crm` shape with
19
+ a time/availability domain.
20
+
21
+ **This is a BLUEPRINT.** Unlike a fill-in-the-blanks template, it ships
22
+ *structure* — a `cloudgrid.yaml` and an `AGENTS.md` structure guide — not finished
23
+ app code. The recipe is: fetch it, **read `AGENTS.md`**, then **build** the app
24
+ following it. Be honest that a runtime deploy is async and needs the local edition.
25
+
26
+ ## 1. Edition check FIRST (hard gate)
27
+
28
+ A calendar scheduler is a built + deployed container (Next.js + Mongo). It
29
+ requires the **local edition** (Claude Desktop / Claude Code) or the CLI.
30
+
31
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
32
+ hosted is inline-only and can only publish static pages. Tell the user plainly,
33
+ offer a **static calendar mockup** instead, and STOP the runtime path here.
34
+ - **Local edition:** continue.
35
+
36
+ ## 2. Auth + grid
37
+
38
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
39
+ 2. A grid is required. Respect the grid picker: if the user has more than one
40
+ grid, ask which to use; do not assume a target.
41
+
42
+ ## 3. Fetch the blueprint and READ AGENTS.md
43
+
44
+ `gridctl_fetch("template", "calendar-scheduler")`. The deliverable is the
45
+ **`AGENTS.md` structure guide** — read it before writing anything. It defines:
46
+ - the `services/web/` file tree (calendar page, event + booking routes, `lib/`),
47
+ - the Mongo collections (`events`, `availability`, optional `bookings`) + fields,
48
+ - the CloudGrid injection table (needs + optional vault + AI gateway),
49
+ - the optional auth (Clerk/Auth0 + `ownerId`) and payments (Stripe Checkout +
50
+ signed webhook) layers,
51
+ - the intended **cron reminder** service shape — **BLOCKED on platform issue
52
+ #1543** (documented, not yet deployable),
53
+ - the deploy flow.
54
+
55
+ There is no app code to copy — you generate it from the guide.
56
+
57
+ ## 4. Scaffold + fill cloudgrid.yaml
58
+
59
+ `gridctl_init` an app `<name>` FIRST (creates the entity + `.cloudgrid/link.json`
60
+ and a starter `cloudgrid.yaml` with empty `services:{}`; `plug` needs a linked
61
+ directory). Then put the app under **`services/web/`** and set `cloudgrid.yaml` to
62
+ the blueprint's active fields:
63
+
64
+ ```yaml
65
+ name: my-calendar
66
+ services:
67
+ web:
68
+ type: nextjs
69
+ path: /
70
+ needs:
71
+ database: true
72
+ ```
73
+
74
+ **App code MUST live under `services/<name>/`** — `path:` is the URL mount, NOT
75
+ the filesystem path. **Declare `needs: { database: true }`** (canonical) — the
76
+ deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (+ legacy
77
+ `MONGODB_URL`). `requires:` is the deprecated v1 alias; never author it and never
78
+ set `needs:` and `requires:` together (the validator rejects the combination).
79
+ Add a `vault:` entry only when you actually layer in auth / payments / reminders.
80
+
81
+ ## 5. Build the app following AGENTS.md
82
+
83
+ Generate the files under `services/web/` per the guide:
84
+ - **Lazy getter** for Mongo — read `process.env.DATABASE_MONGODB_URL` (legacy
85
+ `MONGODB_URL` fallback) **inside** a getter, never at module top level (a
86
+ top-level read fails `next build`). Same lazy pattern for any Stripe/auth client.
87
+ - **Store all times as UTC `Date` in Mongo**; convert at the edges. Keep timezone
88
+ / recurrence / overlap logic in a pure `lib/time.js` (expand RRULEs at read
89
+ time — do not store every instance).
90
+ - Range-query events for the visible window (`startAt < end && endAt > start`);
91
+ index `{ ownerId: 1, startAt: 1 }`.
92
+ - (Optional) auth: init an SDK in `lib/auth.js` from `AUTH_PROVIDER_KEY`, stamp
93
+ `ownerId` on writes, gate write APIs in `middleware.js`, keep the public
94
+ `book/[slug]` page open.
95
+ - (Optional) payments: Stripe Checkout for paid bookings + a signature-verified
96
+ webhook (read the RAW body before verifying).
97
+
98
+ ## 6. Scheduled reminders (cron) — BLOCKED on #1543
99
+
100
+ Reminders want a second service of `type: cron` (scan due reminders every few
101
+ minutes, send mail/SMS). **Cron deploy is a PENDING platform issue (#1543)** — do
102
+ NOT uncomment the cron `reminders` service in `cloudgrid.yaml` yet; it will not
103
+ schedule. Ship the HTTP app now and add cron once #1543 lands. If the user needs
104
+ reminders sooner, use the interim workaround in AGENTS.md §5 (an external
105
+ scheduler hitting an authenticated `POST /api/cron/reminders` route on `web`).
106
+
107
+ ## 7. Config / secrets
108
+
109
+ - Map any secrets in the `vault:` block, then **store the values**:
110
+ `grid secrets set auth-provider-key …`, `grid secrets set stripe-live-key sk_live_…`,
111
+ `grid secrets set sendgrid-key SG.…`. Non-secret public config → `gridctl_env`.
112
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` / legacy
113
+ `MONGODB_URL`) — the grid injects them.
114
+
115
+ ## 8. (Optional) Run locally
116
+
117
+ Mention the user can `grid dev` to run locally against the injected dev Mongo (+
118
+ secrets) before deploying. Don't require it.
119
+
120
+ ## 9. Deploy (async)
121
+
122
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
123
+ response is `status: "building"`, NOT a live URL yet.
124
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
125
+ - Surface a liveness signal while it builds — never a bare silent wait.
126
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
127
+
128
+ ## 10. Return the live URL + iterate
129
+
130
+ Give the user the live app URL — the deliverable. To iterate, re-plug the SAME
131
+ entity so it updates the same URL. Keep it honest: this is a blueprint you built
132
+ from, the build is async, it is local-edition only, Mongo is injected via `needs`,
133
+ optional secrets via `vault` + `grid secrets set`, and scheduled reminders wait on
134
+ platform issue #1543.
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: company-website
3
+ when: company website, business site, corporate site, about-us site, small-business homepage
4
+ needs: none
5
+ deploy: inspiration
6
+ editions: all
7
+ capabilities_note: static — no infrastructure. Publishes as an inspiration (instant, works on hosted) via gridctl_drop.
8
+ summary: Fetch the company-website template, fill it with the user's content across hero/about/services/team/contact, deploy it, and return the live share URL.
9
+ ---
10
+
11
+ # Workflow: company-website
12
+
13
+ Detect the intent ("build me a company website / business site / about-us page
14
+ for X") and follow this recipe. Do not ask setup questions first; use sensible
15
+ defaults from what the user tells you and build.
16
+
17
+ 1. **Fetch the template.** Call `gridctl_fetch("template", "company-website")` to
18
+ load the self-contained multi-section HTML company site.
19
+ 2. **(Optional) Fetch the example.** Call `gridctl_fetch("example", "company-website")`
20
+ to see a filled site as a reference for tone and structure.
21
+ 3. **Fill the template.** Replace the `{{PLACEHOLDER}}` tokens with the user's
22
+ content, section by section:
23
+ - **Identity + hero:** company name, tagline, headline, subheadline, and the
24
+ two call-to-action labels.
25
+ - **About:** headline, two short paragraphs, and four stat number/label pairs.
26
+ - **Services:** one card per offering — a single-emoji icon, title, and short
27
+ description. Duplicate a `.card` block between the `SERVICES_START` /
28
+ `SERVICES_END` comments to add more.
29
+ - **Team:** one member per person — avatar initials, name, role, short bio.
30
+ Duplicate a `.member` block between `TEAM_START` / `TEAM_END` to add more.
31
+ - **Contact:** headline, subheadline, email, phone, address, hours.
32
+ - Keep it a single self-contained HTML file. Do not add external scripts,
33
+ stylesheets, fonts, or large embedded media. Recolor via the `:root` CSS
34
+ variables (`--accent`, `--bg`, `--fg`) if the user has brand colors.
35
+ 4. **Deploy.** Deploy the filled HTML:
36
+ - Hosted MCP edition: call the drop tool with the HTML.
37
+ - Local MCP / CLI edition: write the HTML to a file and run `gridctl plug`.
38
+ A company website is an inspiration and deploys synchronously, so you get a
39
+ URL right away.
40
+ 5. **Return the live share URL.** Give the user the URL that serves the page.
41
+ For revisions, re-deploy with the entity id from the first deploy — it updates
42
+ the same share URL, so the user iterates on one link.
43
+
44
+ Keep the whole flow tight: fetch, fill, deploy, share. The contact form is
45
+ client-side only; mention the user can wire it to their own email service or
46
+ form endpoint if they want real submissions.
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: course-platform
3
+ when: "course platform, sell online courses, teachable-style"
4
+ needs: database
5
+ deploy: runtime
6
+ editions: local
7
+ kind: blueprint
8
+ capabilities_note: "persistent — needs a database (Mongo) plus auth + Stripe payments (vault-injected secrets). Runtime app, async build, local edition only. Declare the canonical needs:{database:true}; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Secrets (STRIPE_KEY, STRIPE_WEBHOOK_SECRET, AUTH_PROVIDER_KEY) come from the vault: block."
9
+ summary: "Build a Teachable-style course platform on the grid — sell online courses, gate lessons behind a Stripe purchase, track per-student progress. This is a BLUEPRINT — the template ships the correct cloudgrid.yaml + an AGENTS.md structure guide (file tree, Mongo collections courses/lessons/enrollments/progress, env/vault wiring, auth + Stripe checkout/webhook routes, async deploy). Read AGENTS.md, then build the app under services/web/ following it. Edition-gate first, scaffold, wire DATABASE_MONGODB_URL and vault secrets lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL."
10
+ ---
11
+
12
+ # Workflow: course-platform
13
+
14
+ The user wants a Teachable-style course platform: sell online courses, gate
15
+ lessons behind a Stripe purchase, and track each student's lesson progress. That
16
+ is a **persistent runtime app** — Next.js + the grid's shared Mongo, with auth
17
+ and payments — not a static page.
18
+
19
+ **This is a blueprint.** The template does NOT ship runnable app code. It ships
20
+ the correct `cloudgrid.yaml` and an `AGENTS.md` structure guide. Your job is to
21
+ **read `AGENTS.md`, then build the app under `services/web/` following it.**
22
+
23
+ Be honest that a runtime deploy is async (not instant like a static drop) and
24
+ that it needs the local edition.
25
+
26
+ ## 1. Edition check FIRST (hard gate)
27
+
28
+ A course platform is a built + deployed container. It requires the **local
29
+ edition** (Claude Desktop / Claude Code) or the CLI.
30
+
31
+ - **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
32
+ hosted is inline-only and can only publish static pages. Tell the user plainly,
33
+ offer a **static course landing page** instead, and STOP the runtime path here.
34
+ - **Local edition:** continue.
35
+
36
+ ## 2. Auth + grid
37
+
38
+ 1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
39
+ 2. A grid is required. Respect the grid picker: if the user has more than one
40
+ grid, ask which to use; do not assume a target.
41
+
42
+ ## 3. Read the blueprint
43
+
44
+ Fetch the structure guide: `gridctl_fetch("template", "course-platform")`. It
45
+ contains AGENTS.md — the CloudGrid-specific spec you must follow:
46
+
47
+ - the file tree under `services/web/` (catalog page, course detail, gated lesson
48
+ player, dashboard, and the API routes: courses, enrollments, progress, checkout,
49
+ Stripe webhook),
50
+ - the Mongo collections + fields (`courses`, `lessons`, `enrollments`,
51
+ `progress`) and the access rule (a lesson is viewable if `isFreePreview` OR an
52
+ `enrollments` doc exists — enforced on the server),
53
+ - how CloudGrid injects the DB URL and the vault secrets,
54
+ - how to wire auth (a provider SDK like Clerk/Auth0) and Stripe (checkout +
55
+ webhook routes),
56
+ - the async deploy steps.
57
+
58
+ ## 4. Scaffold + fill cloudgrid.yaml
59
+
60
+ `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
61
+ and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. Run `init` FIRST —
62
+ `plug` needs a linked directory. Then set `cloudgrid.yaml` to the shape below and
63
+ write the app under **`services/web/`** (`path: /` is the URL mount, NOT the
64
+ filesystem path).
65
+
66
+ ```yaml
67
+ name: my-courses
68
+ vault:
69
+ STRIPE_KEY: stripe-live-key
70
+ STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
71
+ AUTH_PROVIDER_KEY: auth-provider-key
72
+ services:
73
+ web:
74
+ type: nextjs
75
+ path: /
76
+ needs:
77
+ database: true
78
+ ```
79
+
80
+ **Declare the datastore with `needs: { database: true }`** — the canonical shape.
81
+ The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus the legacy
82
+ `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't author new
83
+ yaml with it, and never set `needs:` and `requires:` together (the validator
84
+ rejects it).
85
+
86
+ ## 5. Build the app (following AGENTS.md)
87
+
88
+ Build the Next.js app under `services/web/` per the guide. Critical CloudGrid
89
+ rules:
90
+
91
+ - **Read every injected var LAZILY, inside a getter — never at module top level**,
92
+ or `next build` fails. That covers `process.env.DATABASE_MONGODB_URL` (legacy
93
+ `MONGODB_URL` fallback) in `lib/db.js`, and the vault secrets `STRIPE_KEY` /
94
+ `STRIPE_WEBHOOK_SECRET` in `lib/stripe.js` and `AUTH_PROVIDER_KEY` in
95
+ `lib/auth.js`.
96
+ - **Access is granted by the Stripe webhook**, not the checkout redirect: on
97
+ `checkout.session.completed`, create the `enrollments` doc. Verify the webhook
98
+ signature with `STRIPE_WEBHOOK_SECRET` against the RAW body.
99
+ - **Gate the lesson player on the server** — check enrollment (or free preview),
100
+ never rely on hiding UI.
101
+
102
+ ## 6. Config (secrets + env)
103
+
104
+ - Secrets → `gridctl_secrets`: `grid secrets set stripe-live-key`,
105
+ `grid secrets set stripe-webhook-secret`, `grid secrets set auth-provider-key`.
106
+ The `vault:` block injects them as `STRIPE_KEY`, `STRIPE_WEBHOOK_SECRET`,
107
+ `AUTH_PROVIDER_KEY`.
108
+ - Non-secret config (e.g. the auth **publishable** key) → `gridctl_env`.
109
+ - Do **NOT** set the DB vars yourself (`DATABASE_MONGODB_URL` / legacy
110
+ `MONGODB_URL`) — the grid injects them.
111
+
112
+ ## 7. 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
+ ## 8. Wire Stripe + return the live URL
121
+
122
+ Register the Stripe webhook to `https://<live-url>/api/webhooks/stripe` in the
123
+ Stripe dashboard, and set its signing secret into the `stripe-webhook-secret`
124
+ vault item. Give the user the live app URL — that is the deliverable. To iterate,
125
+ re-plug the SAME entity so it updates the same URL. Keep it honest: async build,
126
+ local-edition only, credentials injected by the grid.
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: directory
3
+ when: directory, business directory, member directory, listings directory — a persistent app that stores and shows searchable/filterable listings. 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 directory on the grid — an `entries` collection (name, category, url, description) with a searchable/filterable list plus 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: directory
12
+
13
+ The user wants a **directory** — a searchable, filterable list of listings that
14
+ **remembers** its entries: a business directory, member directory, or listings
15
+ directory whose records survive refresh and are shared across sessions. That is
16
+ a **runtime app** backed by the grid's shared Mongo, not a static page. It is the
17
+ same proven shape as `app-with-data`, with an `entries` domain (name, category,
18
+ url, description) and a list view with live search + category filtering and
19
+ per-row 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-directory
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", "directory")`. It is a minimal, real Next.js +
68
+ `mongodb`-driver directory under `services/web/`: a lazy client in
69
+ `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on an
70
+ `entries` collection, a server-component page, and a client list with search +
71
+ category filter.
72
+ 3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
73
+ from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
74
+ fallback) — the grid injects it at dev-time and runtime.
75
+ - **Put the DB connection behind a lazy getter — never read the connection
76
+ string at module top level, or `next build` fails.**
77
+
78
+ ## 5. (Optional) Run locally
79
+
80
+ Mention that the user can `grid dev` to run locally against the injected Mongo
81
+ before deploying. Don't require it.
82
+
83
+ ## 6. Config
84
+
85
+ - API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
86
+ - Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
87
+ legacy `MONGODB_URL`) — the grid injects them.
88
+
89
+ ## 7. Deploy (async)
90
+
91
+ Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
92
+ response is `status: "building"`, NOT a live URL yet.
93
+ - Poll `gridctl_status` (or the returned poll_url) until the entity is live.
94
+ - Surface a liveness signal while it builds — never a bare silent wait.
95
+ - Only once it is live, return the deployed app URL (NOT the build/log link).
96
+
97
+ ## 8. Return the live URL + iterate
98
+
99
+ Give the user the live app URL — that is the deliverable. To iterate, re-plug the
100
+ SAME entity so it updates the same URL. Keep it honest: async build, local-edition
101
+ only, credentials injected by the grid.
@@ -0,0 +1,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.