@cloudgrid-io/mcp 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/package.json +1 -1
  2. package/src/corpus/capability-map.md +68 -7
  3. package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
  4. package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +226 -8
  5. package/src/corpus/templates/admin-dashboard/index.md +3 -0
  6. package/src/corpus/templates/ai-app/cloudgrid.yaml +225 -11
  7. package/src/corpus/templates/ai-app/index.md +3 -11
  8. package/src/corpus/templates/ai-knowledge-base/AGENTS.md +254 -0
  9. package/src/corpus/templates/ai-knowledge-base/README.md +28 -0
  10. package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +238 -0
  11. package/src/corpus/templates/ai-knowledge-base/index.md +81 -0
  12. package/src/corpus/templates/analytics-dashboard/README.md +85 -0
  13. package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +232 -0
  14. package/src/corpus/templates/analytics-dashboard/index.md +316 -0
  15. package/src/corpus/templates/analytics-dashboard/services/web/app/api/events/route.js +60 -0
  16. package/src/corpus/templates/analytics-dashboard/services/web/app/event-form.js +100 -0
  17. package/src/corpus/templates/analytics-dashboard/services/web/app/layout.js +41 -0
  18. package/src/corpus/templates/analytics-dashboard/services/web/app/page.js +54 -0
  19. package/src/corpus/templates/analytics-dashboard/services/web/lib/db.js +32 -0
  20. package/src/corpus/templates/analytics-dashboard/services/web/package.json +16 -0
  21. package/src/corpus/templates/api-dashboard/README.md +84 -0
  22. package/src/corpus/templates/api-dashboard/cloudgrid.yaml +233 -0
  23. package/src/corpus/templates/api-dashboard/index.md +310 -0
  24. package/src/corpus/templates/api-dashboard/services/web/app/api/requests/route.js +62 -0
  25. package/src/corpus/templates/api-dashboard/services/web/app/dashboard.js +156 -0
  26. package/src/corpus/templates/api-dashboard/services/web/app/layout.js +42 -0
  27. package/src/corpus/templates/api-dashboard/services/web/app/page.js +39 -0
  28. package/src/corpus/templates/api-dashboard/services/web/lib/db.js +32 -0
  29. package/src/corpus/templates/api-dashboard/services/web/package.json +16 -0
  30. package/src/corpus/templates/api-docs/cloudgrid.yaml +222 -4
  31. package/src/corpus/templates/api-docs/index.md +3 -5
  32. package/src/corpus/templates/api-service/cloudgrid.yaml +224 -9
  33. package/src/corpus/templates/api-service/index.md +3 -11
  34. package/src/corpus/templates/app-with-data/cloudgrid.yaml +226 -8
  35. package/src/corpus/templates/app-with-data/index.md +3 -8
  36. package/src/corpus/templates/appointment-booking/AGENTS.md +223 -0
  37. package/src/corpus/templates/appointment-booking/README.md +16 -0
  38. package/src/corpus/templates/appointment-booking/cloudgrid.yaml +250 -0
  39. package/src/corpus/templates/appointment-booking/index.md +72 -0
  40. package/src/corpus/templates/approval-workflow/AGENTS.md +170 -0
  41. package/src/corpus/templates/approval-workflow/README.md +12 -0
  42. package/src/corpus/templates/approval-workflow/cloudgrid.yaml +237 -0
  43. package/src/corpus/templates/approval-workflow/index.md +58 -0
  44. package/src/corpus/templates/billing-dashboard/AGENTS.md +199 -0
  45. package/src/corpus/templates/billing-dashboard/README.md +18 -0
  46. package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +235 -0
  47. package/src/corpus/templates/billing-dashboard/index.md +87 -0
  48. package/src/corpus/templates/blog-cms/README.md +94 -0
  49. package/src/corpus/templates/blog-cms/cloudgrid.yaml +233 -0
  50. package/src/corpus/templates/blog-cms/index.md +358 -0
  51. package/src/corpus/templates/blog-cms/services/web/app/admin/admin-editor.js +133 -0
  52. package/src/corpus/templates/blog-cms/services/web/app/admin/page.js +33 -0
  53. package/src/corpus/templates/blog-cms/services/web/app/api/posts/route.js +84 -0
  54. package/src/corpus/templates/blog-cms/services/web/app/layout.js +47 -0
  55. package/src/corpus/templates/blog-cms/services/web/app/page.js +56 -0
  56. package/src/corpus/templates/blog-cms/services/web/app/posts/[slug]/page.js +45 -0
  57. package/src/corpus/templates/blog-cms/services/web/lib/db.js +32 -0
  58. package/src/corpus/templates/blog-cms/services/web/package.json +16 -0
  59. package/src/corpus/templates/booking-system/AGENTS.md +189 -0
  60. package/src/corpus/templates/booking-system/README.md +17 -0
  61. package/src/corpus/templates/booking-system/cloudgrid.yaml +248 -0
  62. package/src/corpus/templates/booking-system/index.md +86 -0
  63. package/src/corpus/templates/calendar-scheduler/AGENTS.md +226 -0
  64. package/src/corpus/templates/calendar-scheduler/README.md +25 -0
  65. package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +259 -0
  66. package/src/corpus/templates/calendar-scheduler/index.md +85 -0
  67. package/src/corpus/templates/changelog/cloudgrid.yaml +222 -4
  68. package/src/corpus/templates/changelog/index.md +3 -5
  69. package/src/corpus/templates/company-website/README.md +54 -0
  70. package/src/corpus/templates/company-website/cloudgrid.yaml +233 -0
  71. package/src/corpus/templates/company-website/index.html +309 -0
  72. package/src/corpus/templates/company-website/index.md +29 -0
  73. package/src/corpus/templates/course-platform/AGENTS.md +161 -0
  74. package/src/corpus/templates/course-platform/README.md +26 -0
  75. package/src/corpus/templates/course-platform/cloudgrid.yaml +237 -0
  76. package/src/corpus/templates/course-platform/index.md +70 -0
  77. package/src/corpus/templates/crm/cloudgrid.yaml +226 -8
  78. package/src/corpus/templates/crm/index.md +3 -0
  79. package/src/corpus/templates/dashboard/cloudgrid.yaml +228 -4
  80. package/src/corpus/templates/dashboard/index.md +3 -5
  81. package/src/corpus/templates/deck/cloudgrid.yaml +228 -4
  82. package/src/corpus/templates/deck/index.md +3 -5
  83. package/src/corpus/templates/directory/README.md +75 -0
  84. package/src/corpus/templates/directory/cloudgrid.yaml +233 -0
  85. package/src/corpus/templates/directory/index.md +334 -0
  86. package/src/corpus/templates/directory/services/web/app/api/entries/route.js +63 -0
  87. package/src/corpus/templates/directory/services/web/app/directory-list.js +146 -0
  88. package/src/corpus/templates/directory/services/web/app/layout.js +44 -0
  89. package/src/corpus/templates/directory/services/web/app/page.js +38 -0
  90. package/src/corpus/templates/directory/services/web/lib/db.js +32 -0
  91. package/src/corpus/templates/directory/services/web/package.json +16 -0
  92. package/src/corpus/templates/docs-site/cloudgrid.yaml +222 -4
  93. package/src/corpus/templates/docs-site/index.md +3 -5
  94. package/src/corpus/templates/erp/AGENTS.md +116 -0
  95. package/src/corpus/templates/erp/README.md +17 -0
  96. package/src/corpus/templates/erp/cloudgrid.yaml +235 -0
  97. package/src/corpus/templates/erp/index.md +81 -0
  98. package/src/corpus/templates/event-board/README.md +74 -0
  99. package/src/corpus/templates/event-board/cloudgrid.yaml +233 -0
  100. package/src/corpus/templates/event-board/index.md +299 -0
  101. package/src/corpus/templates/event-board/services/web/app/api/events/route.js +61 -0
  102. package/src/corpus/templates/event-board/services/web/app/event-form.js +118 -0
  103. package/src/corpus/templates/event-board/services/web/app/layout.js +39 -0
  104. package/src/corpus/templates/event-board/services/web/app/page.js +34 -0
  105. package/src/corpus/templates/event-board/services/web/lib/db.js +32 -0
  106. package/src/corpus/templates/event-board/services/web/package.json +16 -0
  107. package/src/corpus/templates/expense-tracker/README.md +76 -0
  108. package/src/corpus/templates/expense-tracker/cloudgrid.yaml +233 -0
  109. package/src/corpus/templates/expense-tracker/index.md +305 -0
  110. package/src/corpus/templates/expense-tracker/services/web/app/api/expenses/route.js +61 -0
  111. package/src/corpus/templates/expense-tracker/services/web/app/expense-form.js +145 -0
  112. package/src/corpus/templates/expense-tracker/services/web/app/layout.js +42 -0
  113. package/src/corpus/templates/expense-tracker/services/web/app/page.js +34 -0
  114. package/src/corpus/templates/expense-tracker/services/web/lib/db.js +32 -0
  115. package/src/corpus/templates/expense-tracker/services/web/package.json +16 -0
  116. package/src/corpus/templates/feature-request-board/README.md +87 -0
  117. package/src/corpus/templates/feature-request-board/cloudgrid.yaml +233 -0
  118. package/src/corpus/templates/feature-request-board/index.md +317 -0
  119. package/src/corpus/templates/feature-request-board/services/web/app/api/requests/route.js +92 -0
  120. package/src/corpus/templates/feature-request-board/services/web/app/board.js +91 -0
  121. package/src/corpus/templates/feature-request-board/services/web/app/layout.js +43 -0
  122. package/src/corpus/templates/feature-request-board/services/web/app/page.js +35 -0
  123. package/src/corpus/templates/feature-request-board/services/web/lib/db.js +32 -0
  124. package/src/corpus/templates/feature-request-board/services/web/package.json +16 -0
  125. package/src/corpus/templates/financial-dashboard/README.md +80 -0
  126. package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +233 -0
  127. package/src/corpus/templates/financial-dashboard/index.md +326 -0
  128. package/src/corpus/templates/financial-dashboard/services/web/app/api/entries/route.js +63 -0
  129. package/src/corpus/templates/financial-dashboard/services/web/app/entry-board.js +130 -0
  130. package/src/corpus/templates/financial-dashboard/services/web/app/layout.js +46 -0
  131. package/src/corpus/templates/financial-dashboard/services/web/app/page.js +31 -0
  132. package/src/corpus/templates/financial-dashboard/services/web/lib/db.js +32 -0
  133. package/src/corpus/templates/financial-dashboard/services/web/package.json +16 -0
  134. package/src/corpus/templates/forum/AGENTS.md +196 -0
  135. package/src/corpus/templates/forum/README.md +12 -0
  136. package/src/corpus/templates/forum/cloudgrid.yaml +237 -0
  137. package/src/corpus/templates/forum/index.md +66 -0
  138. package/src/corpus/templates/hr-portal/AGENTS.md +174 -0
  139. package/src/corpus/templates/hr-portal/README.md +14 -0
  140. package/src/corpus/templates/hr-portal/cloudgrid.yaml +237 -0
  141. package/src/corpus/templates/hr-portal/index.md +56 -0
  142. package/src/corpus/templates/internal-tools-portal/AGENTS.md +201 -0
  143. package/src/corpus/templates/internal-tools-portal/README.md +17 -0
  144. package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +237 -0
  145. package/src/corpus/templates/internal-tools-portal/index.md +62 -0
  146. package/src/corpus/templates/inventory/README.md +71 -0
  147. package/src/corpus/templates/inventory/cloudgrid.yaml +233 -0
  148. package/src/corpus/templates/inventory/index.md +68 -0
  149. package/src/corpus/templates/inventory/services/web/app/api/items/route.js +88 -0
  150. package/src/corpus/templates/inventory/services/web/app/inventory-manager.js +101 -0
  151. package/src/corpus/templates/inventory/services/web/app/layout.js +36 -0
  152. package/src/corpus/templates/inventory/services/web/app/page.js +37 -0
  153. package/src/corpus/templates/inventory/services/web/lib/db.js +32 -0
  154. package/src/corpus/templates/inventory/services/web/package.json +16 -0
  155. package/src/corpus/templates/invoice/README.md +71 -0
  156. package/src/corpus/templates/invoice/cloudgrid.yaml +233 -0
  157. package/src/corpus/templates/invoice/index.md +68 -0
  158. package/src/corpus/templates/invoice/services/web/app/api/invoices/route.js +82 -0
  159. package/src/corpus/templates/invoice/services/web/app/invoice-manager.js +101 -0
  160. package/src/corpus/templates/invoice/services/web/app/layout.js +35 -0
  161. package/src/corpus/templates/invoice/services/web/app/page.js +34 -0
  162. package/src/corpus/templates/invoice/services/web/lib/db.js +32 -0
  163. package/src/corpus/templates/invoice/services/web/package.json +16 -0
  164. package/src/corpus/templates/job-board/README.md +71 -0
  165. package/src/corpus/templates/job-board/cloudgrid.yaml +233 -0
  166. package/src/corpus/templates/job-board/index.md +68 -0
  167. package/src/corpus/templates/job-board/services/web/app/api/jobs/route.js +66 -0
  168. package/src/corpus/templates/job-board/services/web/app/job-board.js +73 -0
  169. package/src/corpus/templates/job-board/services/web/app/layout.js +35 -0
  170. package/src/corpus/templates/job-board/services/web/app/page.js +32 -0
  171. package/src/corpus/templates/job-board/services/web/lib/db.js +32 -0
  172. package/src/corpus/templates/job-board/services/web/package.json +16 -0
  173. package/src/corpus/templates/kanban/cloudgrid.yaml +226 -8
  174. package/src/corpus/templates/kanban/index.md +3 -0
  175. package/src/corpus/templates/landing-page/cloudgrid.yaml +228 -4
  176. package/src/corpus/templates/landing-page/index.md +3 -5
  177. package/src/corpus/templates/lms/AGENTS.md +193 -0
  178. package/src/corpus/templates/lms/README.md +27 -0
  179. package/src/corpus/templates/lms/cloudgrid.yaml +237 -0
  180. package/src/corpus/templates/lms/index.md +79 -0
  181. package/src/corpus/templates/marketplace/AGENTS.md +208 -0
  182. package/src/corpus/templates/marketplace/README.md +22 -0
  183. package/src/corpus/templates/marketplace/cloudgrid.yaml +233 -0
  184. package/src/corpus/templates/marketplace/index.md +76 -0
  185. package/src/corpus/templates/membership-site/AGENTS.md +160 -0
  186. package/src/corpus/templates/membership-site/README.md +18 -0
  187. package/src/corpus/templates/membership-site/cloudgrid.yaml +236 -0
  188. package/src/corpus/templates/membership-site/index.md +66 -0
  189. package/src/corpus/templates/monitoring-dashboard/README.md +84 -0
  190. package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +233 -0
  191. package/src/corpus/templates/monitoring-dashboard/index.md +328 -0
  192. package/src/corpus/templates/monitoring-dashboard/services/web/app/api/checks/route.js +76 -0
  193. package/src/corpus/templates/monitoring-dashboard/services/web/app/check-form.js +124 -0
  194. package/src/corpus/templates/monitoring-dashboard/services/web/app/layout.js +44 -0
  195. package/src/corpus/templates/monitoring-dashboard/services/web/app/page.js +49 -0
  196. package/src/corpus/templates/monitoring-dashboard/services/web/lib/db.js +32 -0
  197. package/src/corpus/templates/monitoring-dashboard/services/web/package.json +16 -0
  198. package/src/corpus/templates/online-store/AGENTS.md +153 -0
  199. package/src/corpus/templates/online-store/README.md +16 -0
  200. package/src/corpus/templates/online-store/cloudgrid.yaml +234 -0
  201. package/src/corpus/templates/online-store/index.md +81 -0
  202. package/src/corpus/templates/portfolio/cloudgrid.yaml +222 -4
  203. package/src/corpus/templates/portfolio/index.md +3 -5
  204. package/src/corpus/templates/product-catalog/README.md +74 -0
  205. package/src/corpus/templates/product-catalog/cloudgrid.yaml +232 -0
  206. package/src/corpus/templates/product-catalog/index.md +330 -0
  207. package/src/corpus/templates/product-catalog/services/web/app/api/products/route.js +69 -0
  208. package/src/corpus/templates/product-catalog/services/web/app/catalog.js +153 -0
  209. package/src/corpus/templates/product-catalog/services/web/app/layout.js +49 -0
  210. package/src/corpus/templates/product-catalog/services/web/app/page.js +36 -0
  211. package/src/corpus/templates/product-catalog/services/web/lib/db.js +32 -0
  212. package/src/corpus/templates/product-catalog/services/web/package.json +16 -0
  213. package/src/corpus/templates/product-launch/README.md +46 -0
  214. package/src/corpus/templates/product-launch/cloudgrid.yaml +234 -0
  215. package/src/corpus/templates/product-launch/index.html +320 -0
  216. package/src/corpus/templates/product-launch/index.md +34 -0
  217. package/src/corpus/templates/project-management/README.md +83 -0
  218. package/src/corpus/templates/project-management/cloudgrid.yaml +233 -0
  219. package/src/corpus/templates/project-management/index.md +346 -0
  220. package/src/corpus/templates/project-management/services/web/app/api/projects/route.js +48 -0
  221. package/src/corpus/templates/project-management/services/web/app/api/tasks/route.js +85 -0
  222. package/src/corpus/templates/project-management/services/web/app/board.js +182 -0
  223. package/src/corpus/templates/project-management/services/web/app/layout.js +45 -0
  224. package/src/corpus/templates/project-management/services/web/app/page.js +49 -0
  225. package/src/corpus/templates/project-management/services/web/lib/db.js +32 -0
  226. package/src/corpus/templates/project-management/services/web/package.json +16 -0
  227. package/src/corpus/templates/property-listings/README.md +76 -0
  228. package/src/corpus/templates/property-listings/cloudgrid.yaml +233 -0
  229. package/src/corpus/templates/property-listings/index.md +335 -0
  230. package/src/corpus/templates/property-listings/services/web/app/api/properties/route.js +73 -0
  231. package/src/corpus/templates/property-listings/services/web/app/layout.js +45 -0
  232. package/src/corpus/templates/property-listings/services/web/app/listings.js +152 -0
  233. package/src/corpus/templates/property-listings/services/web/app/page.js +53 -0
  234. package/src/corpus/templates/property-listings/services/web/lib/db.js +32 -0
  235. package/src/corpus/templates/property-listings/services/web/package.json +16 -0
  236. package/src/corpus/templates/quiz-platform/README.md +84 -0
  237. package/src/corpus/templates/quiz-platform/cloudgrid.yaml +233 -0
  238. package/src/corpus/templates/quiz-platform/index.md +313 -0
  239. package/src/corpus/templates/quiz-platform/services/web/app/api/questions/route.js +69 -0
  240. package/src/corpus/templates/quiz-platform/services/web/app/layout.js +47 -0
  241. package/src/corpus/templates/quiz-platform/services/web/app/page.js +37 -0
  242. package/src/corpus/templates/quiz-platform/services/web/app/quiz.js +188 -0
  243. package/src/corpus/templates/quiz-platform/services/web/lib/db.js +32 -0
  244. package/src/corpus/templates/quiz-platform/services/web/package.json +16 -0
  245. package/src/corpus/templates/report/cloudgrid.yaml +228 -4
  246. package/src/corpus/templates/report/index.md +3 -5
  247. package/src/corpus/templates/restaurant-reservations/AGENTS.md +258 -0
  248. package/src/corpus/templates/restaurant-reservations/README.md +17 -0
  249. package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +258 -0
  250. package/src/corpus/templates/restaurant-reservations/index.md +62 -0
  251. package/src/corpus/templates/revenue-dashboard/README.md +75 -0
  252. package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +233 -0
  253. package/src/corpus/templates/revenue-dashboard/index.md +307 -0
  254. package/src/corpus/templates/revenue-dashboard/services/web/app/api/sales/route.js +60 -0
  255. package/src/corpus/templates/revenue-dashboard/services/web/app/layout.js +40 -0
  256. package/src/corpus/templates/revenue-dashboard/services/web/app/page.js +87 -0
  257. package/src/corpus/templates/revenue-dashboard/services/web/app/sale-form.js +63 -0
  258. package/src/corpus/templates/revenue-dashboard/services/web/lib/db.js +32 -0
  259. package/src/corpus/templates/revenue-dashboard/services/web/package.json +16 -0
  260. package/src/corpus/templates/saas-marketing/cloudgrid.yaml +222 -4
  261. package/src/corpus/templates/saas-marketing/index.md +3 -5
  262. package/src/corpus/templates/status-page/cloudgrid.yaml +222 -4
  263. package/src/corpus/templates/status-page/index.md +3 -5
  264. package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
  265. package/src/corpus/templates/subscription-management/README.md +21 -0
  266. package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
  267. package/src/corpus/templates/subscription-management/index.md +73 -0
  268. package/src/corpus/templates/task-manager/cloudgrid.yaml +226 -8
  269. package/src/corpus/templates/task-manager/index.md +3 -0
  270. package/src/corpus/templates/ticket-system/README.md +71 -0
  271. package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
  272. package/src/corpus/templates/ticket-system/index.md +68 -0
  273. package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
  274. package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
  275. package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
  276. package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
  277. package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
  278. package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
  279. package/src/corpus/templates/time-tracking/README.md +81 -0
  280. package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
  281. package/src/corpus/templates/time-tracking/index.md +298 -0
  282. package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
  283. package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
  284. package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
  285. package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
  286. package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
  287. package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
  288. package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
  289. package/src/corpus/templates/travel-booking/README.md +17 -0
  290. package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
  291. package/src/corpus/templates/travel-booking/index.md +88 -0
  292. package/src/corpus/templates/waitlist/cloudgrid.yaml +222 -4
  293. package/src/corpus/templates/waitlist/index.md +3 -5
  294. package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
  295. package/src/corpus/templates/web-app/index.md +3 -5
  296. package/src/corpus/workflows/ai-knowledge-base.md +137 -0
  297. package/src/corpus/workflows/analytics-dashboard.md +104 -0
  298. package/src/corpus/workflows/api-dashboard.md +102 -0
  299. package/src/corpus/workflows/appointment-booking.md +143 -0
  300. package/src/corpus/workflows/approval-workflow.md +124 -0
  301. package/src/corpus/workflows/billing-dashboard.md +120 -0
  302. package/src/corpus/workflows/blog-cms.md +104 -0
  303. package/src/corpus/workflows/booking-system.md +116 -0
  304. package/src/corpus/workflows/calendar-scheduler.md +134 -0
  305. package/src/corpus/workflows/company-website.md +46 -0
  306. package/src/corpus/workflows/course-platform.md +126 -0
  307. package/src/corpus/workflows/directory.md +101 -0
  308. package/src/corpus/workflows/erp.md +125 -0
  309. package/src/corpus/workflows/event-board.md +102 -0
  310. package/src/corpus/workflows/expense-tracker.md +102 -0
  311. package/src/corpus/workflows/feature-request-board.md +105 -0
  312. package/src/corpus/workflows/financial-dashboard.md +103 -0
  313. package/src/corpus/workflows/forum.md +128 -0
  314. package/src/corpus/workflows/hr-portal.md +115 -0
  315. package/src/corpus/workflows/internal-tools-portal.md +125 -0
  316. package/src/corpus/workflows/inventory.md +101 -0
  317. package/src/corpus/workflows/invoice.md +101 -0
  318. package/src/corpus/workflows/job-board.md +101 -0
  319. package/src/corpus/workflows/lms.md +113 -0
  320. package/src/corpus/workflows/marketplace.md +123 -0
  321. package/src/corpus/workflows/membership-site.md +128 -0
  322. package/src/corpus/workflows/monitoring-dashboard.md +104 -0
  323. package/src/corpus/workflows/online-store.md +114 -0
  324. package/src/corpus/workflows/product-catalog.md +105 -0
  325. package/src/corpus/workflows/product-launch.md +43 -0
  326. package/src/corpus/workflows/project-management.md +106 -0
  327. package/src/corpus/workflows/property-listings.md +101 -0
  328. package/src/corpus/workflows/quiz-platform.md +105 -0
  329. package/src/corpus/workflows/restaurant-reservations.md +123 -0
  330. package/src/corpus/workflows/revenue-dashboard.md +102 -0
  331. package/src/corpus/workflows/subscription-management.md +141 -0
  332. package/src/corpus/workflows/ticket-system.md +101 -0
  333. package/src/corpus/workflows/time-tracking.md +104 -0
  334. package/src/corpus/workflows/travel-booking.md +115 -0
@@ -0,0 +1,174 @@
1
+ # AGENTS.md — hr-portal (blueprint / structure guide)
2
+
3
+ This is a **blueprint**, not filled app code. It tells you how to build a
4
+ persistent HR / employee portal correctly **on CloudGrid**: a Next.js app under
5
+ `services/web/`, backed by the grid-shared MongoDB, with employee/admin auth via
6
+ a provider SDK (Clerk or Auth0) whose keys come from the org **vault**, and a
7
+ leave/PTO request + approval flow.
8
+
9
+ Read this whole file, then build the app following it. Do not invent a different
10
+ service layout — the CLI looks for code under `services/web/`.
11
+
12
+ ---
13
+
14
+ ## 1. File tree
15
+
16
+ App code MUST live under `services/web/` — `path:` in `cloudgrid.yaml` is the URL
17
+ mount, NOT the filesystem path. The service named `web` → the CLI looks for
18
+ `services/web/`. Files at the repo root fail with
19
+ `Error: Service directory not found: …/services/web`.
20
+
21
+ ```
22
+ cloudgrid.yaml # name + services.web (nextjs) + needs:{database:true} + vault: auth keys
23
+ services/web/package.json # next, react, react-dom, mongodb + auth SDK (@clerk/nextjs or @auth0/nextjs-auth0)
24
+ services/web/middleware.js # auth middleware — protect all routes except /sign-in, /sign-up, public assets
25
+ services/web/lib/db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
26
+ services/web/lib/auth.js # current-user helper: resolve session → { userId, email, role } (employee|admin)
27
+ services/web/app/layout.js # root layout, wraps children in the auth provider (<ClerkProvider> / Auth0 provider)
28
+ services/web/app/page.js # server component: employee dashboard — my leave balance + my requests
29
+ services/web/app/admin/page.js # server component: admin queue — pending requests to approve/reject (role-gated)
30
+ services/web/app/leave-request-form.js # client component: submit a new leave/PTO request
31
+ services/web/app/api/employees/route.js # GET list / POST create employee profile (admin); GET self for employee
32
+ services/web/app/api/leave-requests/route.js# GET (mine, or all for admin) / POST (submit) leave requests
33
+ services/web/app/api/leave-requests/[id]/route.js # PATCH approve/reject (admin only), DELETE (cancel own pending)
34
+ ```
35
+
36
+ Sign-in / sign-up pages depend on the provider: Clerk gives you catch-all routes
37
+ (`app/sign-in/[[...sign-in]]/page.js`), Auth0 uses its hosted login + a
38
+ `app/api/auth/[auth0]/route.js` handler. Follow the chosen provider's Next.js
39
+ App-Router quickstart for those exact files.
40
+
41
+ ---
42
+
43
+ ## 2. Mongo collections + fields
44
+
45
+ Two collections in the grid-shared Mongo. Keyed to the auth provider's stable
46
+ user id so the identity and the HR record line up.
47
+
48
+ **`employees`**
49
+ | field | type | notes |
50
+ |--------------|--------|----------------------------------------------------------|
51
+ | `_id` | ObjectId | Mongo id |
52
+ | `authUserId` | string | provider user id (Clerk `userId` / Auth0 `sub`) — unique |
53
+ | `email` | string | from the auth session |
54
+ | `name` | string | display name |
55
+ | `role` | string | `"employee"` \| `"admin"` |
56
+ | `department` | string | e.g. Engineering, Sales |
57
+ | `ptoBalance` | number | remaining PTO days |
58
+ | `createdAt` | Date | |
59
+
60
+ **`leaveRequests`**
61
+ | field | type | notes |
62
+ |---------------|--------|---------------------------------------------------------|
63
+ | `_id` | ObjectId | Mongo id |
64
+ | `employeeId` | string | `authUserId` of the requester |
65
+ | `type` | string | `"pto"` \| `"sick"` \| `"unpaid"` |
66
+ | `startDate` | Date | |
67
+ | `endDate` | Date | |
68
+ | `days` | number | computed business days |
69
+ | `reason` | string | optional |
70
+ | `status` | string | `"pending"` \| `"approved"` \| `"rejected"` \| `"cancelled"` |
71
+ | `decidedBy` | string | admin `authUserId` who approved/rejected |
72
+ | `decidedAt` | Date | |
73
+ | `createdAt` | Date | |
74
+
75
+ Approval flow: employee POSTs a request → `status: "pending"`. Admin PATCHes it
76
+ → `approved`/`rejected` (set `decidedBy`, `decidedAt`). On approve, decrement the
77
+ employee's `ptoBalance` by `days`. Employees may DELETE (cancel) only their own
78
+ `pending` requests.
79
+
80
+ ---
81
+
82
+ ## 3. How CloudGrid injects things
83
+
84
+ You do **not** provision infrastructure or set connection strings/secrets by
85
+ hand. Declare them in `cloudgrid.yaml`; the deployer injects env vars at
86
+ dev-time (`grid dev`) and runtime (after `grid plug`).
87
+
88
+ - **Database (Mongo):** `needs: { database: true }` → the grid injects
89
+ **`DATABASE_MONGODB_URL`** (plus the legacy **`MONGODB_URL`** alias). Read
90
+ `process.env.DATABASE_MONGODB_URL || process.env.MONGODB_URL` **lazily inside a
91
+ getter** in `services/web/lib/db.js` — never at module top level, or
92
+ `next build` fails (the module is imported for route analysis before the grid
93
+ injects the var). Never hardcode a connection string.
94
+ - **Auth secrets (vault):** the `vault:` block maps org vault items → env vars.
95
+ This blueprint maps:
96
+ ```yaml
97
+ vault:
98
+ AUTH_PROVIDER_SECRET_KEY: auth-provider-secret-key
99
+ AUTH_PROVIDER_PUBLISHABLE_KEY: auth-provider-publishable-key
100
+ ```
101
+ So `process.env.AUTH_PROVIDER_SECRET_KEY` /
102
+ `process.env.AUTH_PROVIDER_PUBLISHABLE_KEY` are available at build+runtime.
103
+ You must first create those items in the org vault (see step 5). Rename the
104
+ keys to the provider's expected names if you prefer to read the SDK's native
105
+ env vars directly (e.g. `CLERK_SECRET_KEY` /
106
+ `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY`, or `AUTH0_SECRET` / `AUTH0_CLIENT_ID` /
107
+ `AUTH0_CLIENT_SECRET`) — just keep the `vault:` map keys and the code in sync.
108
+ - **AI (optional):** if you later add `needs: { ai: true }`, the grid injects
109
+ **`AI_GATEWAY_URL`** for use with `@cloudgrid-io/ai` (e.g. drafting policy text
110
+ or summarizing requests). Not required for the core portal.
111
+
112
+ Non-secret config (log level, default PTO allotment) → `services.web.env` in the
113
+ yaml, or `grid env`. Actual secrets → the vault (never `env:`, never committed).
114
+
115
+ ---
116
+
117
+ ## 4. Wiring auth (employee / admin roles)
118
+
119
+ Pick one provider and follow its Next.js App-Router quickstart. The CloudGrid
120
+ specifics:
121
+
122
+ 1. **Keys from the vault, not the SDK dashboard's `.env`.** Store the provider's
123
+ secret + publishable keys as org vault items; the `vault:` block injects them
124
+ as env vars. Do not commit local env files (`.env`).
125
+ 2. **Provider in the layout.** Wrap `app/layout.js` children in the provider
126
+ component (`<ClerkProvider>` or the Auth0 provider).
127
+ 3. **Middleware gate.** `services/web/middleware.js` protects every route except
128
+ the sign-in/sign-up pages and public assets. Unauthenticated requests redirect
129
+ to sign-in.
130
+ 4. **Role resolution.** `lib/auth.js` reads the session, looks up the matching
131
+ `employees` document by `authUserId`, and returns `{ userId, email, role }`.
132
+ Seed the first `admin` by inserting an `employees` doc with `role: "admin"`
133
+ (or promote via an admin-only route). Store `role` on the HR record — do not
134
+ trust a client-sent role.
135
+ 5. **Server-side role checks on every mutation.** In the API routes and the
136
+ `app/admin/` pages, re-resolve the user server-side and reject non-admins with
137
+ 403 before approving/rejecting. Never gate on the client alone.
138
+
139
+ (If the portal ever needs paid tiers, add Stripe the same way: map
140
+ `STRIPE_KEY: stripe-live-key` in `vault:`, add `app/api/checkout/route.js` and a
141
+ `app/api/webhooks/stripe/route.js` webhook route reading
142
+ `process.env.STRIPE_KEY`. Not part of the core HR portal.)
143
+
144
+ ---
145
+
146
+ ## 5. Deploy steps
147
+
148
+ A runtime deploy is **async** and needs the **local edition** (see below).
149
+
150
+ 1. **`grid init`** an app named `hr-portal` — creates the entity +
151
+ `.cloudgrid/link.json` and a `cloudgrid.yaml` with an empty `services: {}`.
152
+ Run `init` FIRST (`plug` needs a linked directory).
153
+ 2. **Fill** the code under `services/web/` and set `cloudgrid.yaml` to the active
154
+ shape: `name` + `services.web { type: nextjs, path: / }` + `needs:
155
+ { database: true }` + the `vault:` auth-key map.
156
+ 3. **Create the vault items** the `vault:` block references (the auth provider's
157
+ secret + publishable keys). `grid secrets` / vault UI — never commit them.
158
+ 4. **(Optional) `grid dev`** to run locally against the injected dev Mongo + the
159
+ injected vault env vars before deploying.
160
+ 5. **`grid plug`** to build + deploy the folder. The first response is
161
+ `status: building`, NOT a live URL — **poll `grid status`** (or the returned
162
+ poll URL) until the entity is live, surfacing a liveness signal while it
163
+ builds. Only then return the live app URL. Re-plug the SAME entity to update
164
+ the same URL.
165
+
166
+ ---
167
+
168
+ ## 6. Edition note
169
+
170
+ This is a persistent, built-and-deployed runtime app (Next.js container + Mongo +
171
+ auth). It requires the **local edition** (Claude Desktop / Claude Code) or the
172
+ CLI. The **hosted edition** (Claude Web / hosted MCP) is inline-only and can only
173
+ publish static pages — it cannot build this runtime app. On hosted, stop the
174
+ runtime path and offer a static mock instead.
@@ -0,0 +1,14 @@
1
+ # hr-portal template — blueprint (structure + cloudgrid.yaml)
2
+
3
+ A persistent HR / employee portal: a Next.js app on CloudGrid backed by the
4
+ grid-shared MongoDB, with employee/admin auth via a provider SDK (Clerk or
5
+ Auth0) whose keys come from the org vault, and a leave/PTO request + approval
6
+ flow (`employees` + `leaveRequests` collections). It is a persistent runtime app
7
+ because HR records and leave requests must survive refresh and be shared across
8
+ users — not a static page.
9
+
10
+ **This is a blueprint: structure + cloudgrid.yaml, not filled app code.** Read
11
+ `AGENTS.md` for the full structure guide — the `services/web/` file tree, the
12
+ Mongo collections, how CloudGrid injects the DB (`DATABASE_MONGODB_URL`) and the
13
+ vault-backed auth keys, how to wire auth roles, and the `grid init → fill → grid
14
+ plug → poll` deploy flow — then adapt it and build the app following it.
@@ -0,0 +1,237 @@
1
+ # ============================================================================
2
+ # cloudgrid.yaml — Complete Example
3
+ # ============================================================================
4
+ #
5
+ # This file shows EVERY field the platform supports, with comments explaining
6
+ # each one. It is a reference — no real project would use all of these at once.
7
+ #
8
+ # STANDARD: every CloudGrid template ships its cloudgrid.yaml in THIS full form.
9
+ # Uncomment ONLY the fields the archetype needs (always: name + services; plus
10
+ # needs: for runtime apps). Leave everything else commented. Comments are
11
+ # ignored by the parser, so the file deploys to exactly the active fields.
12
+ #
13
+ # Only two fields are required: name and services. Everything else is optional.
14
+ # Full docs: docs/cloudgrid-yaml-reference.md
15
+ # ============================================================================
16
+
17
+
18
+ # ─── IDENTITY ───────────────────────────────────────────────────────────────
19
+
20
+ # Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
21
+ # Must start and end with a letter or digit.
22
+ # Becomes part of your public URL: <name>-<4hex>.<org>.cloudgrid.io
23
+ name: hr-portal
24
+
25
+ # One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
26
+ # description: Order processing API for the e-commerce platform
27
+
28
+ # Single emoji or short text shown as the entity icon. Max 64 chars.
29
+ # icon: "📦"
30
+
31
+ # Entity type: 'app' (default) or 'agent'. An agent is an app with an agent: block.
32
+ # kind: app
33
+
34
+
35
+ # ─── NETWORKING ─────────────────────────────────────────────────────────────
36
+
37
+ # Whether this entity serves public HTTP traffic.
38
+ # true = public URL + Ingress (default). false = internal only.
39
+ # expose: true
40
+
41
+ # Additional domain names this entity serves on (the platform URL is always active).
42
+ # custom_domains:
43
+ # - orders.example.com
44
+ # - shop.example.com
45
+
46
+
47
+ # ─── HEALTH PROBE (entity-level override) ──────────────────────────────────
48
+
49
+ # Override the default health check for the entire entity.
50
+ # probe:
51
+ # path: /healthz # HTTP path to probe (default: /).
52
+ # expected: "<500" # '<500' (default), '200', '2xx'.
53
+
54
+
55
+ # ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
56
+
57
+ # Slack notification to the org's default channel on deploy failure.
58
+ # true = notify (default), false = silent.
59
+ # notify: true
60
+
61
+
62
+ # ─── SCALING ────────────────────────────────────────────────────────────────
63
+
64
+ # Replica scaling intent.
65
+ # 'auto' — platform decides from the grid tier (default).
66
+ # 'alert' — single-replica, emit a SPOF warning at plug time.
67
+ # 1-10 — explicit replica count, clamped to the grid max.
68
+ # scale: auto
69
+
70
+
71
+ # ─── INFRASTRUCTURE NEEDS ──────────────────────────────────────────────────
72
+ #
73
+ # Declare infrastructure; the platform provisions it and injects connection
74
+ # details as env vars. Nine needs: database, cache, kv, queue, pubsub, vector,
75
+ # object_storage, disk, ai. Simplest form is `true`.
76
+ #
77
+ # needs:
78
+ # # database — MongoDB. Injects DATABASE_MONGODB_URL (+ legacy MONGODB_URL).
79
+ # # true | pool | dedicated | { tier: external, secret: MY_DB }
80
+ # database: true
81
+ # # cache — Redis, LRU eviction (derived data). Injects CACHE_REDIS_URL (+ REDIS_URL).
82
+ # # true | redis | { engine: external, secret: MY_REDIS_URL }
83
+ # cache: true
84
+ # # kv — Redis, no eviction (durable: flags, idempotency). Injects KV_REDIS_URL.
85
+ # kv: true
86
+ # # queue — Redis job-queue substrate (BullMQ). Injects QUEUE_REDIS_URL.
87
+ # queue: true
88
+ # # pubsub — Redis broadcast pub/sub. Injects PUBSUB_REDIS_URL.
89
+ # pubsub: true
90
+ # # vector — pgvector on Postgres. Injects VECTOR_PGVECTOR_URL (+ PGVECTOR_URL).
91
+ # # true | pgvector | { engine: pgvector, dim: 1536 }
92
+ # vector: pgvector
93
+ # # object_storage — GCS bucket. Injects OBJECT_STORAGE_GCS_BUCKET, _GCS_REGION.
94
+ # # true | { size: 10Gi }
95
+ # object_storage: true
96
+ # # disk — persistent FS mount (PVC). Injects DISK_PATH. Pins to 1 replica.
97
+ # # true | { size: 1Gi, mount: /var/data } (forbidden: /proc /sys /dev)
98
+ # disk: true
99
+ # # ai — AI Gateway via @cloudgrid-io/ai. Injects AI_GATEWAY_URL. true | false.
100
+ # ai: true
101
+
102
+
103
+ # ─── INTER-ENTITY COMMUNICATION ────────────────────────────────────────────
104
+
105
+ # Entities this app calls (outbound). Service-account token injected per pair.
106
+ # calls:
107
+ # - org:atomic/billing-api
108
+
109
+ # Inbound caller policy — who can call YOUR entity.
110
+ # callers:
111
+ # policy: auto # 'auto' | 'manual' (default).
112
+ # scope: org # 'org' (default) | 'space' | 'explicit'.
113
+ # fallback: deny # 'deny' (default) | 'warn'.
114
+ # # allowed_apps: # required only when scope: explicit
115
+ # # - org:atomic/frontend
116
+
117
+
118
+ # ─── VAULT ──────────────────────────────────────────────────────────────────
119
+
120
+ # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
121
+ # The HR portal authenticates employees/admins through a provider SDK (Clerk or
122
+ # Auth0). Store the provider's secret + publishable keys as org vault items and
123
+ # map them to env vars here — never hardcode them or commit them. The deployer
124
+ # injects these as env vars at build-time and runtime.
125
+ vault:
126
+ AUTH_PROVIDER_SECRET_KEY: auth-provider-secret-key
127
+ AUTH_PROVIDER_PUBLISHABLE_KEY: auth-provider-publishable-key
128
+
129
+
130
+ # ─── CONNECTORS AND HOOKS ──────────────────────────────────────────────────
131
+
132
+ # connectors:
133
+ # - id: team-slack
134
+ # target: org # 'system' | 'org'.
135
+ # channel: "#deploys"
136
+ # hooks:
137
+ # - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
138
+ # via: team-slack
139
+ # template: "Deploy failed for {entity_name}: {error}"
140
+ # channel: "#alerts"
141
+ # triggers:
142
+ # - from: team-slack
143
+ # event: message
144
+ # channel: "#support"
145
+ # route: /webhooks/slack
146
+
147
+
148
+ # ─── LOCAL DEVELOPMENT ──────────────────────────────────────────────────────
149
+
150
+ # Config for `grid dev`. Redact fields in dev data snapshots.
151
+ # dev:
152
+ # snapshot:
153
+ # mask:
154
+ # - users.email
155
+ # - users.phone
156
+
157
+
158
+ # ─── AGENT METADATA ────────────────────────────────────────────────────────
159
+
160
+ # An agent is an app with kind: agent (above) and an agent: block.
161
+ # agent:
162
+ # purpose: Sync customer data from external CRM every night
163
+ # schedule: "0 2 * * *"
164
+ # trigger: webhook
165
+
166
+
167
+ # ─── PRIVATE RESOURCE AUTO-DEPENDENCIES ────────────────────────────────────
168
+
169
+ # When true (default), private resources are auto-injected as depends_on.
170
+ # auto_depends_on_private_requires: true
171
+
172
+
173
+ # ─── SERVICES (REQUIRED) ───────────────────────────────────────────────────
174
+ #
175
+ # At least one service is required. Key = service name (slug rules).
176
+ # Types: node, nextjs, python, static, cron.
177
+ #
178
+ services:
179
+ web:
180
+ # type (REQUIRED): node | nextjs | python | static | cron
181
+ type: nextjs
182
+ # HTTP route: '/' | '/api' | false (internal) | omitted (=false + warning).
183
+ # Only one service per entity can claim '/'.
184
+ path: /
185
+ # Container port (default 8080; read process.env.PORT). Not for cron.
186
+ # port: 3000
187
+ # nextjs only: base_image: distroless (default) | alpine
188
+ # base_image: distroless
189
+ # node only: lang: javascript (default) | typescript
190
+ # lang: typescript
191
+ # Custom source location (default services/<name>/). '.' = project root.
192
+ # source:
193
+ # path: src/worker
194
+ # Health probe: false/omitted (TCP) | true (/health) | "/path" | {path,expected}
195
+ # health:
196
+ # path: /api/health
197
+ # expected: "200"
198
+ # Static runtime env vars (strings). Reserved: PORT, APP_NAME, SERVICE_NAME,
199
+ # NODE_ENV, MONGODB_URL, REDIS_URL, AI_GATEWAY_URL, N8N_WEBHOOK_URL, CLOUDGRID_*.
200
+ # env:
201
+ # LOG_LEVEL: info
202
+ # Sibling services/private resources that must be Ready first (no cron, no cycles).
203
+ # depends_on:
204
+ # - worker
205
+ # Per-service needs override (merges with app-level needs).
206
+ # needs:
207
+ # queue: true
208
+ # Static-only build step:
209
+ # build:
210
+ # command: npm run build
211
+ # output: dist
212
+ # env:
213
+ # VITE_API_URL: https://api.example.com
214
+ # node_version: "22" # static build step: '18'|'20'|'22'|'24' (quoted)
215
+ # Cron-only: schedule (REQUIRED), timezone (UTC|EST|PST), run (job | https URL)
216
+ # schedule: "0 9 * * 1"
217
+ # timezone: UTC
218
+ # run: job
219
+ # Verbose per-service persistence (prefer needs.disk):
220
+ # persist:
221
+ # - name: scratch
222
+ # path: /tmp/scratch
223
+ # size: 500Mi
224
+
225
+
226
+
227
+ needs:
228
+ database: true
229
+
230
+
231
+ # ============================================================================
232
+ # NOTES
233
+ # - NOT here: org:/entity_id: (→ .cloudgrid/link.json), secrets (→ grid secrets set),
234
+ # Dockerfile (platform generates from services.*.type).
235
+ # - Deploy: grid plug | Local with grid resources: grid dev
236
+ # - Full reference: docs/cloudgrid-yaml-reference.md | CLI: docs/cli-reference.md
237
+ # ============================================================================
@@ -0,0 +1,56 @@
1
+ # Template: hr-portal (blueprint — persistent Next.js + Mongo + auth)
2
+
3
+ A **blueprint** for an HR / employee portal: a persistent Next.js app on
4
+ CloudGrid backed by the grid-shared MongoDB, with employee/admin auth via a
5
+ provider SDK (Clerk or Auth0) whose keys come from the org vault, and a
6
+ leave/PTO request + approval flow. This ships the **structure + cloudgrid.yaml**,
7
+ NOT filled app code — read `AGENTS.md` and build the app following it.
8
+
9
+ **Key rules:**
10
+
11
+ 1. **This is a blueprint.** Fetch it, read `AGENTS.md` (file tree, Mongo
12
+ collections, CloudGrid wiring, deploy flow), then build the app under
13
+ `services/web/`. There is no ready-made app code to copy.
14
+ 2. **Service code MUST live under `services/<name>/`, not the repo root.**
15
+ `path:` in `cloudgrid.yaml` is the URL mount, NOT the filesystem path. The
16
+ service named `web` → the CLI looks for `services/web/`.
17
+ 3. **Declare the datastore with `needs: { database: true }`** — the deployer
18
+ provisions Mongo and injects `DATABASE_MONGODB_URL` (plus the legacy
19
+ `MONGODB_URL` alias). Read it lazily inside a getter, never at module top
20
+ level (a top-level read fails `next build`). `requires:` is the deprecated v1
21
+ alias; never set `needs:` and `requires:` together.
22
+ 4. **Auth secrets come from the `vault:` block, not committed env files.** The
23
+ yaml maps the provider's secret + publishable keys → env vars
24
+ (`AUTH_PROVIDER_SECRET_KEY`, `AUTH_PROVIDER_PUBLISHABLE_KEY`); the deployer
25
+ injects them at build + runtime. Create the vault items first.
26
+
27
+ Runtime app → **local edition only**, async deploy (poll to a live URL).
28
+
29
+ ## Fetch bundle
30
+
31
+ Fetch this blueprint with `gridctl_fetch("template", "hr-portal")`. It returns
32
+ `cloudgrid.yaml`, `AGENTS.md` (the structure guide), and this README — no app
33
+ code. Follow `AGENTS.md` to build, then `grid init → fill → grid plug → poll`.
34
+
35
+ ## cloudgrid.yaml
36
+
37
+ ```yaml
38
+ # On disk this file is the full-annotated reference (templates/_cloudgrid.yaml.reference) with EVERY
39
+ # field present as a comment; only the fields below are uncommented, so it
40
+ # deploys to exactly these active fields.
41
+ name: hr-portal
42
+ services:
43
+ web:
44
+ type: nextjs
45
+ path: /
46
+ vault:
47
+ AUTH_PROVIDER_SECRET_KEY: auth-provider-secret-key
48
+ AUTH_PROVIDER_PUBLISHABLE_KEY: auth-provider-publishable-key
49
+ needs:
50
+ database: true
51
+ ```
52
+
53
+ > **Capability:** `needs: { database: true }` → the deployer provisions Mongo and
54
+ > injects `DATABASE_MONGODB_URL` (plus the legacy `MONGODB_URL` alias). The
55
+ > `vault:` block injects the auth provider's keys as env vars. `requires:` is the
56
+ > deprecated v1 alias — don't mix it with `needs:`.