@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,28 @@
1
+ # Template: saas-marketing (static)
2
+
3
+ A single self-contained HTML SaaS marketing site (hero, features, pricing tiers, testimonials, FAQ, and a closing call to action). Richer than the landing-page template. **No infrastructure** — no database, no backend, no `needs:`.
4
+ State (if any) lives only in memory and is lost on refresh.
5
+
6
+ ## How it deploys
7
+
8
+ To publish this page, use **`gridctl_drop`** (or `gridctl_plug` with the inline
9
+ HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
10
+ edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
11
+ directory (`type: static`) is ONLY for plugging the page as an OWNED static
12
+ runtime (async, local edition only); the fast path is `gridctl_drop`.
13
+
14
+ The fillable HTML is the real template — fetch it with
15
+ `gridctl_fetch("template", "saas-marketing")` and fill in the user's content.
16
+
17
+ ## cloudgrid.yaml (reference only)
18
+
19
+ ```yaml
20
+ # On disk this file is the full-annotated reference (templates/_cloudgrid.yaml.reference) with EVERY
21
+ # field present as a comment; only the fields below are uncommented, so it
22
+ # deploys to exactly these active fields.
23
+ name: saas-marketing
24
+ services:
25
+ web:
26
+ type: static
27
+ path: /
28
+ ```
@@ -0,0 +1,28 @@
1
+ # status-page
2
+
3
+ A single self-contained HTML service status page: an overall banner, a component list with up / degraded / down pills, per-component uptime bars, and an incident history log. Status is baked into the page.
4
+
5
+ Static inspiration — a single self-contained `index.html` (inline CSS and JS,
6
+ no external CDNs). It deploys instantly via `gridctl_drop` and works on every
7
+ CloudGrid edition, including hosted.
8
+
9
+ ## Fill it in
10
+
11
+ Fetch the template with `gridctl_fetch("template", "status-page")`, then replace the
12
+ placeholders:
13
+
14
+ - The overall status banner text and state class (`ok` / `degraded` / `down`).
15
+ - One row per component: name, a status pill, and a 90-day uptime bar (the bar segments are inline divs you set to ok/degraded/down).
16
+ - The incident history entries: date, title, state, and a short resolution note.
17
+ - All state is baked into the markup — this is a display-only static page, no live polling.
18
+
19
+ Keep it a single self-contained HTML file. Do not add external scripts,
20
+ stylesheets, fonts, or large embedded media.
21
+
22
+ ## Deploy
23
+
24
+ - Hosted MCP edition: call the drop tool with the HTML.
25
+ - Local MCP / CLI edition: write the HTML to a file and run `gridctl plug`.
26
+
27
+ It deploys as an inspiration and returns a live share URL right away. Re-deploy
28
+ with the same entity id to update the same URL.
@@ -0,0 +1,228 @@
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: status-page
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
+ #
174
+ services:
175
+ web:
176
+ # type (REQUIRED): node | nextjs | python | static | cron
177
+ type: static
178
+ # HTTP route: '/' | '/api' | false (internal) | omitted (=false + warning).
179
+ # Only one service per entity can claim '/'.
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
+ # ============================================================================
223
+ # NOTES
224
+ # - NOT here: org:/entity_id: (→ .cloudgrid/link.json), secrets (→ grid secrets set),
225
+ # Dockerfile (platform generates from services.*.type).
226
+ # - Deploy: grid plug | Local with grid resources: grid dev
227
+ # - Full reference: docs/cloudgrid-yaml-reference.md | CLI: docs/cli-reference.md
228
+ # ============================================================================
@@ -0,0 +1,117 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>{{SERVICE_NAME}} status</title>
7
+ <style>
8
+ :root {
9
+ --bg: #0b0f17; --panel: #121826; --fg: #e8edf5; --muted: #9aa7bd;
10
+ --border: #223049; --ok: #34d399; --degraded: #fbbf24; --down: #f87171;
11
+ }
12
+ * { box-sizing: border-box; margin: 0; padding: 0; }
13
+ body {
14
+ background: var(--bg); color: var(--fg);
15
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
16
+ -webkit-font-smoothing: antialiased; line-height: 1.5;
17
+ }
18
+ .wrap { max-width: 840px; margin: 0 auto; padding: clamp(1.5rem, 5vw, 3rem) 1.25rem; }
19
+ header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.75rem; gap: 1rem; flex-wrap: wrap; }
20
+ header .brand { font-weight: 600; font-size: 1.15rem; letter-spacing: -0.01em; }
21
+ header .updated { color: var(--muted); font-size: 0.85rem; }
22
+
23
+ .banner { border-radius: 14px; padding: 1.25rem 1.5rem; margin-bottom: 2rem; font-weight: 600; display: flex; align-items: center; gap: 0.75rem; border: 1px solid var(--border); }
24
+ .banner .dot { width: 12px; height: 12px; border-radius: 50%; }
25
+ .banner.ok { background: rgba(52,211,153,0.1); } .banner.ok .dot { background: var(--ok); }
26
+ .banner.degraded { background: rgba(251,191,36,0.1); } .banner.degraded .dot { background: var(--degraded); }
27
+ .banner.down { background: rgba(248,113,113,0.1); } .banner.down .dot { background: var(--down); }
28
+
29
+ h2 { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); margin: 2rem 0 0.75rem; }
30
+ .component { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 1.1rem 1.25rem; margin-bottom: 0.75rem; }
31
+ .component .top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.75rem; }
32
+ .component .name { font-weight: 600; }
33
+ .pill { font-size: 0.8rem; padding: 0.2rem 0.65rem; border-radius: 999px; font-weight: 600; }
34
+ .pill.ok { color: var(--ok); background: rgba(52,211,153,0.12); }
35
+ .pill.degraded { color: var(--degraded); background: rgba(251,191,36,0.12); }
36
+ .pill.down { color: var(--down); background: rgba(248,113,113,0.12); }
37
+ .uptime { display: flex; gap: 2px; align-items: flex-end; height: 30px; }
38
+ .uptime span { flex: 1; height: 100%; border-radius: 2px; background: var(--ok); opacity: 0.85; }
39
+ .uptime span.degraded { background: var(--degraded); }
40
+ .uptime span.down { background: var(--down); }
41
+ .uptime-label { display: flex; justify-content: space-between; color: var(--muted); font-size: 0.75rem; margin-top: 0.4rem; }
42
+
43
+ .incident { border-left: 3px solid var(--border); padding: 0.5rem 0 0.5rem 1rem; margin-bottom: 1.5rem; }
44
+ .incident.ok { border-color: var(--ok); }
45
+ .incident.degraded { border-color: var(--degraded); }
46
+ .incident.down { border-color: var(--down); }
47
+ .incident .date { color: var(--muted); font-size: 0.8rem; }
48
+ .incident .title { font-weight: 600; margin: 0.2rem 0; }
49
+ .incident p { color: var(--muted); font-size: 0.92rem; }
50
+ footer { color: var(--muted); font-size: 0.85rem; margin-top: 2.5rem; text-align: center; }
51
+ </style>
52
+ </head>
53
+ <body>
54
+ <div class="wrap">
55
+ <header>
56
+ <span class="brand">{{SERVICE_NAME}}</span>
57
+ <span class="updated">Last updated {{LAST_UPDATED}}</span>
58
+ </header>
59
+
60
+ <!-- Overall banner: set the class to ok / degraded / down. -->
61
+ <div class="banner ok">
62
+ <span class="dot"></span>
63
+ <span>{{OVERALL_STATUS_TEXT}}</span>
64
+ </div>
65
+
66
+ <h2>Components</h2>
67
+ <!-- COMPONENTS_START -->
68
+ <!-- One .component per service. Set the .pill class (ok/degraded/down) and
69
+ mark any non-ok bars in .uptime with class degraded or down. -->
70
+ <div class="component">
71
+ <div class="top"><span class="name">{{COMPONENT_1_NAME}}</span><span class="pill ok">Operational</span></div>
72
+ <div class="uptime">
73
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
74
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
75
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
76
+ </div>
77
+ <div class="uptime-label"><span>90 days ago</span><span>{{COMPONENT_1_UPTIME}} uptime</span><span>today</span></div>
78
+ </div>
79
+ <div class="component">
80
+ <div class="top"><span class="name">{{COMPONENT_2_NAME}}</span><span class="pill degraded">Degraded</span></div>
81
+ <div class="uptime">
82
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
83
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span class="degraded"></span><span class="degraded"></span>
84
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
85
+ </div>
86
+ <div class="uptime-label"><span>90 days ago</span><span>{{COMPONENT_2_UPTIME}} uptime</span><span>today</span></div>
87
+ </div>
88
+ <div class="component">
89
+ <div class="top"><span class="name">{{COMPONENT_3_NAME}}</span><span class="pill ok">Operational</span></div>
90
+ <div class="uptime">
91
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
92
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
93
+ <span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
94
+ </div>
95
+ <div class="uptime-label"><span>90 days ago</span><span>{{COMPONENT_3_UPTIME}} uptime</span><span>today</span></div>
96
+ </div>
97
+ <!-- COMPONENTS_END -->
98
+
99
+ <h2>Incident history</h2>
100
+ <!-- INCIDENTS_START -->
101
+ <div class="incident ok">
102
+ <div class="date">{{INCIDENT_1_DATE}}</div>
103
+ <div class="title">{{INCIDENT_1_TITLE}}</div>
104
+ <p>{{INCIDENT_1_BODY}}</p>
105
+ </div>
106
+ <div class="incident down">
107
+ <div class="date">{{INCIDENT_2_DATE}}</div>
108
+ <div class="title">{{INCIDENT_2_TITLE}}</div>
109
+ <p>{{INCIDENT_2_BODY}}</p>
110
+ </div>
111
+ <!-- Add more .incident blocks (class ok/degraded/down) as needed. -->
112
+ <!-- INCIDENTS_END -->
113
+
114
+ <footer>{{FOOTER_TEXT}}</footer>
115
+ </div>
116
+ </body>
117
+ </html>
@@ -0,0 +1,28 @@
1
+ # Template: status-page (static)
2
+
3
+ A single self-contained HTML service status page: an overall banner, a component list with up / degraded / down pills, per-component uptime bars, and an incident history log. Status is baked into the page. **No infrastructure** — no database, no backend, no `needs:`.
4
+ State (if any) lives only in memory and is lost on refresh.
5
+
6
+ ## How it deploys
7
+
8
+ To publish this page, use **`gridctl_drop`** (or `gridctl_plug` with the inline
9
+ HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
10
+ edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
11
+ directory (`type: static`) is ONLY for plugging the page as an OWNED static
12
+ runtime (async, local edition only); the fast path is `gridctl_drop`.
13
+
14
+ The fillable HTML is the real template — fetch it with
15
+ `gridctl_fetch("template", "status-page")` and fill in the user's content.
16
+
17
+ ## cloudgrid.yaml (reference only)
18
+
19
+ ```yaml
20
+ # On disk this file is the full-annotated reference (templates/_cloudgrid.yaml.reference) with EVERY
21
+ # field present as a comment; only the fields below are uncommented, so it
22
+ # deploys to exactly these active fields.
23
+ name: status-page
24
+ services:
25
+ web:
26
+ type: static
27
+ path: /
28
+ ```
@@ -0,0 +1,191 @@
1
+ # AGENTS.md — subscription-management (BLUEPRINT)
2
+
3
+ This is a **blueprint**, not runnable code. It tells an agent how to build a
4
+ self-serve subscription-management app correctly on CloudGrid: a Next.js app
5
+ where a signed-in customer sees their current plan, changes/upgrades/downgrades
6
+ or cancels it, and manages billing (card, invoices) through the Stripe Billing
7
+ Portal — with a Stripe webhook keeping local subscription state in sync, and
8
+ Mongo for persistence. Read this whole file, then build the app under
9
+ `services/web/` following the structure below. Do not skip the CloudGrid wiring
10
+ rules — they are what make it deploy.
11
+
12
+ Scope note: this is the **manage-what-you-already-have** surface (view plan,
13
+ switch plan, update payment method, cancel), not the acquisition funnel. If the
14
+ user wants the *sign-up + paywall + gated content* flow, that is the
15
+ `membership-site` blueprint; this one owns the ongoing plan/billing lifecycle.
16
+ The two share the same Stripe + Mongo wiring.
17
+
18
+ The proven persistent shape is `app-with-data` (Next.js + Mongo). This blueprint
19
+ extends it with Stripe subscriptions + the Billing Portal. Fetch that template
20
+ for the Mongo lazy-client and App-Router API pattern:
21
+ `gridctl_fetch("template", "app-with-data")`.
22
+
23
+ ## 1. File tree
24
+
25
+ Build exactly this layout. **App code MUST live under `services/web/`** — the
26
+ service is named `web`, so the CLI looks for `services/web/`. `path: /` in
27
+ `cloudgrid.yaml` is the URL mount, NOT the filesystem path. Files at the repo
28
+ root fail with `Error: Service directory not found: …/services/web`.
29
+
30
+ ```
31
+ cloudgrid.yaml # name + services.web (nextjs) + needs:{database:true} + vault: (Stripe secrets)
32
+ services/web/package.json # next, react, react-dom, mongodb, stripe (+ auth SDK if used, e.g. @clerk/nextjs)
33
+ services/web/middleware.js # auth middleware: protects /account/* + the subscription API routes
34
+ services/web/lib/db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
35
+ services/web/lib/stripe.js # lazy Stripe client from process.env.STRIPE_KEY (never top-level)
36
+ services/web/lib/subscription.js # getSubscription(customerRef): read current plan/status from subscriptions collection
37
+ services/web/lib/plans.js # plan catalog: { key, name, price, stripePriceId } for each plan (upgrade/downgrade options)
38
+ services/web/app/layout.js # root layout (+ auth provider wrapper if the SDK needs one)
39
+ services/web/app/page.js # entry: link to /account (or the plans view for the unsubscribed)
40
+ services/web/app/account/page.js # THE dashboard: current plan, status, renewal date, "Change plan" + "Manage billing" + "Cancel"
41
+ services/web/app/account/plans.js # client component: plan cards + change-plan / cancel buttons calling the API
42
+ services/web/app/api/subscription/route.js # GET current subscription; PATCH to change plan (Stripe subscription update, prorated)
43
+ services/web/app/api/subscription/cancel/route.js # POST: cancel at period end (or resume) via Stripe
44
+ services/web/app/api/portal/route.js # POST: create a Stripe Billing Portal session → return url (card, invoices, receipts)
45
+ services/web/app/api/webhook/route.js # POST: Stripe webhook — upsert subscription state on subscription/invoice events
46
+ ```
47
+
48
+ ## 2. Mongo collections + fields
49
+
50
+ The grid provisions Mongo from `needs: { database: true }`. Use two collections:
51
+
52
+ **`customers`** — links your app's user to their Stripe customer. (If an auth SDK
53
+ owns identity you may not need a separate profile store, but you DO need the
54
+ user↔`stripeCustomerId` mapping somewhere — keep it here.)
55
+ - `_id` (ObjectId)
56
+ - `userRef` (string, indexed) — your app's user id (auth provider `sub`, or email)
57
+ - `email` (string)
58
+ - `stripeCustomerId` (string, indexed) — the Stripe customer this user maps to
59
+ - `createdAt` (Date)
60
+
61
+ **`subscriptions`** — the local mirror of Stripe subscription state. The webhook
62
+ writes it; the account dashboard and plan-change API read it. Never trust the
63
+ client for plan/status — read this (kept current by the webhook).
64
+ - `_id` (ObjectId)
65
+ - `userRef` (string, indexed)
66
+ - `stripeCustomerId` (string, indexed)
67
+ - `stripeSubscriptionId` (string, indexed)
68
+ - `planKey` (string) — matches a `key` in `lib/plans.js` (e.g. `"basic"`, `"pro"`)
69
+ - `stripePriceId` (string) — the active Stripe price
70
+ - `status` (string) — `"active" | "trialing" | "past_due" | "canceled" | "incomplete"`
71
+ - `cancelAtPeriodEnd` (boolean) — user asked to cancel but access runs to period end
72
+ - `currentPeriodEnd` (Date) — renewal / lapse date shown on the dashboard
73
+ - `updatedAt` (Date)
74
+
75
+ ## 3. How CloudGrid injects everything (the wiring that matters)
76
+
77
+ - **Mongo** — declared by `needs: { database: true }`. The deployer provisions
78
+ shared Mongo and injects the connection string as **`DATABASE_MONGODB_URL`**
79
+ (plus the legacy **`MONGODB_URL`** alias) at runtime and under `grid dev`.
80
+ Read `process.env.DATABASE_MONGODB_URL || process.env.MONGODB_URL` **LAZILY,
81
+ inside the getter** in `lib/db.js` — never at module top level, or `next build`
82
+ fails when it imports the module for route analysis before the grid injects
83
+ the var. Never hardcode a connection string. Never set `needs:` and `requires:`
84
+ together — `requires:` is the deprecated v1 alias.
85
+ - **Secrets (Stripe) → env vars via the `vault:` block.** In `cloudgrid.yaml`
86
+ the `vault:` block maps each env var to a vault item key:
87
+ ```yaml
88
+ vault:
89
+ STRIPE_KEY: stripe-live-key
90
+ STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
91
+ ```
92
+ Set the vault items ONCE with `gridctl_secrets` (or `grid secrets set`), then
93
+ the deployer injects each as the named env var (`process.env.STRIPE_KEY`, etc.)
94
+ at runtime and under `grid dev`. Do NOT commit keys; do NOT set them in
95
+ `services.web.env` (that block is for non-secret config only). Read them lazily
96
+ inside `lib/stripe.js` — same rule as the DB. If you add an auth SDK, add
97
+ `AUTH_PROVIDER_KEY: auth-provider-key` to the vault block too.
98
+ - **Public / non-secret config** — the Stripe *publishable* key
99
+ (`NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY`) and price ids are not secret; put them
100
+ in the non-secret `services.web.env` block (or a build-time env), not the
101
+ vault. An auth SDK's publishable key goes here too.
102
+ - **AI (optional)** — if you add AI features (e.g. churn-reason summaries),
103
+ declare `needs: { ai: true }` and call the gateway at
104
+ `process.env.AI_GATEWAY_URL` via `@cloudgrid-io/ai`. Not required for this
105
+ blueprint.
106
+
107
+ ## 4. Wiring auth + payments
108
+
109
+ **Auth (identify the customer).** Every subscription action must be tied to a
110
+ known user — otherwise anyone could change anyone's plan.
111
+ 1. Add an auth SDK to `services/web/package.json` (e.g. `@clerk/nextjs`, or
112
+ Auth0) OR use your own session. Server key from the vault
113
+ (`process.env.AUTH_PROVIDER_KEY`); publishable key from `services.web.env` as
114
+ `NEXT_PUBLIC_...`.
115
+ 2. `services/web/middleware.js` protects `/account/*` and the
116
+ `/api/subscription*` + `/api/portal` routes — unauthenticated users get
117
+ redirected to sign-in. Resolve the current `userRef` server-side in each API
118
+ route and only ever act on THAT user's `stripeCustomerId`.
119
+
120
+ **Payments (Stripe subscriptions + Billing Portal).**
121
+ 1. Add `stripe` to `package.json`. Build a lazy Stripe client in `lib/stripe.js`
122
+ reading `process.env.STRIPE_KEY` inside the getter.
123
+ 2. **Plan catalog** — `lib/plans.js` is the single source of which plans exist and
124
+ their `stripePriceId`s. The dashboard renders from it; the change-plan API
125
+ validates the requested plan against it (never accept an arbitrary price id
126
+ from the client).
127
+ 3. **Change plan** — `app/api/subscription/route.js` PATCH: resolve the user's
128
+ `stripeSubscriptionId` from Mongo, look up the target `stripePriceId` from
129
+ `lib/plans.js`, call Stripe `subscriptions.update` swapping the item's price
130
+ with `proration_behavior` set as you want (e.g. `create_prorations`). Do NOT
131
+ write the new plan to Mongo here — let the resulting webhook be the source of
132
+ truth so Stripe and Mongo never diverge.
133
+ 4. **Cancel / resume** — `app/api/subscription/cancel/route.js` POST: set
134
+ `cancel_at_period_end: true` (or `false` to resume) on the Stripe
135
+ subscription. Again, the webhook reconciles Mongo.
136
+ 5. **Billing Portal** — `app/api/portal/route.js` POST: create a Stripe Billing
137
+ Portal session (`billingPortal.sessions.create`) for the user's
138
+ `stripeCustomerId` with a `return_url` back to `/account`, and return
139
+ `session.url`. The "Manage billing" button POSTs here and redirects the
140
+ browser to the returned URL — Stripe hosts card updates, invoices, and
141
+ receipts, so you don't rebuild them.
142
+ 6. **Webhook (source of truth)** — `app/api/webhook/route.js` POST: verify the
143
+ signature with `process.env.STRIPE_WEBHOOK_SECRET` (read the RAW request body
144
+ — do not JSON-parse before verifying). On `customer.subscription.created`,
145
+ `customer.subscription.updated`, `customer.subscription.deleted`, and
146
+ `invoice.payment_failed` / `invoice.paid`, upsert the `subscriptions` doc
147
+ keyed by `stripeSubscriptionId` with the new `planKey` / `stripePriceId` /
148
+ `status` / `cancelAtPeriodEnd` / `currentPeriodEnd`. Register this route's
149
+ public URL as the webhook endpoint in the Stripe dashboard after deploy.
150
+
151
+ **Reading state (the dashboard).**
152
+ - `lib/subscription.js` exports `getSubscription(userRef)` → reads the
153
+ `subscriptions` collection and returns the current plan/status/renewal.
154
+ - `app/account/page.js` is a server component: resolve the signed-in `userRef`,
155
+ call `getSubscription`, and render the current plan, status, renewal date, and
156
+ the Change-plan / Manage-billing / Cancel actions. Read state server-side from
157
+ Mongo; never derive entitlement purely on the client.
158
+
159
+ ## 5. Deploy steps
160
+
161
+ 1. `gridctl_login_status` → `gridctl_login` if needed. Respect the grid picker
162
+ (ask which grid if the user has more than one).
163
+ 2. `gridctl_init` an app `<name>` FIRST — it creates the entity, writes
164
+ `.cloudgrid/link.json`, and a `cloudgrid.yaml` with empty `services: {}`.
165
+ `plug` needs a linked directory.
166
+ 3. Write the app under `services/web/` and set `cloudgrid.yaml` to the active
167
+ shape: `name` + `services.web{type: nextjs, path: /}` + `needs:{database:true}`
168
+ + the `vault:` block.
169
+ 4. Set the secrets: `gridctl_secrets` for `stripe-live-key`,
170
+ `stripe-webhook-secret` (and `auth-provider-key` if you use an auth SDK) — the
171
+ vault item keys the `vault:` block maps from. Non-secret config (Stripe
172
+ publishable key, price ids, auth publishable key) → `gridctl_env` /
173
+ `services.web.env`. Do NOT set `DATABASE_MONGODB_URL` yourself — the grid
174
+ injects it.
175
+ 5. `gridctl_plug` to deploy. A runtime deploy is **ASYNC** — the first response
176
+ is `status: building`, not a live URL. Poll `gridctl_status` (or the returned
177
+ poll_url) until live; surface a liveness signal while it builds, never a bare
178
+ silent wait.
179
+ 6. Once live, add the `/api/webhook` URL as the Stripe webhook endpoint, copy
180
+ the signing secret into the `stripe-webhook-secret` vault item, and configure
181
+ the Billing Portal in the Stripe dashboard, then re-plug. Return the live app
182
+ URL (not the build/log link).
183
+
184
+ ## 6. Edition note
185
+
186
+ A subscription-management app is a built + deployed runtime container, so it
187
+ requires the **local edition** (Claude Desktop / Claude Code) or the CLI. The
188
+ **hosted** edition (Claude Web / hosted MCP) is inline-only and can only publish
189
+ static pages — it CANNOT build this app. On hosted, say so plainly and offer a
190
+ static pricing/plans page (via `gridctl_drop`) instead, then stop the runtime
191
+ path.
@@ -0,0 +1,21 @@
1
+ # subscription-management template — BLUEPRINT
2
+
3
+ A self-serve subscription-management app: a Next.js app where a signed-in
4
+ customer sees their current plan, upgrades/downgrades or cancels it, and manages
5
+ billing (card, invoices) through the Stripe Billing Portal — with a Stripe
6
+ webhook keeping local subscription state in sync, and grid-shared Mongo for
7
+ persistence. This is a **blueprint** — it ships the `cloudgrid.yaml` and a
8
+ structure guide (`AGENTS.md`), not finished app code. Read `AGENTS.md` for the
9
+ file tree, Mongo collections, and the CloudGrid wiring (Mongo via
10
+ `needs:{database:true}` → `DATABASE_MONGODB_URL`; Stripe secrets via the `vault:`
11
+ block → env vars), then build the app under `services/web/` following it, adapt
12
+ the plans/fields to the user, and deploy (async — poll to a live URL). It
13
+ requires the local edition.
14
+
15
+ - `cloudgrid.yaml` — active: `name` + `services.web{type: nextjs, path: /}` +
16
+ `needs:{database:true}` + `vault:` (Stripe secrets → env vars).
17
+ - `AGENTS.md` — the structure guide: file tree, collections, CloudGrid injection,
18
+ Stripe change-plan / cancel / billing-portal / webhook wiring, deploy steps,
19
+ edition note.
20
+
21
+ **blueprint: structure + cloudgrid.yaml, adapt and build.**