@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
@@ -1,20 +1,234 @@
1
- # Rename this chatbot. The grid wires the AI gateway (in-grid identity — no API
2
- # key) and injects the DB connection string as an environment variable at
3
- # runtime. Do NOT set an AI key, do NOT set the DB var yourself, and never commit
4
- # a connection string or secret.
1
+ # ============================================================================
2
+ # cloudgrid.yaml — Complete Example
3
+ # ============================================================================
5
4
  #
6
- # `needs: { ai: true, database: true }` is the canonical shape. The deployer
7
- # wires the AI gateway and provisions Mongo, injecting DATABASE_MONGODB_URL (plus
8
- # the legacy MONGODB_URL alias). `requires:` is the deprecated v1 alias — don't
9
- # author new yaml with it, and never set `needs:` and `requires:` together (the
10
- # validator rejects it).
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
11
23
  name: my-chatbot
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
+ # vault:
122
+ # STRIPE_KEY: stripe-live-key
123
+ # SENDGRID_API_KEY: sendgrid-key
124
+
125
+
126
+ # ─── CONNECTORS AND HOOKS ──────────────────────────────────────────────────
127
+
128
+ # connectors:
129
+ # - id: team-slack
130
+ # target: org # 'system' | 'org'.
131
+ # channel: "#deploys"
132
+ # hooks:
133
+ # - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
134
+ # via: team-slack
135
+ # template: "Deploy failed for {entity_name}: {error}"
136
+ # channel: "#alerts"
137
+ # triggers:
138
+ # - from: team-slack
139
+ # event: message
140
+ # channel: "#support"
141
+ # route: /webhooks/slack
142
+
143
+
144
+ # ─── LOCAL DEVELOPMENT ──────────────────────────────────────────────────────
145
+
146
+ # Config for `grid dev`. Redact fields in dev data snapshots.
147
+ # dev:
148
+ # snapshot:
149
+ # mask:
150
+ # - users.email
151
+ # - users.phone
152
+
153
+
154
+ # ─── AGENT METADATA ────────────────────────────────────────────────────────
155
+
156
+ # An agent is an app with kind: agent (above) and an agent: block.
157
+ # agent:
158
+ # purpose: Sync customer data from external CRM every night
159
+ # schedule: "0 2 * * *"
160
+ # trigger: webhook
161
+
162
+
163
+ # ─── PRIVATE RESOURCE AUTO-DEPENDENCIES ────────────────────────────────────
164
+
165
+ # When true (default), private resources are auto-injected as depends_on.
166
+ # auto_depends_on_private_requires: true
167
+
168
+
169
+ # ─── SERVICES (REQUIRED) ───────────────────────────────────────────────────
170
+ #
171
+ # At least one service is required. Key = service name (slug rules).
172
+ # Types: node, nextjs, python, static, cron.
173
+ #
12
174
  services:
13
175
  web:
176
+ # type (REQUIRED): node | nextjs | python | static | cron
14
177
  type: nextjs
178
+ # HTTP route: '/' | '/api' | false (internal) | omitted (=false + warning).
179
+ # Only one service per entity can claim '/'.
15
180
  path: /
181
+ # Container port (default 8080; read process.env.PORT). Not for cron.
182
+ # port: 3000
183
+ # nextjs only: base_image: distroless (default) | alpine
184
+ # base_image: distroless
185
+ # node only: lang: javascript (default) | typescript
186
+ # lang: typescript
187
+ # Custom source location (default services/<name>/). '.' = project root.
188
+ # source:
189
+ # path: src/worker
190
+ # Health probe: false/omitted (TCP) | true (/health) | "/path" | {path,expected}
191
+ # health:
192
+ # path: /api/health
193
+ # expected: "200"
194
+ # Static runtime env vars (strings). Reserved: PORT, APP_NAME, SERVICE_NAME,
195
+ # NODE_ENV, MONGODB_URL, REDIS_URL, AI_GATEWAY_URL, N8N_WEBHOOK_URL, CLOUDGRID_*.
196
+ # env:
197
+ # LOG_LEVEL: info
198
+ # Sibling services/private resources that must be Ready first (no cron, no cycles).
199
+ # depends_on:
200
+ # - worker
201
+ # Per-service needs override (merges with app-level needs).
202
+ # needs:
203
+ # queue: true
204
+ # Static-only build step:
205
+ # build:
206
+ # command: npm run build
207
+ # output: dist
208
+ # env:
209
+ # VITE_API_URL: https://api.example.com
210
+ # node_version: "22" # static build step: '18'|'20'|'22'|'24' (quoted)
211
+ # Cron-only: schedule (REQUIRED), timezone (UTC|EST|PST), run (job | https URL)
212
+ # schedule: "0 9 * * 1"
213
+ # timezone: UTC
214
+ # run: job
215
+ # Verbose per-service persistence (prefer needs.disk):
216
+ # persist:
217
+ # - name: scratch
218
+ # path: /tmp/scratch
219
+ # size: 500Mi
220
+
221
+
222
+
16
223
  needs:
17
224
  ai: true
18
225
  database: true
19
- # For retrieval-augmented (RAG) over your own docs, add `needs: { vector:
20
- # pgvector }` once platform issue #1545 ships — not yet available.
226
+
227
+
228
+ # ============================================================================
229
+ # NOTES
230
+ # - NOT here: org:/entity_id: (→ .cloudgrid/link.json), secrets (→ grid secrets set),
231
+ # Dockerfile (platform generates from services.*.type).
232
+ # - Deploy: grid plug | Local with grid resources: grid dev
233
+ # - Full reference: docs/cloudgrid-yaml-reference.md | CLI: docs/cli-reference.md
234
+ # ============================================================================
@@ -47,15 +47,9 @@ services/web/app/api/chat/route.js # POST: createClient().chat(...) -> persis
47
47
  ## cloudgrid.yaml
48
48
 
49
49
  ```yaml
50
- # Rename this chatbot. The grid wires the AI gateway (in-grid identity — no API
51
- # key) and injects the DB connection string as an environment variable at
52
- # runtime. Do NOT set an AI key, do NOT set the DB var yourself, and never commit
53
- # a connection string or secret.
54
- #
55
- # `needs: { ai: true, database: true }` is the canonical shape. The deployer
56
- # wires the AI gateway and provisions Mongo, injecting DATABASE_MONGODB_URL (plus
57
- # the legacy MONGODB_URL alias). `requires:` is the deprecated v1 alias — don't
58
- # author new yaml with it, and never set `needs:` and `requires:` together.
50
+ # On disk this file is the full-annotated reference (templates/_cloudgrid.yaml.reference) with EVERY
51
+ # field present as a comment; only the fields below are uncommented, so it
52
+ # deploys to exactly these active fields.
59
53
  name: my-chatbot
60
54
  services:
61
55
  web:
@@ -64,8 +58,6 @@ services:
64
58
  needs:
65
59
  ai: true
66
60
  database: true
67
- # For retrieval-augmented (RAG) over your own docs, add `needs: { vector:
68
- # pgvector }` once platform issue #1545 ships — not yet available.
69
61
  ```
70
62
 
71
63
  > **Capability:** this template's needs are `ai: true` (the grid AI gateway,
@@ -0,0 +1,254 @@
1
+ # AGENTS.md — ai-knowledge-base blueprint (structure guide)
2
+
3
+ This is a **blueprint**, not a runnable app. It ships a `cloudgrid.yaml` and this
4
+ guide so an agent can *build* a retrieval-augmented "ask my docs" knowledge base
5
+ correctly on CloudGrid. There is no app code to copy — read this, generate the
6
+ files, then deploy.
7
+
8
+ An AI knowledge base is a persistent Next.js + Mongo runtime app (same base shape
9
+ as `app-with-data` / `crm`) with a **RAG** loop layered on: ingest documents →
10
+ chunk them → embed each chunk → store the vectors → at query time embed the
11
+ question, retrieve the nearest chunks, and ask the model to answer grounded in
12
+ them (with citations). Both the embedding and the answer step run through
13
+ CloudGrid's **AI Gateway** (`@cloudgrid-io/ai`, injected via `needs: { ai: true }`).
14
+
15
+ > **Vector-store status (read this first):** the ideal store for embeddings is
16
+ > `needs: vector` (pgvector on Postgres, injecting `VECTOR_PGVECTOR_URL`), but it
17
+ > is **PENDING platform issue #1545** and not yet provisioned. The **`ai` part
18
+ > works today.** Until #1545 ships, store embeddings in **Mongo** (a `chunks`
19
+ > collection with an `embedding: number[]` field) and compute cosine similarity in
20
+ > the app. This blueprint's `cloudgrid.yaml` therefore declares
21
+ > `needs: { ai: true, database: true }` and keeps `vector: pgvector` commented.
22
+ > Section 7 describes the drop-in swap once #1545 lands.
23
+
24
+ ---
25
+
26
+ ## 1. File tree
27
+
28
+ App code MUST live under `services/web/` — `path: /` in `cloudgrid.yaml` is the
29
+ URL mount, NOT the filesystem path. Files at the repo root fail with
30
+ `Error: Service directory not found: …/services/web`.
31
+
32
+ ```
33
+ cloudgrid.yaml # name + services.web(nextjs,/) + needs:{ai:true, database:true}
34
+ services/web/
35
+ package.json # next, react, react-dom, mongodb, @cloudgrid-io/ai
36
+ lib/
37
+ db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
38
+ ai.js # lazy @cloudgrid-io/ai client from AI_GATEWAY_URL — embed() + chat()
39
+ chunk.js # pure fn: splitIntoChunks(text) -> string[] (e.g. ~800-token windows, overlap)
40
+ retrieve.js # embed query -> cosine-rank chunks in Mongo -> top-k with scores
41
+ app/
42
+ layout.js # root layout + inline CSS
43
+ page.js # server component: doc list + upload form + ask box
44
+ documents/[id]/page.js # a document's chunks / indexing status
45
+ ask-box.js # client component: POST a question, stream/show the grounded answer + citations
46
+ api/
47
+ documents/route.js # GET list docs / POST ingest (chunk -> embed -> store) / DELETE (doc + its chunks)
48
+ ask/route.js # POST { question } -> retrieve top-k chunks -> chat() grounded answer + sources
49
+ ```
50
+
51
+ Keep it minimal and real; grow routes/collections as needed. Reuse the
52
+ `app-with-data` App-Router GET/POST/DELETE route shape for the CRUD parts.
53
+
54
+ ---
55
+
56
+ ## 2. Mongo collections + fields
57
+
58
+ The grid provisions one MongoDB database (`needs: { database: true }`). Suggested
59
+ collections (`_id` is the Mongo ObjectId on every doc):
60
+
61
+ **`documents`** — a source document the user added
62
+ - `title` (string)
63
+ - `source` (string — filename, URL, or "pasted")
64
+ - `status` (string: `indexing` | `ready` | `failed`)
65
+ - `chunkCount` (number — how many chunks it produced)
66
+ - `createdAt` (Date)
67
+
68
+ **`chunks`** — one embeddable slice of a document (the retrieval unit)
69
+ - `documentId` (ObjectId ref → documents)
70
+ - `text` (string — the chunk content, returned as a citation)
71
+ - `ordinal` (number — chunk order within the doc)
72
+ - `embedding` (number[] — the embedding vector; e.g. length 1536)
73
+ - `createdAt` (Date)
74
+
75
+ Until issue #1545 lands, `chunks.embedding` lives in Mongo and you rank in the
76
+ app (Section 3). When pgvector ships, the vectors move to Postgres and `chunks`
77
+ keeps only the text + a foreign key (Section 7).
78
+
79
+ ---
80
+
81
+ ## 3. How CloudGrid injects things
82
+
83
+ You never provision infra or set connection strings by hand. Declared inputs are
84
+ injected as env vars at `grid dev` (local) and at runtime (after `grid plug`):
85
+
86
+ | What | Declared in cloudgrid.yaml | Injected env var(s) | Read in code |
87
+ |------|----------------------------|---------------------|--------------|
88
+ | MongoDB | `needs: { database: true }` | `DATABASE_MONGODB_URL` (+ legacy `MONGODB_URL`) | `lib/db.js` |
89
+ | AI Gateway | `needs: { ai: true }` | `AI_GATEWAY_URL` | `lib/ai.js` (via `@cloudgrid-io/ai`) |
90
+ | Vector store (PENDING #1545) | `needs: { vector: pgvector }` | `VECTOR_PGVECTOR_URL` (+ legacy `PGVECTOR_URL`) | `lib/retrieve.js` — not yet available |
91
+ | Auth key (optional) | `vault: { AUTH_PROVIDER_KEY: auth-provider-key }` | `AUTH_PROVIDER_KEY` | `lib/auth.js` |
92
+ | Stripe key (optional) | `vault: { STRIPE_KEY: stripe-live-key }` | `STRIPE_KEY` | `lib/stripe.js` |
93
+
94
+ The **AI Gateway needs no API key** — `needs: { ai: true }` injects
95
+ `AI_GATEWAY_URL` and `@cloudgrid-io/ai` routes through it. The `vault:` block only
96
+ **maps** an org vault item key → an env var name; store the real value once with
97
+ `grid secrets set <vault-item-key> <value>`. Never commit a secret; never hardcode
98
+ a connection string.
99
+
100
+ **Read injected values LAZILY inside a getter, never at module top level** — a
101
+ top-level `const uri = process.env.DATABASE_MONGODB_URL` fails `next build` (the
102
+ module is imported for route analysis before the grid injects the var). Same rule
103
+ for the AI client.
104
+
105
+ ```js
106
+ // lib/db.js — same proven shape as app-with-data
107
+ import { MongoClient } from "mongodb";
108
+ export async function getDb() {
109
+ const uri = process.env.DATABASE_MONGODB_URL || process.env.MONGODB_URL;
110
+ if (!uri) throw new Error("DATABASE_MONGODB_URL not set — run via `grid dev` / `grid plug`.");
111
+ globalThis.__mongo ??= new MongoClient(uri).connect();
112
+ return (await globalThis.__mongo).db();
113
+ }
114
+ ```
115
+
116
+ ```js
117
+ // lib/ai.js — lazy AI Gateway client (no API key; the gateway URL is injected)
118
+ import { createClient } from "@cloudgrid-io/ai";
119
+ function ai() {
120
+ const url = process.env.AI_GATEWAY_URL;
121
+ if (!url) throw new Error("AI_GATEWAY_URL not set — declare needs:{ai:true} and run via `grid dev`/`grid plug`.");
122
+ globalThis.__ai ??= createClient({ baseURL: url });
123
+ return globalThis.__ai;
124
+ }
125
+ // embed one or many strings -> vectors (used for both indexing and queries)
126
+ export async function embed(texts) {
127
+ const res = await ai().embeddings.create({ input: Array.isArray(texts) ? texts : [texts] });
128
+ return res.data.map((d) => d.embedding);
129
+ }
130
+ // grounded chat answer
131
+ export async function chat(messages) {
132
+ const res = await ai().chat.completions.create({ messages });
133
+ return res.choices[0].message.content;
134
+ }
135
+ ```
136
+
137
+ ---
138
+
139
+ ## 4. The RAG loop (build this)
140
+
141
+ ### Ingest (`POST /api/documents`)
142
+ 1. Accept a title + raw text (or a fetched URL's text).
143
+ 2. `splitIntoChunks(text)` in `lib/chunk.js` — a pure function producing ~800-token
144
+ windows with a small overlap so context isn't cut mid-idea.
145
+ 3. Insert a `documents` doc with `status: "indexing"`.
146
+ 4. `embed(chunkTexts)` (batch) via `lib/ai.js`, then insert one `chunks` doc per
147
+ chunk with its `embedding`, `text`, `ordinal`, and `documentId`.
148
+ 5. Update the document to `status: "ready"`, `chunkCount: n`.
149
+
150
+ ### Retrieve (`lib/retrieve.js`)
151
+ 1. `embed(question)` -> query vector.
152
+ 2. Until pgvector (#1545): load candidate `chunks`, compute cosine similarity in
153
+ the app, keep the top-k (e.g. k=5). Keep it a pure, testable ranking function
154
+ so it swaps cleanly to a pgvector query later.
155
+
156
+ ```js
157
+ // lib/retrieve.js — cosine top-k over Mongo-stored embeddings (pre-#1545)
158
+ import { getDb } from "./db.js";
159
+ import { embed } from "./ai.js";
160
+ const dot = (a, b) => a.reduce((s, x, i) => s + x * b[i], 0);
161
+ const norm = (a) => Math.sqrt(dot(a, a));
162
+ const cosine = (a, b) => dot(a, b) / (norm(a) * norm(b) || 1);
163
+ export async function retrieve(question, k = 5) {
164
+ const [q] = await embed(question);
165
+ const db = await getDb();
166
+ const chunks = await db.collection("chunks").find({}).toArray();
167
+ return chunks
168
+ .map((c) => ({ text: c.text, documentId: c.documentId, score: cosine(q, c.embedding) }))
169
+ .sort((a, b) => b.score - a.score)
170
+ .slice(0, k);
171
+ }
172
+ ```
173
+
174
+ ### Answer (`POST /api/ask`)
175
+ 1. `retrieve(question)` -> top-k chunks.
176
+ 2. Build a system prompt: *"Answer ONLY from the provided context; if it isn't
177
+ there, say you don't know. Cite the chunks you used."* Put the retrieved chunk
178
+ texts (with ids) in the context.
179
+ 3. `chat([...])` via `lib/ai.js`; return the answer plus the source chunks so the
180
+ UI can render **citations**. Grounding + citations are the point — never let the
181
+ model answer from parametric memory alone.
182
+
183
+ ---
184
+
185
+ ## 5. Wiring optional auth / payments
186
+
187
+ Not needed for a personal KB, but common when the KB is internal or paid:
188
+
189
+ - **Auth (gate the chat UI):** add an auth SDK (`@clerk/nextjs` or
190
+ `@auth0/nextjs-auth0`) to `package.json`, uncomment the `vault:` block mapping
191
+ `AUTH_PROVIDER_KEY`, init it in `lib/auth.js` from `process.env.AUTH_PROVIDER_KEY`,
192
+ and protect `/` + `/api/*` in `middleware.js`. Store the value with
193
+ `grid secrets set auth-provider-key …`; set any non-secret public key via
194
+ `grid env`.
195
+ - **Payments (charge for access):** add `stripe` to `package.json`, uncomment the
196
+ `vault:` block mapping `STRIPE_KEY`, add a lazy `lib/stripe.js` reading
197
+ `process.env.STRIPE_KEY`, a Checkout route, and a signature-verified
198
+ `api/webhooks/stripe/route.js`. Store `grid secrets set stripe-live-key sk_live_…`.
199
+
200
+ Both keys ride the CloudGrid **vault** — the yaml maps the vault item to an env
201
+ var, and `grid secrets set` stores the real value. Never inline a key.
202
+
203
+ ---
204
+
205
+ ## 6. Deploy steps
206
+
207
+ Runtime app → **local edition** only (Claude Desktop / Claude Code / CLI); the
208
+ hosted edition cannot build a runtime container. Order matters — `plug` needs a
209
+ linked directory, so `init` first.
210
+
211
+ 1. `grid init` (or `gridctl_init`) an app `<name>` — creates the entity +
212
+ `.cloudgrid/link.json` and a starter `cloudgrid.yaml` with empty `services:{}`.
213
+ 2. Fill: put the app under `services/web/` and set `cloudgrid.yaml` to this
214
+ blueprint's active fields (`services.web` nextjs `/`, `needs:{ai:true,
215
+ database:true}`).
216
+ 3. (If you added auth/payments) store the vault secrets with `grid secrets set`;
217
+ non-secret public config → `grid env`. The AI Gateway and Mongo need no secrets
218
+ — they are injected by `needs`.
219
+ 4. (Optional) `grid dev` to run locally against the injected dev Mongo + AI Gateway.
220
+ 5. `grid plug` to deploy. A runtime deploy is **ASYNC** — the first response is
221
+ `status: building`, not a live URL. Poll `grid status` (surface a liveness
222
+ signal, never a bare wait) until Ready.
223
+ 6. Once live, return the app URL. Re-plug the same entity to update the same URL.
224
+
225
+ ---
226
+
227
+ ## 7. When pgvector (#1545) lands — the swap
228
+
229
+ Once `needs: vector` is available, migrate off the in-app cosine ranking:
230
+
231
+ 1. Uncomment `vector: pgvector` in `cloudgrid.yaml`'s `needs:` block (dim 1536 to
232
+ match your embedding model). The grid then injects `VECTOR_PGVECTOR_URL` (+
233
+ legacy `PGVECTOR_URL`).
234
+ 2. Store each chunk's embedding in a pgvector `vector` column instead of the Mongo
235
+ `chunks.embedding` array; keep the chunk `text` either in Postgres or as a
236
+ Mongo row keyed by the same id.
237
+ 3. Rewrite `lib/retrieve.js` to run an ORDER-BY-distance query
238
+ (`ORDER BY embedding <=> $queryVec LIMIT k`) against `VECTOR_PGVECTOR_URL`
239
+ instead of loading all chunks and ranking in JS. Because `retrieve()` is already
240
+ a single function returning `{ text, documentId, score }[]`, `POST /api/ask`
241
+ and the UI don't change.
242
+
243
+ Read the pgvector URL with the same lazy-getter discipline (never at module top
244
+ level).
245
+
246
+ ---
247
+
248
+ ## 8. Edition note
249
+
250
+ Because this is a built + deployed container (Next.js + Mongo + AI Gateway), it
251
+ requires the **local edition** (Claude Desktop / Claude Code) or the CLI. The
252
+ hosted edition (Claude Web / hosted MCP) is inline-only and can only publish
253
+ static pages — offer a static explainer page there, but the real knowledge base
254
+ must be built and plugged from the local edition.
@@ -0,0 +1,28 @@
1
+ # ai-knowledge-base template — RAG "ask my docs" blueprint
2
+
3
+ A blueprint for a retrieval-augmented knowledge-base chatbot on CloudGrid: a
4
+ persistent Next.js + Mongo app that ingests documents, chunks and embeds them,
5
+ and answers questions grounded in the retrieved chunks (with citations) — the
6
+ `app-with-data` runtime shape with a RAG loop layered on. Embeddings and answers
7
+ run through CloudGrid's AI Gateway (`@cloudgrid-io/ai`, injected via
8
+ `needs: { ai: true }` — works today); the ideal vector store `needs: vector`
9
+ (pgvector) is **PENDING platform issue #1545**, so embeddings live in Mongo and
10
+ similarity is computed in-app until it ships. Because RAG involves choices
11
+ (chunking, embedding model, retrieval), this template ships the **structure and
12
+ `cloudgrid.yaml`, not finished app code** — adapt it and build.
13
+
14
+ > **This is a blueprint: structure + cloudgrid.yaml, adapt and build.** Read
15
+ > `AGENTS.md` for the file tree, Mongo collections, CloudGrid injection table
16
+ > (needs + AI Gateway + the pgvector #1545 note), the RAG loop, optional
17
+ > auth/payments wiring, and the deploy flow — then generate the app under
18
+ > `services/web/` and `grid plug` it (runtime, local edition, async — poll to a
19
+ > live URL).
20
+
21
+ ## Files
22
+
23
+ - `cloudgrid.yaml` — active fields: `name`, `services.web` (nextjs, `/`), and
24
+ `needs: { ai: true, database: true }`. `vector: pgvector` is present but
25
+ commented (PENDING #1545); the optional `vault:` block (auth/payments) is
26
+ commented too.
27
+ - `AGENTS.md` — the structure guide (read this first).
28
+ - `index.md` — the fetch-bundle summary + cloudgrid.yaml.