@cloudgrid-io/mcp 0.12.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 (390) hide show
  1. package/package.json +1 -1
  2. package/src/corpus/capability-map.md +82 -2
  3. package/src/corpus/examples/crm/index.md +273 -0
  4. package/src/corpus/examples/kanban/index.md +256 -0
  5. package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
  6. package/src/corpus/templates/admin-dashboard/README.md +75 -0
  7. package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +233 -0
  8. package/src/corpus/templates/admin-dashboard/index.md +81 -0
  9. package/src/corpus/templates/admin-dashboard/services/web/app/api/orders/route.js +64 -0
  10. package/src/corpus/templates/admin-dashboard/services/web/app/api/users/route.js +63 -0
  11. package/src/corpus/templates/admin-dashboard/services/web/app/layout.js +39 -0
  12. package/src/corpus/templates/admin-dashboard/services/web/app/page.js +73 -0
  13. package/src/corpus/templates/admin-dashboard/services/web/app/resource-table.js +94 -0
  14. package/src/corpus/templates/admin-dashboard/services/web/lib/db.js +32 -0
  15. package/src/corpus/templates/admin-dashboard/services/web/package.json +16 -0
  16. package/src/corpus/templates/ai-app/cloudgrid.yaml +225 -11
  17. package/src/corpus/templates/ai-app/index.md +3 -11
  18. package/src/corpus/templates/ai-knowledge-base/AGENTS.md +254 -0
  19. package/src/corpus/templates/ai-knowledge-base/README.md +28 -0
  20. package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +238 -0
  21. package/src/corpus/templates/ai-knowledge-base/index.md +81 -0
  22. package/src/corpus/templates/analytics-dashboard/README.md +85 -0
  23. package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +232 -0
  24. package/src/corpus/templates/analytics-dashboard/index.md +316 -0
  25. package/src/corpus/templates/analytics-dashboard/services/web/app/api/events/route.js +60 -0
  26. package/src/corpus/templates/analytics-dashboard/services/web/app/event-form.js +100 -0
  27. package/src/corpus/templates/analytics-dashboard/services/web/app/layout.js +41 -0
  28. package/src/corpus/templates/analytics-dashboard/services/web/app/page.js +54 -0
  29. package/src/corpus/templates/analytics-dashboard/services/web/lib/db.js +32 -0
  30. package/src/corpus/templates/analytics-dashboard/services/web/package.json +16 -0
  31. package/src/corpus/templates/api-dashboard/README.md +84 -0
  32. package/src/corpus/templates/api-dashboard/cloudgrid.yaml +233 -0
  33. package/src/corpus/templates/api-dashboard/index.md +310 -0
  34. package/src/corpus/templates/api-dashboard/services/web/app/api/requests/route.js +62 -0
  35. package/src/corpus/templates/api-dashboard/services/web/app/dashboard.js +156 -0
  36. package/src/corpus/templates/api-dashboard/services/web/app/layout.js +42 -0
  37. package/src/corpus/templates/api-dashboard/services/web/app/page.js +39 -0
  38. package/src/corpus/templates/api-dashboard/services/web/lib/db.js +32 -0
  39. package/src/corpus/templates/api-dashboard/services/web/package.json +16 -0
  40. package/src/corpus/templates/api-docs/README.md +28 -0
  41. package/src/corpus/templates/api-docs/cloudgrid.yaml +228 -0
  42. package/src/corpus/templates/api-docs/index.html +136 -0
  43. package/src/corpus/templates/api-docs/index.md +28 -0
  44. package/src/corpus/templates/api-service/cloudgrid.yaml +224 -9
  45. package/src/corpus/templates/api-service/index.md +3 -11
  46. package/src/corpus/templates/app-with-data/cloudgrid.yaml +226 -8
  47. package/src/corpus/templates/app-with-data/index.md +3 -8
  48. package/src/corpus/templates/appointment-booking/AGENTS.md +223 -0
  49. package/src/corpus/templates/appointment-booking/README.md +16 -0
  50. package/src/corpus/templates/appointment-booking/cloudgrid.yaml +250 -0
  51. package/src/corpus/templates/appointment-booking/index.md +72 -0
  52. package/src/corpus/templates/approval-workflow/AGENTS.md +170 -0
  53. package/src/corpus/templates/approval-workflow/README.md +12 -0
  54. package/src/corpus/templates/approval-workflow/cloudgrid.yaml +237 -0
  55. package/src/corpus/templates/approval-workflow/index.md +58 -0
  56. package/src/corpus/templates/billing-dashboard/AGENTS.md +199 -0
  57. package/src/corpus/templates/billing-dashboard/README.md +18 -0
  58. package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +235 -0
  59. package/src/corpus/templates/billing-dashboard/index.md +87 -0
  60. package/src/corpus/templates/blog-cms/README.md +94 -0
  61. package/src/corpus/templates/blog-cms/cloudgrid.yaml +233 -0
  62. package/src/corpus/templates/blog-cms/index.md +358 -0
  63. package/src/corpus/templates/blog-cms/services/web/app/admin/admin-editor.js +133 -0
  64. package/src/corpus/templates/blog-cms/services/web/app/admin/page.js +33 -0
  65. package/src/corpus/templates/blog-cms/services/web/app/api/posts/route.js +84 -0
  66. package/src/corpus/templates/blog-cms/services/web/app/layout.js +47 -0
  67. package/src/corpus/templates/blog-cms/services/web/app/page.js +56 -0
  68. package/src/corpus/templates/blog-cms/services/web/app/posts/[slug]/page.js +45 -0
  69. package/src/corpus/templates/blog-cms/services/web/lib/db.js +32 -0
  70. package/src/corpus/templates/blog-cms/services/web/package.json +16 -0
  71. package/src/corpus/templates/booking-system/AGENTS.md +189 -0
  72. package/src/corpus/templates/booking-system/README.md +17 -0
  73. package/src/corpus/templates/booking-system/cloudgrid.yaml +248 -0
  74. package/src/corpus/templates/booking-system/index.md +86 -0
  75. package/src/corpus/templates/calendar-scheduler/AGENTS.md +226 -0
  76. package/src/corpus/templates/calendar-scheduler/README.md +25 -0
  77. package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +259 -0
  78. package/src/corpus/templates/calendar-scheduler/index.md +85 -0
  79. package/src/corpus/templates/changelog/README.md +27 -0
  80. package/src/corpus/templates/changelog/cloudgrid.yaml +228 -0
  81. package/src/corpus/templates/changelog/index.html +80 -0
  82. package/src/corpus/templates/changelog/index.md +28 -0
  83. package/src/corpus/templates/company-website/README.md +54 -0
  84. package/src/corpus/templates/company-website/cloudgrid.yaml +233 -0
  85. package/src/corpus/templates/company-website/index.html +309 -0
  86. package/src/corpus/templates/company-website/index.md +29 -0
  87. package/src/corpus/templates/course-platform/AGENTS.md +161 -0
  88. package/src/corpus/templates/course-platform/README.md +26 -0
  89. package/src/corpus/templates/course-platform/cloudgrid.yaml +237 -0
  90. package/src/corpus/templates/course-platform/index.md +70 -0
  91. package/src/corpus/templates/crm/README.md +72 -0
  92. package/src/corpus/templates/crm/cloudgrid.yaml +233 -0
  93. package/src/corpus/templates/crm/index.md +71 -0
  94. package/src/corpus/templates/crm/services/web/app/api/contacts/route.js +80 -0
  95. package/src/corpus/templates/crm/services/web/app/contact-manager.js +102 -0
  96. package/src/corpus/templates/crm/services/web/app/layout.js +35 -0
  97. package/src/corpus/templates/crm/services/web/app/page.js +34 -0
  98. package/src/corpus/templates/crm/services/web/lib/db.js +32 -0
  99. package/src/corpus/templates/crm/services/web/package.json +16 -0
  100. package/src/corpus/templates/dashboard/cloudgrid.yaml +228 -4
  101. package/src/corpus/templates/dashboard/index.md +3 -5
  102. package/src/corpus/templates/deck/cloudgrid.yaml +228 -4
  103. package/src/corpus/templates/deck/index.md +3 -5
  104. package/src/corpus/templates/directory/README.md +75 -0
  105. package/src/corpus/templates/directory/cloudgrid.yaml +233 -0
  106. package/src/corpus/templates/directory/index.md +334 -0
  107. package/src/corpus/templates/directory/services/web/app/api/entries/route.js +63 -0
  108. package/src/corpus/templates/directory/services/web/app/directory-list.js +146 -0
  109. package/src/corpus/templates/directory/services/web/app/layout.js +44 -0
  110. package/src/corpus/templates/directory/services/web/app/page.js +38 -0
  111. package/src/corpus/templates/directory/services/web/lib/db.js +32 -0
  112. package/src/corpus/templates/directory/services/web/package.json +16 -0
  113. package/src/corpus/templates/docs-site/README.md +28 -0
  114. package/src/corpus/templates/docs-site/cloudgrid.yaml +228 -0
  115. package/src/corpus/templates/docs-site/index.html +122 -0
  116. package/src/corpus/templates/docs-site/index.md +28 -0
  117. package/src/corpus/templates/erp/AGENTS.md +116 -0
  118. package/src/corpus/templates/erp/README.md +17 -0
  119. package/src/corpus/templates/erp/cloudgrid.yaml +235 -0
  120. package/src/corpus/templates/erp/index.md +81 -0
  121. package/src/corpus/templates/event-board/README.md +74 -0
  122. package/src/corpus/templates/event-board/cloudgrid.yaml +233 -0
  123. package/src/corpus/templates/event-board/index.md +299 -0
  124. package/src/corpus/templates/event-board/services/web/app/api/events/route.js +61 -0
  125. package/src/corpus/templates/event-board/services/web/app/event-form.js +118 -0
  126. package/src/corpus/templates/event-board/services/web/app/layout.js +39 -0
  127. package/src/corpus/templates/event-board/services/web/app/page.js +34 -0
  128. package/src/corpus/templates/event-board/services/web/lib/db.js +32 -0
  129. package/src/corpus/templates/event-board/services/web/package.json +16 -0
  130. package/src/corpus/templates/expense-tracker/README.md +76 -0
  131. package/src/corpus/templates/expense-tracker/cloudgrid.yaml +233 -0
  132. package/src/corpus/templates/expense-tracker/index.md +305 -0
  133. package/src/corpus/templates/expense-tracker/services/web/app/api/expenses/route.js +61 -0
  134. package/src/corpus/templates/expense-tracker/services/web/app/expense-form.js +145 -0
  135. package/src/corpus/templates/expense-tracker/services/web/app/layout.js +42 -0
  136. package/src/corpus/templates/expense-tracker/services/web/app/page.js +34 -0
  137. package/src/corpus/templates/expense-tracker/services/web/lib/db.js +32 -0
  138. package/src/corpus/templates/expense-tracker/services/web/package.json +16 -0
  139. package/src/corpus/templates/feature-request-board/README.md +87 -0
  140. package/src/corpus/templates/feature-request-board/cloudgrid.yaml +233 -0
  141. package/src/corpus/templates/feature-request-board/index.md +317 -0
  142. package/src/corpus/templates/feature-request-board/services/web/app/api/requests/route.js +92 -0
  143. package/src/corpus/templates/feature-request-board/services/web/app/board.js +91 -0
  144. package/src/corpus/templates/feature-request-board/services/web/app/layout.js +43 -0
  145. package/src/corpus/templates/feature-request-board/services/web/app/page.js +35 -0
  146. package/src/corpus/templates/feature-request-board/services/web/lib/db.js +32 -0
  147. package/src/corpus/templates/feature-request-board/services/web/package.json +16 -0
  148. package/src/corpus/templates/financial-dashboard/README.md +80 -0
  149. package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +233 -0
  150. package/src/corpus/templates/financial-dashboard/index.md +326 -0
  151. package/src/corpus/templates/financial-dashboard/services/web/app/api/entries/route.js +63 -0
  152. package/src/corpus/templates/financial-dashboard/services/web/app/entry-board.js +130 -0
  153. package/src/corpus/templates/financial-dashboard/services/web/app/layout.js +46 -0
  154. package/src/corpus/templates/financial-dashboard/services/web/app/page.js +31 -0
  155. package/src/corpus/templates/financial-dashboard/services/web/lib/db.js +32 -0
  156. package/src/corpus/templates/financial-dashboard/services/web/package.json +16 -0
  157. package/src/corpus/templates/forum/AGENTS.md +196 -0
  158. package/src/corpus/templates/forum/README.md +12 -0
  159. package/src/corpus/templates/forum/cloudgrid.yaml +237 -0
  160. package/src/corpus/templates/forum/index.md +66 -0
  161. package/src/corpus/templates/hr-portal/AGENTS.md +174 -0
  162. package/src/corpus/templates/hr-portal/README.md +14 -0
  163. package/src/corpus/templates/hr-portal/cloudgrid.yaml +237 -0
  164. package/src/corpus/templates/hr-portal/index.md +56 -0
  165. package/src/corpus/templates/internal-tools-portal/AGENTS.md +201 -0
  166. package/src/corpus/templates/internal-tools-portal/README.md +17 -0
  167. package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +237 -0
  168. package/src/corpus/templates/internal-tools-portal/index.md +62 -0
  169. package/src/corpus/templates/inventory/README.md +71 -0
  170. package/src/corpus/templates/inventory/cloudgrid.yaml +233 -0
  171. package/src/corpus/templates/inventory/index.md +68 -0
  172. package/src/corpus/templates/inventory/services/web/app/api/items/route.js +88 -0
  173. package/src/corpus/templates/inventory/services/web/app/inventory-manager.js +101 -0
  174. package/src/corpus/templates/inventory/services/web/app/layout.js +36 -0
  175. package/src/corpus/templates/inventory/services/web/app/page.js +37 -0
  176. package/src/corpus/templates/inventory/services/web/lib/db.js +32 -0
  177. package/src/corpus/templates/inventory/services/web/package.json +16 -0
  178. package/src/corpus/templates/invoice/README.md +71 -0
  179. package/src/corpus/templates/invoice/cloudgrid.yaml +233 -0
  180. package/src/corpus/templates/invoice/index.md +68 -0
  181. package/src/corpus/templates/invoice/services/web/app/api/invoices/route.js +82 -0
  182. package/src/corpus/templates/invoice/services/web/app/invoice-manager.js +101 -0
  183. package/src/corpus/templates/invoice/services/web/app/layout.js +35 -0
  184. package/src/corpus/templates/invoice/services/web/app/page.js +34 -0
  185. package/src/corpus/templates/invoice/services/web/lib/db.js +32 -0
  186. package/src/corpus/templates/invoice/services/web/package.json +16 -0
  187. package/src/corpus/templates/job-board/README.md +71 -0
  188. package/src/corpus/templates/job-board/cloudgrid.yaml +233 -0
  189. package/src/corpus/templates/job-board/index.md +68 -0
  190. package/src/corpus/templates/job-board/services/web/app/api/jobs/route.js +66 -0
  191. package/src/corpus/templates/job-board/services/web/app/job-board.js +73 -0
  192. package/src/corpus/templates/job-board/services/web/app/layout.js +35 -0
  193. package/src/corpus/templates/job-board/services/web/app/page.js +32 -0
  194. package/src/corpus/templates/job-board/services/web/lib/db.js +32 -0
  195. package/src/corpus/templates/job-board/services/web/package.json +16 -0
  196. package/src/corpus/templates/kanban/README.md +72 -0
  197. package/src/corpus/templates/kanban/cloudgrid.yaml +233 -0
  198. package/src/corpus/templates/kanban/index.md +71 -0
  199. package/src/corpus/templates/kanban/services/web/app/api/cards/route.js +70 -0
  200. package/src/corpus/templates/kanban/services/web/app/board.js +93 -0
  201. package/src/corpus/templates/kanban/services/web/app/layout.js +37 -0
  202. package/src/corpus/templates/kanban/services/web/app/page.js +32 -0
  203. package/src/corpus/templates/kanban/services/web/lib/db.js +32 -0
  204. package/src/corpus/templates/kanban/services/web/package.json +16 -0
  205. package/src/corpus/templates/landing-page/cloudgrid.yaml +228 -4
  206. package/src/corpus/templates/landing-page/index.md +3 -5
  207. package/src/corpus/templates/lms/AGENTS.md +193 -0
  208. package/src/corpus/templates/lms/README.md +27 -0
  209. package/src/corpus/templates/lms/cloudgrid.yaml +237 -0
  210. package/src/corpus/templates/lms/index.md +79 -0
  211. package/src/corpus/templates/marketplace/AGENTS.md +208 -0
  212. package/src/corpus/templates/marketplace/README.md +22 -0
  213. package/src/corpus/templates/marketplace/cloudgrid.yaml +233 -0
  214. package/src/corpus/templates/marketplace/index.md +76 -0
  215. package/src/corpus/templates/membership-site/AGENTS.md +160 -0
  216. package/src/corpus/templates/membership-site/README.md +18 -0
  217. package/src/corpus/templates/membership-site/cloudgrid.yaml +236 -0
  218. package/src/corpus/templates/membership-site/index.md +66 -0
  219. package/src/corpus/templates/monitoring-dashboard/README.md +84 -0
  220. package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +233 -0
  221. package/src/corpus/templates/monitoring-dashboard/index.md +328 -0
  222. package/src/corpus/templates/monitoring-dashboard/services/web/app/api/checks/route.js +76 -0
  223. package/src/corpus/templates/monitoring-dashboard/services/web/app/check-form.js +124 -0
  224. package/src/corpus/templates/monitoring-dashboard/services/web/app/layout.js +44 -0
  225. package/src/corpus/templates/monitoring-dashboard/services/web/app/page.js +49 -0
  226. package/src/corpus/templates/monitoring-dashboard/services/web/lib/db.js +32 -0
  227. package/src/corpus/templates/monitoring-dashboard/services/web/package.json +16 -0
  228. package/src/corpus/templates/online-store/AGENTS.md +153 -0
  229. package/src/corpus/templates/online-store/README.md +16 -0
  230. package/src/corpus/templates/online-store/cloudgrid.yaml +234 -0
  231. package/src/corpus/templates/online-store/index.md +81 -0
  232. package/src/corpus/templates/portfolio/README.md +29 -0
  233. package/src/corpus/templates/portfolio/cloudgrid.yaml +228 -0
  234. package/src/corpus/templates/portfolio/index.html +126 -0
  235. package/src/corpus/templates/portfolio/index.md +28 -0
  236. package/src/corpus/templates/product-catalog/README.md +74 -0
  237. package/src/corpus/templates/product-catalog/cloudgrid.yaml +232 -0
  238. package/src/corpus/templates/product-catalog/index.md +330 -0
  239. package/src/corpus/templates/product-catalog/services/web/app/api/products/route.js +69 -0
  240. package/src/corpus/templates/product-catalog/services/web/app/catalog.js +153 -0
  241. package/src/corpus/templates/product-catalog/services/web/app/layout.js +49 -0
  242. package/src/corpus/templates/product-catalog/services/web/app/page.js +36 -0
  243. package/src/corpus/templates/product-catalog/services/web/lib/db.js +32 -0
  244. package/src/corpus/templates/product-catalog/services/web/package.json +16 -0
  245. package/src/corpus/templates/product-launch/README.md +46 -0
  246. package/src/corpus/templates/product-launch/cloudgrid.yaml +234 -0
  247. package/src/corpus/templates/product-launch/index.html +320 -0
  248. package/src/corpus/templates/product-launch/index.md +34 -0
  249. package/src/corpus/templates/project-management/README.md +83 -0
  250. package/src/corpus/templates/project-management/cloudgrid.yaml +233 -0
  251. package/src/corpus/templates/project-management/index.md +346 -0
  252. package/src/corpus/templates/project-management/services/web/app/api/projects/route.js +48 -0
  253. package/src/corpus/templates/project-management/services/web/app/api/tasks/route.js +85 -0
  254. package/src/corpus/templates/project-management/services/web/app/board.js +182 -0
  255. package/src/corpus/templates/project-management/services/web/app/layout.js +45 -0
  256. package/src/corpus/templates/project-management/services/web/app/page.js +49 -0
  257. package/src/corpus/templates/project-management/services/web/lib/db.js +32 -0
  258. package/src/corpus/templates/project-management/services/web/package.json +16 -0
  259. package/src/corpus/templates/property-listings/README.md +76 -0
  260. package/src/corpus/templates/property-listings/cloudgrid.yaml +233 -0
  261. package/src/corpus/templates/property-listings/index.md +335 -0
  262. package/src/corpus/templates/property-listings/services/web/app/api/properties/route.js +73 -0
  263. package/src/corpus/templates/property-listings/services/web/app/layout.js +45 -0
  264. package/src/corpus/templates/property-listings/services/web/app/listings.js +152 -0
  265. package/src/corpus/templates/property-listings/services/web/app/page.js +53 -0
  266. package/src/corpus/templates/property-listings/services/web/lib/db.js +32 -0
  267. package/src/corpus/templates/property-listings/services/web/package.json +16 -0
  268. package/src/corpus/templates/quiz-platform/README.md +84 -0
  269. package/src/corpus/templates/quiz-platform/cloudgrid.yaml +233 -0
  270. package/src/corpus/templates/quiz-platform/index.md +313 -0
  271. package/src/corpus/templates/quiz-platform/services/web/app/api/questions/route.js +69 -0
  272. package/src/corpus/templates/quiz-platform/services/web/app/layout.js +47 -0
  273. package/src/corpus/templates/quiz-platform/services/web/app/page.js +37 -0
  274. package/src/corpus/templates/quiz-platform/services/web/app/quiz.js +188 -0
  275. package/src/corpus/templates/quiz-platform/services/web/lib/db.js +32 -0
  276. package/src/corpus/templates/quiz-platform/services/web/package.json +16 -0
  277. package/src/corpus/templates/report/cloudgrid.yaml +228 -4
  278. package/src/corpus/templates/report/index.md +3 -5
  279. package/src/corpus/templates/restaurant-reservations/AGENTS.md +258 -0
  280. package/src/corpus/templates/restaurant-reservations/README.md +17 -0
  281. package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +258 -0
  282. package/src/corpus/templates/restaurant-reservations/index.md +62 -0
  283. package/src/corpus/templates/revenue-dashboard/README.md +75 -0
  284. package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +233 -0
  285. package/src/corpus/templates/revenue-dashboard/index.md +307 -0
  286. package/src/corpus/templates/revenue-dashboard/services/web/app/api/sales/route.js +60 -0
  287. package/src/corpus/templates/revenue-dashboard/services/web/app/layout.js +40 -0
  288. package/src/corpus/templates/revenue-dashboard/services/web/app/page.js +87 -0
  289. package/src/corpus/templates/revenue-dashboard/services/web/app/sale-form.js +63 -0
  290. package/src/corpus/templates/revenue-dashboard/services/web/lib/db.js +32 -0
  291. package/src/corpus/templates/revenue-dashboard/services/web/package.json +16 -0
  292. package/src/corpus/templates/saas-marketing/README.md +30 -0
  293. package/src/corpus/templates/saas-marketing/cloudgrid.yaml +228 -0
  294. package/src/corpus/templates/saas-marketing/index.html +212 -0
  295. package/src/corpus/templates/saas-marketing/index.md +28 -0
  296. package/src/corpus/templates/status-page/README.md +28 -0
  297. package/src/corpus/templates/status-page/cloudgrid.yaml +228 -0
  298. package/src/corpus/templates/status-page/index.html +117 -0
  299. package/src/corpus/templates/status-page/index.md +28 -0
  300. package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
  301. package/src/corpus/templates/subscription-management/README.md +21 -0
  302. package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
  303. package/src/corpus/templates/subscription-management/index.md +73 -0
  304. package/src/corpus/templates/task-manager/README.md +72 -0
  305. package/src/corpus/templates/task-manager/cloudgrid.yaml +233 -0
  306. package/src/corpus/templates/task-manager/index.md +71 -0
  307. package/src/corpus/templates/task-manager/services/web/app/api/tasks/route.js +77 -0
  308. package/src/corpus/templates/task-manager/services/web/app/layout.js +39 -0
  309. package/src/corpus/templates/task-manager/services/web/app/page.js +33 -0
  310. package/src/corpus/templates/task-manager/services/web/app/task-list.js +110 -0
  311. package/src/corpus/templates/task-manager/services/web/lib/db.js +32 -0
  312. package/src/corpus/templates/task-manager/services/web/package.json +16 -0
  313. package/src/corpus/templates/ticket-system/README.md +71 -0
  314. package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
  315. package/src/corpus/templates/ticket-system/index.md +68 -0
  316. package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
  317. package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
  318. package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
  319. package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
  320. package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
  321. package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
  322. package/src/corpus/templates/time-tracking/README.md +81 -0
  323. package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
  324. package/src/corpus/templates/time-tracking/index.md +298 -0
  325. package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
  326. package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
  327. package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
  328. package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
  329. package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
  330. package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
  331. package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
  332. package/src/corpus/templates/travel-booking/README.md +17 -0
  333. package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
  334. package/src/corpus/templates/travel-booking/index.md +88 -0
  335. package/src/corpus/templates/waitlist/README.md +38 -0
  336. package/src/corpus/templates/waitlist/cloudgrid.yaml +228 -0
  337. package/src/corpus/templates/waitlist/index.html +69 -0
  338. package/src/corpus/templates/waitlist/index.md +39 -0
  339. package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
  340. package/src/corpus/templates/web-app/index.md +3 -5
  341. package/src/corpus/workflows/admin-dashboard.md +102 -0
  342. package/src/corpus/workflows/ai-knowledge-base.md +137 -0
  343. package/src/corpus/workflows/analytics-dashboard.md +104 -0
  344. package/src/corpus/workflows/api-dashboard.md +102 -0
  345. package/src/corpus/workflows/api-docs.md +36 -0
  346. package/src/corpus/workflows/appointment-booking.md +143 -0
  347. package/src/corpus/workflows/approval-workflow.md +124 -0
  348. package/src/corpus/workflows/billing-dashboard.md +120 -0
  349. package/src/corpus/workflows/blog-cms.md +104 -0
  350. package/src/corpus/workflows/booking-system.md +116 -0
  351. package/src/corpus/workflows/calendar-scheduler.md +134 -0
  352. package/src/corpus/workflows/changelog.md +33 -0
  353. package/src/corpus/workflows/company-website.md +46 -0
  354. package/src/corpus/workflows/course-platform.md +126 -0
  355. package/src/corpus/workflows/crm.md +101 -0
  356. package/src/corpus/workflows/directory.md +101 -0
  357. package/src/corpus/workflows/docs-site.md +35 -0
  358. package/src/corpus/workflows/erp.md +125 -0
  359. package/src/corpus/workflows/event-board.md +102 -0
  360. package/src/corpus/workflows/expense-tracker.md +102 -0
  361. package/src/corpus/workflows/feature-request-board.md +105 -0
  362. package/src/corpus/workflows/financial-dashboard.md +103 -0
  363. package/src/corpus/workflows/forum.md +128 -0
  364. package/src/corpus/workflows/hr-portal.md +115 -0
  365. package/src/corpus/workflows/internal-tools-portal.md +125 -0
  366. package/src/corpus/workflows/inventory.md +101 -0
  367. package/src/corpus/workflows/invoice.md +101 -0
  368. package/src/corpus/workflows/job-board.md +101 -0
  369. package/src/corpus/workflows/kanban.md +102 -0
  370. package/src/corpus/workflows/lms.md +113 -0
  371. package/src/corpus/workflows/marketplace.md +123 -0
  372. package/src/corpus/workflows/membership-site.md +128 -0
  373. package/src/corpus/workflows/monitoring-dashboard.md +104 -0
  374. package/src/corpus/workflows/online-store.md +114 -0
  375. package/src/corpus/workflows/portfolio.md +35 -0
  376. package/src/corpus/workflows/product-catalog.md +105 -0
  377. package/src/corpus/workflows/product-launch.md +43 -0
  378. package/src/corpus/workflows/project-management.md +106 -0
  379. package/src/corpus/workflows/property-listings.md +101 -0
  380. package/src/corpus/workflows/quiz-platform.md +105 -0
  381. package/src/corpus/workflows/restaurant-reservations.md +123 -0
  382. package/src/corpus/workflows/revenue-dashboard.md +102 -0
  383. package/src/corpus/workflows/saas-marketing.md +37 -0
  384. package/src/corpus/workflows/status-page.md +35 -0
  385. package/src/corpus/workflows/subscription-management.md +141 -0
  386. package/src/corpus/workflows/task-manager.md +101 -0
  387. package/src/corpus/workflows/ticket-system.md +101 -0
  388. package/src/corpus/workflows/time-tracking.md +104 -0
  389. package/src/corpus/workflows/travel-booking.md +115 -0
  390. package/src/corpus/workflows/waitlist.md +42 -0
@@ -0,0 +1,201 @@
1
+ # AGENTS.md — internal-tools-portal (blueprint / structure guide)
2
+
3
+ This is a **blueprint**, not filled app code. It tells you how to build a
4
+ persistent internal tools portal / admin tools hub / back-office portal correctly
5
+ **on CloudGrid**: a Next.js app under `services/web/`, backed by the grid-shared
6
+ MongoDB, gated by staff-only auth via a provider SDK (Clerk or Auth0) whose keys
7
+ come from the org **vault**, with role-based access control (RBAC) where **each
8
+ internal tool is its own route** under a shared authenticated shell.
9
+
10
+ Read this whole file, then build the app following it. Do not invent a different
11
+ service layout — the CLI looks for code under `services/web/`.
12
+
13
+ ---
14
+
15
+ ## 1. File tree
16
+
17
+ App code MUST live under `services/web/` — `path:` in `cloudgrid.yaml` is the URL
18
+ mount, NOT the filesystem path. The service named `web` → the CLI looks for
19
+ `services/web/`. Files at the repo root fail with
20
+ `Error: Service directory not found: …/services/web`.
21
+
22
+ ```
23
+ cloudgrid.yaml # name + services.web (nextjs) + needs:{database:true} + vault: auth keys
24
+ services/web/package.json # next, react, react-dom, mongodb + auth SDK (@clerk/nextjs or @auth0/nextjs-auth0)
25
+ services/web/middleware.js # auth middleware — protect ALL routes except /sign-in, /sign-up, public assets
26
+ services/web/lib/db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
27
+ services/web/lib/auth.js # current-user helper: resolve session → { userId, email, roles[] }; requireRole(role)
28
+ services/web/lib/tools.js # the tool registry: id, label, path, requiredRole — drives the hub grid + gating
29
+ services/web/app/layout.js # root layout, wraps children in the auth provider (<ClerkProvider> / Auth0 provider)
30
+ services/web/app/page.js # server component: the hub — cards for each tool the signed-in staffer may open
31
+ services/web/app/tools/[tool]/page.js # server component: a single tool surface, role-gated by lib/tools.js + requireRole
32
+ services/web/app/admin/users/page.js # server component: admin-only — manage staff + role assignments
33
+ services/web/app/api/me/route.js # GET current staff profile { email, roles } for the client shell
34
+ services/web/app/api/tools/[tool]/route.js # per-tool data API: GET/POST/etc., re-checks the tool's requiredRole server-side
35
+ services/web/app/api/staff/route.js # GET list / POST invite (admin); assign roles
36
+ services/web/app/api/staff/[id]/route.js # PATCH roles / deactivate (admin only)
37
+ services/web/app/api/audit/route.js # GET audit log (admin); every tool mutation appends an entry
38
+ ```
39
+
40
+ Sign-in / sign-up pages depend on the provider: Clerk gives you catch-all routes
41
+ (`app/sign-in/[[...sign-in]]/page.js`), Auth0 uses its hosted login + a
42
+ `app/api/auth/[auth0]/route.js` handler. Follow the chosen provider's Next.js
43
+ App-Router quickstart for those exact files.
44
+
45
+ **Each tool is a route.** Add a new internal tool by (a) adding an entry to
46
+ `lib/tools.js` with its `requiredRole`, and (b) creating its page under
47
+ `app/tools/<id>/` (or a dedicated `app/<id>/` route) plus any data API under
48
+ `app/api/tools/<id>/`. The hub (`app/page.js`) renders only the tools the current
49
+ staffer's roles allow, and each tool + its API re-checks the role server-side.
50
+
51
+ ---
52
+
53
+ ## 2. Mongo collections + fields
54
+
55
+ Three collections in the grid-shared Mongo. Keyed to the auth provider's stable
56
+ user id so the identity and the staff record line up.
57
+
58
+ **`staff`** — one document per staff member (the RBAC source of truth).
59
+ | field | type | notes |
60
+ |---------------|----------|-------------------------------------------------------------|
61
+ | `_id` | ObjectId | Mongo id |
62
+ | `authUserId` | string | provider user id (Clerk `userId` / Auth0 `sub`) — unique |
63
+ | `email` | string | from the auth session |
64
+ | `name` | string | display name |
65
+ | `roles` | string[] | e.g. `["support"]`, `["ops","admin"]` — drives tool access |
66
+ | `active` | boolean | deactivated staff keep no access even if the SSO account lives |
67
+ | `createdAt` | Date | |
68
+ | `lastSeenAt` | Date | |
69
+
70
+ **`toolData`** — generic per-tool records (adapt/split per real tool; one
71
+ collection with a `tool` discriminator keeps the blueprint compact).
72
+ | field | type | notes |
73
+ |-------------|----------|--------------------------------------------------------------|
74
+ | `_id` | ObjectId | Mongo id |
75
+ | `tool` | string | tool id from `lib/tools.js` (e.g. `"feature-flags"`) |
76
+ | `key` | string | record key within the tool |
77
+ | `value` | mixed | the tool's payload |
78
+ | `updatedBy` | string | `authUserId` of the last editor |
79
+ | `updatedAt` | Date | |
80
+
81
+ **`auditLog`** — append-only record of who did what (internal tools need a trail).
82
+ | field | type | notes |
83
+ |--------------|----------|---------------------------------------------------------|
84
+ | `_id` | ObjectId | Mongo id |
85
+ | `actor` | string | `authUserId` |
86
+ | `actorEmail` | string | denormalized for readable logs |
87
+ | `tool` | string | tool id |
88
+ | `action` | string | e.g. `"update"`, `"delete"`, `"role.grant"` |
89
+ | `target` | string | record key / affected staff id |
90
+ | `at` | Date | |
91
+
92
+ RBAC flow: a staffer signs in via the provider → `middleware.js` blocks
93
+ unauthenticated requests → `lib/auth.js` looks up the `staff` doc by `authUserId`,
94
+ returns `{ userId, email, roles }` (and denies inactive staff). The hub shows only
95
+ tools whose `requiredRole` is in the staffer's `roles`; every tool page + API
96
+ re-checks `requireRole` server-side. Mutations append to `auditLog`. Seed the
97
+ first `admin` by inserting a `staff` doc with `roles: ["admin"]`; admins manage
98
+ everyone else via `app/admin/users`.
99
+
100
+ ---
101
+
102
+ ## 3. How CloudGrid injects things
103
+
104
+ You do **not** provision infrastructure or set connection strings/secrets by
105
+ hand. Declare them in `cloudgrid.yaml`; the deployer injects env vars at
106
+ dev-time (`grid dev`) and runtime (after `grid plug`).
107
+
108
+ - **Database (Mongo):** `needs: { database: true }` → the grid injects
109
+ **`DATABASE_MONGODB_URL`** (plus the legacy **`MONGODB_URL`** alias). Read
110
+ `process.env.DATABASE_MONGODB_URL || process.env.MONGODB_URL` **lazily inside a
111
+ getter** in `services/web/lib/db.js` — never at module top level, or
112
+ `next build` fails (the module is imported for route analysis before the grid
113
+ injects the var). Never hardcode a connection string.
114
+ - **Auth secrets (vault):** the `vault:` block maps org vault items → env vars.
115
+ This blueprint maps:
116
+ ```yaml
117
+ vault:
118
+ AUTH_PROVIDER_SECRET_KEY: auth-provider-secret-key
119
+ AUTH_PROVIDER_PUBLISHABLE_KEY: auth-provider-publishable-key
120
+ ```
121
+ So `process.env.AUTH_PROVIDER_SECRET_KEY` /
122
+ `process.env.AUTH_PROVIDER_PUBLISHABLE_KEY` are available at build+runtime.
123
+ You must first create those items in the org vault (see step 5). Rename the
124
+ keys to the provider's expected names if you prefer to read the SDK's native
125
+ env vars directly (e.g. `CLERK_SECRET_KEY` /
126
+ `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY`, or `AUTH0_SECRET` / `AUTH0_CLIENT_ID` /
127
+ `AUTH0_CLIENT_SECRET`) — just keep the `vault:` map keys and the code in sync.
128
+ A tool that talks to a third-party API (Stripe, SendGrid, an internal service
129
+ token) adds one more `vault:` line per secret, e.g. `STRIPE_KEY: stripe-live-key`.
130
+ - **AI (optional):** if a tool needs an LLM (draft copy, summarize a record), add
131
+ `needs: { ai: true }` and the grid injects **`AI_GATEWAY_URL`** for use with
132
+ `@cloudgrid-io/ai`. Not required for the core portal.
133
+
134
+ Non-secret config (log level, feature toggles) → `services.web.env` in the yaml,
135
+ or `grid env`. Actual secrets → the vault (never `env:`, never committed).
136
+
137
+ ---
138
+
139
+ ## 4. Wiring staff-only auth + RBAC
140
+
141
+ Pick one provider and follow its Next.js App-Router quickstart. The CloudGrid
142
+ specifics:
143
+
144
+ 1. **Keys from the vault, not the SDK dashboard's `.env`.** Store the provider's
145
+ secret + publishable keys as org vault items; the `vault:` block injects them
146
+ as env vars. Do not commit local env files (`.env`).
147
+ 2. **Provider in the layout.** Wrap `app/layout.js` children in the provider
148
+ component (`<ClerkProvider>` or the Auth0 provider).
149
+ 3. **Middleware gate (staff-only).** `services/web/middleware.js` protects EVERY
150
+ route except the sign-in/sign-up pages and public assets. There is no public
151
+ surface — an internal portal is entirely behind auth. Unauthenticated requests
152
+ redirect to sign-in. (For extra lockdown, restrict sign-ups to your corporate
153
+ domain / an invite allowlist in the provider config.)
154
+ 4. **Roles live on the `staff` record, in Mongo — not on the client.** `lib/auth.js`
155
+ reads the session, looks up the `staff` doc by `authUserId`, and returns
156
+ `{ userId, email, roles }`, denying inactive staff. `lib/tools.js` maps each
157
+ tool id → its `requiredRole`.
158
+ 5. **Server-side role checks on every tool + mutation.** In `app/tools/[tool]/page.js`
159
+ and each `app/api/tools/[tool]/route.js`, re-resolve the staffer server-side
160
+ and `requireRole(tool.requiredRole)` before rendering data or performing the
161
+ action; reject with 403 otherwise. The hub hiding a card is UX only — never
162
+ the security boundary. Append every mutation to `auditLog`.
163
+
164
+ If a tool needs payments (e.g. an internal refund console), add Stripe the same
165
+ way: map `STRIPE_KEY: stripe-live-key` in `vault:`, add `app/api/checkout/route.js`
166
+ (or a refund route) and a `app/api/webhooks/stripe/route.js` webhook route reading
167
+ `process.env.STRIPE_KEY`. The webhook route must be excluded from the auth
168
+ middleware (Stripe calls it unauthenticated; verify the Stripe signature instead).
169
+
170
+ ---
171
+
172
+ ## 5. Deploy steps
173
+
174
+ A runtime deploy is **async** and needs the **local edition** (see below).
175
+
176
+ 1. **`grid init`** an app named `internal-tools-portal` — creates the entity +
177
+ `.cloudgrid/link.json` and a `cloudgrid.yaml` with an empty `services: {}`.
178
+ Run `init` FIRST (`plug` needs a linked directory).
179
+ 2. **Fill** the code under `services/web/` and set `cloudgrid.yaml` to the active
180
+ shape: `name` + `services.web { type: nextjs, path: / }` + `needs:
181
+ { database: true }` + the `vault:` auth-key map.
182
+ 3. **Create the vault items** the `vault:` block references (the auth provider's
183
+ secret + publishable keys, plus any per-tool API secrets). `grid secrets` /
184
+ vault UI — never commit them.
185
+ 4. **(Optional) `grid dev`** to run locally against the injected dev Mongo + the
186
+ injected vault env vars before deploying.
187
+ 5. **`grid plug`** to build + deploy the folder. The first response is
188
+ `status: building`, NOT a live URL — **poll `grid status`** (or the returned
189
+ poll URL) until the entity is live, surfacing a liveness signal while it
190
+ builds. Only then return the live app URL. Re-plug the SAME entity to update
191
+ the same URL.
192
+
193
+ ---
194
+
195
+ ## 6. Edition note
196
+
197
+ This is a persistent, built-and-deployed runtime app (Next.js container + Mongo +
198
+ auth). It requires the **local edition** (Claude Desktop / Claude Code) or the
199
+ CLI. The **hosted edition** (Claude Web / hosted MCP) is inline-only and can only
200
+ publish static pages — it cannot build this runtime app. On hosted, stop the
201
+ runtime path and offer a static mock instead.
@@ -0,0 +1,17 @@
1
+ # internal-tools-portal template — blueprint (structure + cloudgrid.yaml)
2
+
3
+ A persistent internal tools portal / admin tools hub / back-office portal: a
4
+ Next.js app on CloudGrid backed by the grid-shared MongoDB, with staff-only auth
5
+ via a provider SDK (Clerk or Auth0) whose keys come from the org vault, role-based
6
+ access control (RBAC), and **each internal tool as its own route** under a shared
7
+ authenticated shell (`staff` + `toolData` + `auditLog` collections). It is a
8
+ persistent runtime app because staff records, tool data, and the audit trail must
9
+ survive refresh and be shared across the team — not a static page.
10
+
11
+ **This is a blueprint: structure + cloudgrid.yaml, not filled app code.** Read
12
+ `AGENTS.md` for the full structure guide — the `services/web/` file tree, the
13
+ Mongo collections, how CloudGrid injects the DB (`DATABASE_MONGODB_URL`) and the
14
+ vault-backed auth keys, how to wire staff-only auth + RBAC (roles on the `staff`
15
+ record, server-side checks per tool, the tool registry in `lib/tools.js`), and the
16
+ `grid init → fill → grid plug → poll` deploy flow — then adapt it and build the app
17
+ 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: internal-tools-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 internal-tools portal gates every tool behind staff-only auth via a
122
+ # provider SDK (Clerk or Auth0). Store the provider's secret + publishable keys
123
+ # as org vault items and map them to env vars here — never hardcode them or
124
+ # commit them. The deployer 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,62 @@
1
+ # Template: internal-tools-portal (blueprint — persistent Next.js + Mongo + auth)
2
+
3
+ A **blueprint** for an internal tools portal / admin tools hub / back-office
4
+ portal: a persistent Next.js app on CloudGrid backed by the grid-shared MongoDB,
5
+ with staff-only auth via a provider SDK (Clerk or Auth0) whose keys come from the
6
+ org vault, role-based access control (RBAC), and **each internal tool as its own
7
+ route** under a shared authenticated shell. This ships the **structure +
8
+ cloudgrid.yaml**, NOT filled app code — read `AGENTS.md` and build the app
9
+ following it.
10
+
11
+ **Key rules:**
12
+
13
+ 1. **This is a blueprint.** Fetch it, read `AGENTS.md` (file tree, Mongo
14
+ collections, CloudGrid wiring, RBAC, deploy flow), then build the app under
15
+ `services/web/`. There is no ready-made app code to copy.
16
+ 2. **Service code MUST live under `services/<name>/`, not the repo root.**
17
+ `path:` in `cloudgrid.yaml` is the URL mount, NOT the filesystem path. The
18
+ service named `web` → the CLI looks for `services/web/`.
19
+ 3. **Declare the datastore with `needs: { database: true }`** — the deployer
20
+ provisions Mongo and injects `DATABASE_MONGODB_URL` (plus the legacy
21
+ `MONGODB_URL` alias). Read it lazily inside a getter, never at module top
22
+ level (a top-level read fails `next build`). `requires:` is the deprecated v1
23
+ alias; never set `needs:` and `requires:` together.
24
+ 4. **Auth secrets come from the `vault:` block, not committed env files.** The
25
+ yaml maps the provider's secret + publishable keys → env vars
26
+ (`AUTH_PROVIDER_SECRET_KEY`, `AUTH_PROVIDER_PUBLISHABLE_KEY`); the deployer
27
+ injects them at build + runtime. Create the vault items first.
28
+ 5. **Every tool is a route, gated server-side.** A tool registry (`lib/tools.js`)
29
+ maps tool id → `requiredRole`; roles live on the `staff` Mongo record. The hub
30
+ hides cards as UX, but each tool page + API re-checks the role server-side —
31
+ the hidden card is never the security boundary.
32
+
33
+ Runtime app → **local edition only**, async deploy (poll to a live URL).
34
+
35
+ ## Fetch bundle
36
+
37
+ Fetch this blueprint with `gridctl_fetch("template", "internal-tools-portal")`. It
38
+ returns `cloudgrid.yaml`, `AGENTS.md` (the structure guide), and this README — no
39
+ app code. Follow `AGENTS.md` to build, then `grid init → fill → grid plug → poll`.
40
+
41
+ ## cloudgrid.yaml
42
+
43
+ ```yaml
44
+ # On disk this file is the full-annotated reference (templates/_cloudgrid.yaml.reference) with EVERY
45
+ # field present as a comment; only the fields below are uncommented, so it
46
+ # deploys to exactly these active fields.
47
+ name: internal-tools-portal
48
+ services:
49
+ web:
50
+ type: nextjs
51
+ path: /
52
+ vault:
53
+ AUTH_PROVIDER_SECRET_KEY: auth-provider-secret-key
54
+ AUTH_PROVIDER_PUBLISHABLE_KEY: auth-provider-publishable-key
55
+ needs:
56
+ database: true
57
+ ```
58
+
59
+ > **Capability:** `needs: { database: true }` → the deployer provisions Mongo and
60
+ > injects `DATABASE_MONGODB_URL` (plus the legacy `MONGODB_URL` alias). The
61
+ > `vault:` block injects the auth provider's keys as env vars. `requires:` is the
62
+ > deprecated v1 alias — don't mix it with `needs:`.
@@ -0,0 +1,71 @@
1
+ # inventory template — persistent Next.js + Mongo inventory / stock tracker
2
+
3
+ A real, deployable inventory / stock tracker. Inventory live in the grid-shared MongoDB, so they
4
+ survive refresh and are shared across users/sessions. Same proven shape as
5
+ `app-with-data`, adapted to an `items` domain (sku, name, qty, location, reorder_at) with a table view, per-row quantity adjustments, and a low-stock flag.
6
+
7
+ ## How the grid gives you a database
8
+
9
+ You do **not** provision a database or set a connection string. In
10
+ `cloudgrid.yaml` you declare `needs: { database: true }`, and the grid:
11
+
12
+ - provisions shared Mongo for the app, and
13
+ - injects the connection string as the **`DATABASE_MONGODB_URL`** environment
14
+ variable (plus the legacy `MONGODB_URL` alias) — at dev-time (`grid dev`) and
15
+ at runtime (after `grid plug`).
16
+
17
+ The app reads it via `process.env.DATABASE_MONGODB_URL` (with a legacy
18
+ `process.env.MONGODB_URL` fallback) in `services/web/lib/db.js` — **lazily,
19
+ inside the `getDb` getter, never at module top level** (a top-level read fails
20
+ `next build`, which imports the module for route analysis before the grid injects
21
+ the var). Never hardcode a connection string; never commit a secret.
22
+
23
+ > **Declare `needs: { database: true }` (the canonical shape).** The deployer
24
+ > provisions Mongo and injects `DATABASE_MONGODB_URL` (plus the legacy
25
+ > `MONGODB_URL` alias). `requires:` is the deprecated v1 alias — don't author new
26
+ > yaml with it, and never set `needs:` and `requires:` together (the validator
27
+ > rejects the combination).
28
+
29
+ ## Service layout
30
+
31
+ App code lives under **`services/web/`**, not the template root. `path:` in
32
+ `cloudgrid.yaml` is the URL mount, not the filesystem path — the service named
33
+ `web` means the CLI looks for `services/web/`. Files at the root fail with
34
+ `Error: Service directory not found: …/services/web`.
35
+
36
+ ## Run locally
37
+
38
+ ```bash
39
+ npm install
40
+ grid dev # runs Next.js with DATABASE_MONGODB_URL injected against dev Mongo
41
+ ```
42
+
43
+ ## Deploy
44
+
45
+ ```bash
46
+ grid plug # builds + deploys the folder (async — poll status until live)
47
+ ```
48
+
49
+ A runtime deploy is asynchronous: `plug` returns `status: building`; poll status
50
+ until the app is live, then use the returned live URL. Re-plug the same entity
51
+ to update the same URL.
52
+
53
+ ## File tree
54
+
55
+ ```
56
+ cloudgrid.yaml # full-annotated reference; active: name + services.web (nextjs) + needs: { database: true }
57
+ services/web/package.json # next, react, react-dom, mongodb driver only
58
+ services/web/lib/db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
59
+ services/web/app/layout.js # root layout + inline CSS
60
+ services/web/app/page.js # server component: reads items from Mongo
61
+ services/web/app/inventory-manager.js # client table: POST / PATCH (adjust qty) / DELETE via the API
62
+ services/web/app/api/items/route.js # GET (list) / POST (add) / PATCH (adjust qty) / DELETE (remove)
63
+ ```
64
+
65
+ ## Adapt it
66
+
67
+ - Rename the `items` collection in `services/web/app/api/items/route.js`
68
+ and `services/web/app/page.js` (e.g. `parts`, `assets`).
69
+ - Change the document fields (units, suppliers, cost, reorder thresholds, timestamps).
70
+ - Add more routes/collections as the app grows.
71
+ - Add `cache: true` to `needs:` only if you actually need Redis.