@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.
- package/package.json +1 -1
- package/src/corpus/capability-map.md +82 -2
- package/src/corpus/examples/crm/index.md +273 -0
- package/src/corpus/examples/kanban/index.md +256 -0
- package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
- package/src/corpus/templates/admin-dashboard/README.md +75 -0
- package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/admin-dashboard/index.md +81 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/api/orders/route.js +64 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/api/users/route.js +63 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/layout.js +39 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/page.js +73 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/resource-table.js +94 -0
- package/src/corpus/templates/admin-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/admin-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/ai-app/cloudgrid.yaml +225 -11
- package/src/corpus/templates/ai-app/index.md +3 -11
- package/src/corpus/templates/ai-knowledge-base/AGENTS.md +254 -0
- package/src/corpus/templates/ai-knowledge-base/README.md +28 -0
- package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +238 -0
- package/src/corpus/templates/ai-knowledge-base/index.md +81 -0
- package/src/corpus/templates/analytics-dashboard/README.md +85 -0
- package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +232 -0
- package/src/corpus/templates/analytics-dashboard/index.md +316 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/api/events/route.js +60 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/event-form.js +100 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/layout.js +41 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/page.js +54 -0
- package/src/corpus/templates/analytics-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/analytics-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/api-dashboard/README.md +84 -0
- package/src/corpus/templates/api-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/api-dashboard/index.md +310 -0
- package/src/corpus/templates/api-dashboard/services/web/app/api/requests/route.js +62 -0
- package/src/corpus/templates/api-dashboard/services/web/app/dashboard.js +156 -0
- package/src/corpus/templates/api-dashboard/services/web/app/layout.js +42 -0
- package/src/corpus/templates/api-dashboard/services/web/app/page.js +39 -0
- package/src/corpus/templates/api-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/api-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/api-docs/README.md +28 -0
- package/src/corpus/templates/api-docs/cloudgrid.yaml +228 -0
- package/src/corpus/templates/api-docs/index.html +136 -0
- package/src/corpus/templates/api-docs/index.md +28 -0
- package/src/corpus/templates/api-service/cloudgrid.yaml +224 -9
- package/src/corpus/templates/api-service/index.md +3 -11
- package/src/corpus/templates/app-with-data/cloudgrid.yaml +226 -8
- package/src/corpus/templates/app-with-data/index.md +3 -8
- package/src/corpus/templates/appointment-booking/AGENTS.md +223 -0
- package/src/corpus/templates/appointment-booking/README.md +16 -0
- package/src/corpus/templates/appointment-booking/cloudgrid.yaml +250 -0
- package/src/corpus/templates/appointment-booking/index.md +72 -0
- package/src/corpus/templates/approval-workflow/AGENTS.md +170 -0
- package/src/corpus/templates/approval-workflow/README.md +12 -0
- package/src/corpus/templates/approval-workflow/cloudgrid.yaml +237 -0
- package/src/corpus/templates/approval-workflow/index.md +58 -0
- package/src/corpus/templates/billing-dashboard/AGENTS.md +199 -0
- package/src/corpus/templates/billing-dashboard/README.md +18 -0
- package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +235 -0
- package/src/corpus/templates/billing-dashboard/index.md +87 -0
- package/src/corpus/templates/blog-cms/README.md +94 -0
- package/src/corpus/templates/blog-cms/cloudgrid.yaml +233 -0
- package/src/corpus/templates/blog-cms/index.md +358 -0
- package/src/corpus/templates/blog-cms/services/web/app/admin/admin-editor.js +133 -0
- package/src/corpus/templates/blog-cms/services/web/app/admin/page.js +33 -0
- package/src/corpus/templates/blog-cms/services/web/app/api/posts/route.js +84 -0
- package/src/corpus/templates/blog-cms/services/web/app/layout.js +47 -0
- package/src/corpus/templates/blog-cms/services/web/app/page.js +56 -0
- package/src/corpus/templates/blog-cms/services/web/app/posts/[slug]/page.js +45 -0
- package/src/corpus/templates/blog-cms/services/web/lib/db.js +32 -0
- package/src/corpus/templates/blog-cms/services/web/package.json +16 -0
- package/src/corpus/templates/booking-system/AGENTS.md +189 -0
- package/src/corpus/templates/booking-system/README.md +17 -0
- package/src/corpus/templates/booking-system/cloudgrid.yaml +248 -0
- package/src/corpus/templates/booking-system/index.md +86 -0
- package/src/corpus/templates/calendar-scheduler/AGENTS.md +226 -0
- package/src/corpus/templates/calendar-scheduler/README.md +25 -0
- package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +259 -0
- package/src/corpus/templates/calendar-scheduler/index.md +85 -0
- package/src/corpus/templates/changelog/README.md +27 -0
- package/src/corpus/templates/changelog/cloudgrid.yaml +228 -0
- package/src/corpus/templates/changelog/index.html +80 -0
- package/src/corpus/templates/changelog/index.md +28 -0
- package/src/corpus/templates/company-website/README.md +54 -0
- package/src/corpus/templates/company-website/cloudgrid.yaml +233 -0
- package/src/corpus/templates/company-website/index.html +309 -0
- package/src/corpus/templates/company-website/index.md +29 -0
- package/src/corpus/templates/course-platform/AGENTS.md +161 -0
- package/src/corpus/templates/course-platform/README.md +26 -0
- package/src/corpus/templates/course-platform/cloudgrid.yaml +237 -0
- package/src/corpus/templates/course-platform/index.md +70 -0
- package/src/corpus/templates/crm/README.md +72 -0
- package/src/corpus/templates/crm/cloudgrid.yaml +233 -0
- package/src/corpus/templates/crm/index.md +71 -0
- package/src/corpus/templates/crm/services/web/app/api/contacts/route.js +80 -0
- package/src/corpus/templates/crm/services/web/app/contact-manager.js +102 -0
- package/src/corpus/templates/crm/services/web/app/layout.js +35 -0
- package/src/corpus/templates/crm/services/web/app/page.js +34 -0
- package/src/corpus/templates/crm/services/web/lib/db.js +32 -0
- package/src/corpus/templates/crm/services/web/package.json +16 -0
- package/src/corpus/templates/dashboard/cloudgrid.yaml +228 -4
- package/src/corpus/templates/dashboard/index.md +3 -5
- package/src/corpus/templates/deck/cloudgrid.yaml +228 -4
- package/src/corpus/templates/deck/index.md +3 -5
- package/src/corpus/templates/directory/README.md +75 -0
- package/src/corpus/templates/directory/cloudgrid.yaml +233 -0
- package/src/corpus/templates/directory/index.md +334 -0
- package/src/corpus/templates/directory/services/web/app/api/entries/route.js +63 -0
- package/src/corpus/templates/directory/services/web/app/directory-list.js +146 -0
- package/src/corpus/templates/directory/services/web/app/layout.js +44 -0
- package/src/corpus/templates/directory/services/web/app/page.js +38 -0
- package/src/corpus/templates/directory/services/web/lib/db.js +32 -0
- package/src/corpus/templates/directory/services/web/package.json +16 -0
- package/src/corpus/templates/docs-site/README.md +28 -0
- package/src/corpus/templates/docs-site/cloudgrid.yaml +228 -0
- package/src/corpus/templates/docs-site/index.html +122 -0
- package/src/corpus/templates/docs-site/index.md +28 -0
- package/src/corpus/templates/erp/AGENTS.md +116 -0
- package/src/corpus/templates/erp/README.md +17 -0
- package/src/corpus/templates/erp/cloudgrid.yaml +235 -0
- package/src/corpus/templates/erp/index.md +81 -0
- package/src/corpus/templates/event-board/README.md +74 -0
- package/src/corpus/templates/event-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/event-board/index.md +299 -0
- package/src/corpus/templates/event-board/services/web/app/api/events/route.js +61 -0
- package/src/corpus/templates/event-board/services/web/app/event-form.js +118 -0
- package/src/corpus/templates/event-board/services/web/app/layout.js +39 -0
- package/src/corpus/templates/event-board/services/web/app/page.js +34 -0
- package/src/corpus/templates/event-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/event-board/services/web/package.json +16 -0
- package/src/corpus/templates/expense-tracker/README.md +76 -0
- package/src/corpus/templates/expense-tracker/cloudgrid.yaml +233 -0
- package/src/corpus/templates/expense-tracker/index.md +305 -0
- package/src/corpus/templates/expense-tracker/services/web/app/api/expenses/route.js +61 -0
- package/src/corpus/templates/expense-tracker/services/web/app/expense-form.js +145 -0
- package/src/corpus/templates/expense-tracker/services/web/app/layout.js +42 -0
- package/src/corpus/templates/expense-tracker/services/web/app/page.js +34 -0
- package/src/corpus/templates/expense-tracker/services/web/lib/db.js +32 -0
- package/src/corpus/templates/expense-tracker/services/web/package.json +16 -0
- package/src/corpus/templates/feature-request-board/README.md +87 -0
- package/src/corpus/templates/feature-request-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/feature-request-board/index.md +317 -0
- package/src/corpus/templates/feature-request-board/services/web/app/api/requests/route.js +92 -0
- package/src/corpus/templates/feature-request-board/services/web/app/board.js +91 -0
- package/src/corpus/templates/feature-request-board/services/web/app/layout.js +43 -0
- package/src/corpus/templates/feature-request-board/services/web/app/page.js +35 -0
- package/src/corpus/templates/feature-request-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/feature-request-board/services/web/package.json +16 -0
- package/src/corpus/templates/financial-dashboard/README.md +80 -0
- package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/financial-dashboard/index.md +326 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/api/entries/route.js +63 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/entry-board.js +130 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/layout.js +46 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/page.js +31 -0
- package/src/corpus/templates/financial-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/financial-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/forum/AGENTS.md +196 -0
- package/src/corpus/templates/forum/README.md +12 -0
- package/src/corpus/templates/forum/cloudgrid.yaml +237 -0
- package/src/corpus/templates/forum/index.md +66 -0
- package/src/corpus/templates/hr-portal/AGENTS.md +174 -0
- package/src/corpus/templates/hr-portal/README.md +14 -0
- package/src/corpus/templates/hr-portal/cloudgrid.yaml +237 -0
- package/src/corpus/templates/hr-portal/index.md +56 -0
- package/src/corpus/templates/internal-tools-portal/AGENTS.md +201 -0
- package/src/corpus/templates/internal-tools-portal/README.md +17 -0
- package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +237 -0
- package/src/corpus/templates/internal-tools-portal/index.md +62 -0
- package/src/corpus/templates/inventory/README.md +71 -0
- package/src/corpus/templates/inventory/cloudgrid.yaml +233 -0
- package/src/corpus/templates/inventory/index.md +68 -0
- package/src/corpus/templates/inventory/services/web/app/api/items/route.js +88 -0
- package/src/corpus/templates/inventory/services/web/app/inventory-manager.js +101 -0
- package/src/corpus/templates/inventory/services/web/app/layout.js +36 -0
- package/src/corpus/templates/inventory/services/web/app/page.js +37 -0
- package/src/corpus/templates/inventory/services/web/lib/db.js +32 -0
- package/src/corpus/templates/inventory/services/web/package.json +16 -0
- package/src/corpus/templates/invoice/README.md +71 -0
- package/src/corpus/templates/invoice/cloudgrid.yaml +233 -0
- package/src/corpus/templates/invoice/index.md +68 -0
- package/src/corpus/templates/invoice/services/web/app/api/invoices/route.js +82 -0
- package/src/corpus/templates/invoice/services/web/app/invoice-manager.js +101 -0
- package/src/corpus/templates/invoice/services/web/app/layout.js +35 -0
- package/src/corpus/templates/invoice/services/web/app/page.js +34 -0
- package/src/corpus/templates/invoice/services/web/lib/db.js +32 -0
- package/src/corpus/templates/invoice/services/web/package.json +16 -0
- package/src/corpus/templates/job-board/README.md +71 -0
- package/src/corpus/templates/job-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/job-board/index.md +68 -0
- package/src/corpus/templates/job-board/services/web/app/api/jobs/route.js +66 -0
- package/src/corpus/templates/job-board/services/web/app/job-board.js +73 -0
- package/src/corpus/templates/job-board/services/web/app/layout.js +35 -0
- package/src/corpus/templates/job-board/services/web/app/page.js +32 -0
- package/src/corpus/templates/job-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/job-board/services/web/package.json +16 -0
- package/src/corpus/templates/kanban/README.md +72 -0
- package/src/corpus/templates/kanban/cloudgrid.yaml +233 -0
- package/src/corpus/templates/kanban/index.md +71 -0
- package/src/corpus/templates/kanban/services/web/app/api/cards/route.js +70 -0
- package/src/corpus/templates/kanban/services/web/app/board.js +93 -0
- package/src/corpus/templates/kanban/services/web/app/layout.js +37 -0
- package/src/corpus/templates/kanban/services/web/app/page.js +32 -0
- package/src/corpus/templates/kanban/services/web/lib/db.js +32 -0
- package/src/corpus/templates/kanban/services/web/package.json +16 -0
- package/src/corpus/templates/landing-page/cloudgrid.yaml +228 -4
- package/src/corpus/templates/landing-page/index.md +3 -5
- package/src/corpus/templates/lms/AGENTS.md +193 -0
- package/src/corpus/templates/lms/README.md +27 -0
- package/src/corpus/templates/lms/cloudgrid.yaml +237 -0
- package/src/corpus/templates/lms/index.md +79 -0
- package/src/corpus/templates/marketplace/AGENTS.md +208 -0
- package/src/corpus/templates/marketplace/README.md +22 -0
- package/src/corpus/templates/marketplace/cloudgrid.yaml +233 -0
- package/src/corpus/templates/marketplace/index.md +76 -0
- package/src/corpus/templates/membership-site/AGENTS.md +160 -0
- package/src/corpus/templates/membership-site/README.md +18 -0
- package/src/corpus/templates/membership-site/cloudgrid.yaml +236 -0
- package/src/corpus/templates/membership-site/index.md +66 -0
- package/src/corpus/templates/monitoring-dashboard/README.md +84 -0
- package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/monitoring-dashboard/index.md +328 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/api/checks/route.js +76 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/check-form.js +124 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/layout.js +44 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/page.js +49 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/online-store/AGENTS.md +153 -0
- package/src/corpus/templates/online-store/README.md +16 -0
- package/src/corpus/templates/online-store/cloudgrid.yaml +234 -0
- package/src/corpus/templates/online-store/index.md +81 -0
- package/src/corpus/templates/portfolio/README.md +29 -0
- package/src/corpus/templates/portfolio/cloudgrid.yaml +228 -0
- package/src/corpus/templates/portfolio/index.html +126 -0
- package/src/corpus/templates/portfolio/index.md +28 -0
- package/src/corpus/templates/product-catalog/README.md +74 -0
- package/src/corpus/templates/product-catalog/cloudgrid.yaml +232 -0
- package/src/corpus/templates/product-catalog/index.md +330 -0
- package/src/corpus/templates/product-catalog/services/web/app/api/products/route.js +69 -0
- package/src/corpus/templates/product-catalog/services/web/app/catalog.js +153 -0
- package/src/corpus/templates/product-catalog/services/web/app/layout.js +49 -0
- package/src/corpus/templates/product-catalog/services/web/app/page.js +36 -0
- package/src/corpus/templates/product-catalog/services/web/lib/db.js +32 -0
- package/src/corpus/templates/product-catalog/services/web/package.json +16 -0
- package/src/corpus/templates/product-launch/README.md +46 -0
- package/src/corpus/templates/product-launch/cloudgrid.yaml +234 -0
- package/src/corpus/templates/product-launch/index.html +320 -0
- package/src/corpus/templates/product-launch/index.md +34 -0
- package/src/corpus/templates/project-management/README.md +83 -0
- package/src/corpus/templates/project-management/cloudgrid.yaml +233 -0
- package/src/corpus/templates/project-management/index.md +346 -0
- package/src/corpus/templates/project-management/services/web/app/api/projects/route.js +48 -0
- package/src/corpus/templates/project-management/services/web/app/api/tasks/route.js +85 -0
- package/src/corpus/templates/project-management/services/web/app/board.js +182 -0
- package/src/corpus/templates/project-management/services/web/app/layout.js +45 -0
- package/src/corpus/templates/project-management/services/web/app/page.js +49 -0
- package/src/corpus/templates/project-management/services/web/lib/db.js +32 -0
- package/src/corpus/templates/project-management/services/web/package.json +16 -0
- package/src/corpus/templates/property-listings/README.md +76 -0
- package/src/corpus/templates/property-listings/cloudgrid.yaml +233 -0
- package/src/corpus/templates/property-listings/index.md +335 -0
- package/src/corpus/templates/property-listings/services/web/app/api/properties/route.js +73 -0
- package/src/corpus/templates/property-listings/services/web/app/layout.js +45 -0
- package/src/corpus/templates/property-listings/services/web/app/listings.js +152 -0
- package/src/corpus/templates/property-listings/services/web/app/page.js +53 -0
- package/src/corpus/templates/property-listings/services/web/lib/db.js +32 -0
- package/src/corpus/templates/property-listings/services/web/package.json +16 -0
- package/src/corpus/templates/quiz-platform/README.md +84 -0
- package/src/corpus/templates/quiz-platform/cloudgrid.yaml +233 -0
- package/src/corpus/templates/quiz-platform/index.md +313 -0
- package/src/corpus/templates/quiz-platform/services/web/app/api/questions/route.js +69 -0
- package/src/corpus/templates/quiz-platform/services/web/app/layout.js +47 -0
- package/src/corpus/templates/quiz-platform/services/web/app/page.js +37 -0
- package/src/corpus/templates/quiz-platform/services/web/app/quiz.js +188 -0
- package/src/corpus/templates/quiz-platform/services/web/lib/db.js +32 -0
- package/src/corpus/templates/quiz-platform/services/web/package.json +16 -0
- package/src/corpus/templates/report/cloudgrid.yaml +228 -4
- package/src/corpus/templates/report/index.md +3 -5
- package/src/corpus/templates/restaurant-reservations/AGENTS.md +258 -0
- package/src/corpus/templates/restaurant-reservations/README.md +17 -0
- package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +258 -0
- package/src/corpus/templates/restaurant-reservations/index.md +62 -0
- package/src/corpus/templates/revenue-dashboard/README.md +75 -0
- package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/revenue-dashboard/index.md +307 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/api/sales/route.js +60 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/layout.js +40 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/page.js +87 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/sale-form.js +63 -0
- package/src/corpus/templates/revenue-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/revenue-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/saas-marketing/README.md +30 -0
- package/src/corpus/templates/saas-marketing/cloudgrid.yaml +228 -0
- package/src/corpus/templates/saas-marketing/index.html +212 -0
- package/src/corpus/templates/saas-marketing/index.md +28 -0
- package/src/corpus/templates/status-page/README.md +28 -0
- package/src/corpus/templates/status-page/cloudgrid.yaml +228 -0
- package/src/corpus/templates/status-page/index.html +117 -0
- package/src/corpus/templates/status-page/index.md +28 -0
- package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
- package/src/corpus/templates/subscription-management/README.md +21 -0
- package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
- package/src/corpus/templates/subscription-management/index.md +73 -0
- package/src/corpus/templates/task-manager/README.md +72 -0
- package/src/corpus/templates/task-manager/cloudgrid.yaml +233 -0
- package/src/corpus/templates/task-manager/index.md +71 -0
- package/src/corpus/templates/task-manager/services/web/app/api/tasks/route.js +77 -0
- package/src/corpus/templates/task-manager/services/web/app/layout.js +39 -0
- package/src/corpus/templates/task-manager/services/web/app/page.js +33 -0
- package/src/corpus/templates/task-manager/services/web/app/task-list.js +110 -0
- package/src/corpus/templates/task-manager/services/web/lib/db.js +32 -0
- package/src/corpus/templates/task-manager/services/web/package.json +16 -0
- package/src/corpus/templates/ticket-system/README.md +71 -0
- package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
- package/src/corpus/templates/ticket-system/index.md +68 -0
- package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
- package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
- package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
- package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
- package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
- package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
- package/src/corpus/templates/time-tracking/README.md +81 -0
- package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
- package/src/corpus/templates/time-tracking/index.md +298 -0
- package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
- package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
- package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
- package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
- package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
- package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
- package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
- package/src/corpus/templates/travel-booking/README.md +17 -0
- package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
- package/src/corpus/templates/travel-booking/index.md +88 -0
- package/src/corpus/templates/waitlist/README.md +38 -0
- package/src/corpus/templates/waitlist/cloudgrid.yaml +228 -0
- package/src/corpus/templates/waitlist/index.html +69 -0
- package/src/corpus/templates/waitlist/index.md +39 -0
- package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
- package/src/corpus/templates/web-app/index.md +3 -5
- package/src/corpus/workflows/admin-dashboard.md +102 -0
- package/src/corpus/workflows/ai-knowledge-base.md +137 -0
- package/src/corpus/workflows/analytics-dashboard.md +104 -0
- package/src/corpus/workflows/api-dashboard.md +102 -0
- package/src/corpus/workflows/api-docs.md +36 -0
- package/src/corpus/workflows/appointment-booking.md +143 -0
- package/src/corpus/workflows/approval-workflow.md +124 -0
- package/src/corpus/workflows/billing-dashboard.md +120 -0
- package/src/corpus/workflows/blog-cms.md +104 -0
- package/src/corpus/workflows/booking-system.md +116 -0
- package/src/corpus/workflows/calendar-scheduler.md +134 -0
- package/src/corpus/workflows/changelog.md +33 -0
- package/src/corpus/workflows/company-website.md +46 -0
- package/src/corpus/workflows/course-platform.md +126 -0
- package/src/corpus/workflows/crm.md +101 -0
- package/src/corpus/workflows/directory.md +101 -0
- package/src/corpus/workflows/docs-site.md +35 -0
- package/src/corpus/workflows/erp.md +125 -0
- package/src/corpus/workflows/event-board.md +102 -0
- package/src/corpus/workflows/expense-tracker.md +102 -0
- package/src/corpus/workflows/feature-request-board.md +105 -0
- package/src/corpus/workflows/financial-dashboard.md +103 -0
- package/src/corpus/workflows/forum.md +128 -0
- package/src/corpus/workflows/hr-portal.md +115 -0
- package/src/corpus/workflows/internal-tools-portal.md +125 -0
- package/src/corpus/workflows/inventory.md +101 -0
- package/src/corpus/workflows/invoice.md +101 -0
- package/src/corpus/workflows/job-board.md +101 -0
- package/src/corpus/workflows/kanban.md +102 -0
- package/src/corpus/workflows/lms.md +113 -0
- package/src/corpus/workflows/marketplace.md +123 -0
- package/src/corpus/workflows/membership-site.md +128 -0
- package/src/corpus/workflows/monitoring-dashboard.md +104 -0
- package/src/corpus/workflows/online-store.md +114 -0
- package/src/corpus/workflows/portfolio.md +35 -0
- package/src/corpus/workflows/product-catalog.md +105 -0
- package/src/corpus/workflows/product-launch.md +43 -0
- package/src/corpus/workflows/project-management.md +106 -0
- package/src/corpus/workflows/property-listings.md +101 -0
- package/src/corpus/workflows/quiz-platform.md +105 -0
- package/src/corpus/workflows/restaurant-reservations.md +123 -0
- package/src/corpus/workflows/revenue-dashboard.md +102 -0
- package/src/corpus/workflows/saas-marketing.md +37 -0
- package/src/corpus/workflows/status-page.md +35 -0
- package/src/corpus/workflows/subscription-management.md +141 -0
- package/src/corpus/workflows/task-manager.md +101 -0
- package/src/corpus/workflows/ticket-system.md +101 -0
- package/src/corpus/workflows/time-tracking.md +104 -0
- package/src/corpus/workflows/travel-booking.md +115 -0
- package/src/corpus/workflows/waitlist.md +42 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# AGENTS.md — restaurant-reservations (BLUEPRINT)
|
|
2
|
+
|
|
3
|
+
This is a **structure guide**, not runnable code. It tells an agent how to build a
|
|
4
|
+
restaurant website with online reservations correctly **on CloudGrid**: a public
|
|
5
|
+
Next.js site (menu + booking form) backed by grid-shared MongoDB, with the
|
|
6
|
+
CloudGrid-native wiring for the DB, secrets, optional payments/auth, and a
|
|
7
|
+
scheduled reminder job. Read it end to end, then build the app under
|
|
8
|
+
`services/web/` following the same proven shape as the `app-with-data` template.
|
|
9
|
+
|
|
10
|
+
Do NOT ship this as-is — there is no app code here. Adapt the tree below.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. File tree
|
|
15
|
+
|
|
16
|
+
App code MUST live under `services/<service-name>/`. The service is named `web`,
|
|
17
|
+
so the CLI looks for `services/web/`. `path: /` in `cloudgrid.yaml` is the URL
|
|
18
|
+
mount, NOT the filesystem path — files at the repo root fail with
|
|
19
|
+
`Error: Service directory not found: …/services/web`.
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
cloudgrid.yaml # name + services.web (nextjs) + needs:{database:true} + vault:
|
|
23
|
+
AGENTS.md # this guide
|
|
24
|
+
services/web/package.json # next, react, react-dom, mongodb (+ stripe if deposits)
|
|
25
|
+
services/web/lib/db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
|
|
26
|
+
services/web/lib/mail.js # SendGrid client from process.env.SENDGRID_API_KEY (vault-injected)
|
|
27
|
+
services/web/app/layout.js # root layout + site chrome / inline CSS
|
|
28
|
+
services/web/app/page.js # home: hero + menu (server component, reads menu collection)
|
|
29
|
+
services/web/app/reserve/page.js # reservation page (renders the booking form)
|
|
30
|
+
services/web/app/reserve/reservation-form.js # "use client" form: POST a reservation
|
|
31
|
+
services/web/app/api/menu/route.js # GET menu items (public)
|
|
32
|
+
services/web/app/api/reservations/route.js # POST create reservation, GET list (staff)
|
|
33
|
+
services/web/app/api/reservations/[id]/route.js # PATCH status (confirm/seat/cancel), DELETE
|
|
34
|
+
# ─ optional: card deposit to hold a table (Stripe) ─
|
|
35
|
+
services/web/app/api/checkout/route.js # POST → create Stripe Checkout Session for a deposit
|
|
36
|
+
services/web/app/api/webhooks/stripe/route.js # POST ← Stripe webhook: mark reservation deposit paid
|
|
37
|
+
# ─ optional: staff auth (Clerk/Auth0) ─
|
|
38
|
+
services/web/middleware.js # protect /staff/* routes with the provider SDK
|
|
39
|
+
services/web/app/staff/page.js # staff dashboard: today's reservations
|
|
40
|
+
# ─ scheduled reminders (SEE §7 — cron deploy PENDING #1543) ─
|
|
41
|
+
services/reminder/package.json # mongodb + sendgrid; a one-shot job entry
|
|
42
|
+
services/reminder/index.js # find tomorrow's reservations → send reminder emails
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Keep the public reservation flow **unauthenticated** — a diner should book
|
|
46
|
+
without an account. Auth is only for the staff dashboard.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 2. MongoDB collections + fields
|
|
51
|
+
|
|
52
|
+
The grid provisions one shared Mongo database (see §3). Use these collections:
|
|
53
|
+
|
|
54
|
+
### `menu`
|
|
55
|
+
Menu content shown on the home page. Seed it once (script or an admin route).
|
|
56
|
+
| field | type | notes |
|
|
57
|
+
|-------|------|-------|
|
|
58
|
+
| `_id` | ObjectId | |
|
|
59
|
+
| `section` | string | e.g. "Starters", "Mains", "Desserts" |
|
|
60
|
+
| `name` | string | dish name |
|
|
61
|
+
| `description` | string | short copy |
|
|
62
|
+
| `price` | number | in cents, or a display string — pick one and be consistent |
|
|
63
|
+
| `order` | number | sort order within a section |
|
|
64
|
+
| `available` | boolean | hide sold-out items |
|
|
65
|
+
|
|
66
|
+
### `reservations`
|
|
67
|
+
The booking records — the persistent core of this app.
|
|
68
|
+
| field | type | notes |
|
|
69
|
+
|-------|------|-------|
|
|
70
|
+
| `_id` | ObjectId | |
|
|
71
|
+
| `name` | string | guest name |
|
|
72
|
+
| `email` | string | for confirmation + reminder |
|
|
73
|
+
| `phone` | string | optional |
|
|
74
|
+
| `partySize` | number | number of covers |
|
|
75
|
+
| `date` | string (`YYYY-MM-DD`) | requested date |
|
|
76
|
+
| `time` | string (`HH:mm`) | requested slot |
|
|
77
|
+
| `tableId` | ObjectId \| null | assigned table (nullable until seated) |
|
|
78
|
+
| `status` | string | `pending` → `confirmed` → `seated` / `cancelled` / `no_show` |
|
|
79
|
+
| `notes` | string | allergies, occasion, seating pref |
|
|
80
|
+
| `depositPaid` | boolean | true after Stripe webhook (if deposits on) |
|
|
81
|
+
| `reminderSentAt` | Date \| null | set by the cron job so it never double-sends |
|
|
82
|
+
| `createdAt` | Date | index + sort |
|
|
83
|
+
|
|
84
|
+
### `tables` (optional — table booking)
|
|
85
|
+
| field | type | notes |
|
|
86
|
+
|-------|------|-------|
|
|
87
|
+
| `_id` | ObjectId | |
|
|
88
|
+
| `label` | string | "T1", "Window 4" |
|
|
89
|
+
| `seats` | number | capacity |
|
|
90
|
+
| `zone` | string | "patio", "main", "bar" |
|
|
91
|
+
|
|
92
|
+
Availability = look up reservations for a `date`/`time` window and subtract from
|
|
93
|
+
`tables` capacity. Add a unique index on `{ tableId, date, time }` to prevent
|
|
94
|
+
double-booking a specific table, and index `reservations.createdAt` and
|
|
95
|
+
`{ date: 1, time: 1 }` for the availability query and the reminder job.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 3. How CloudGrid injects things (the whole point)
|
|
100
|
+
|
|
101
|
+
You never provision infra or set connection strings by hand. Declare intent in
|
|
102
|
+
`cloudgrid.yaml`; the platform provisions and injects env vars.
|
|
103
|
+
|
|
104
|
+
- **Database (Mongo).** `needs: { database: true }` → the grid provisions shared
|
|
105
|
+
Mongo and injects the connection string as **`DATABASE_MONGODB_URL`** (plus the
|
|
106
|
+
legacy **`MONGODB_URL`** alias) at `grid dev` (locally) and at runtime (after
|
|
107
|
+
`grid plug`). Read it **lazily** inside a getter, `process.env.DATABASE_MONGODB_URL
|
|
108
|
+
|| process.env.MONGODB_URL` — **never at module top level**, or `next build`
|
|
109
|
+
throws when it imports the module for route analysis before the var exists.
|
|
110
|
+
`db.client.db()` returns the DB from the connection-string path segment.
|
|
111
|
+
Do NOT set `DATABASE_MONGODB_URL`/`MONGODB_URL` yourself.
|
|
112
|
+
|
|
113
|
+
- **Secrets (Stripe, email, auth) → `vault:` block.** Map an org vault item to an
|
|
114
|
+
env var in `cloudgrid.yaml` `vault:` (already uncommented in this blueprint):
|
|
115
|
+
`STRIPE_KEY: stripe-live-key`, `SENDGRID_API_KEY: sendgrid-key`,
|
|
116
|
+
`AUTH_PROVIDER_KEY: auth-provider-secret`. The platform reads the named item
|
|
117
|
+
from the org vault and injects it as that env var at runtime. Store the actual
|
|
118
|
+
secret value with `gridctl_secrets` (or the org vault UI) — never commit it. In
|
|
119
|
+
code read `process.env.STRIPE_KEY`, `process.env.SENDGRID_API_KEY`, etc. Vault
|
|
120
|
+
is the CloudGrid-correct path for third-party keys; `gridctl_env` is for
|
|
121
|
+
non-secret config only.
|
|
122
|
+
|
|
123
|
+
- **AI (optional).** If you add AI (e.g. menu-copy generation, natural-language
|
|
124
|
+
booking parsing), declare `needs: { ai: true }` → the grid injects
|
|
125
|
+
**`AI_GATEWAY_URL`**; call it via `@cloudgrid-io/ai`. Not required for the base
|
|
126
|
+
blueprint.
|
|
127
|
+
|
|
128
|
+
Reserved env var names you must NOT set: `PORT`, `APP_NAME`, `SERVICE_NAME`,
|
|
129
|
+
`NODE_ENV`, `MONGODB_URL`, `REDIS_URL`, `AI_GATEWAY_URL`, `CLOUDGRID_*`.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 4. Wiring auth and/or payments
|
|
134
|
+
|
|
135
|
+
### Payments — Stripe deposit to hold a table (optional)
|
|
136
|
+
1. `vault: { STRIPE_KEY: stripe-live-key }` (present in `cloudgrid.yaml`); add
|
|
137
|
+
`stripe` to `services/web/package.json`.
|
|
138
|
+
2. `app/api/checkout/route.js` — read `process.env.STRIPE_KEY`, construct the
|
|
139
|
+
Stripe client, create a Checkout Session for the deposit amount, tuck the
|
|
140
|
+
`reservationId` into the session `metadata`, return the session URL; the client
|
|
141
|
+
redirects to it.
|
|
142
|
+
3. `app/api/webhooks/stripe/route.js` — verify the Stripe signature, and on
|
|
143
|
+
`checkout.session.completed` set `depositPaid: true` (and `status: confirmed`)
|
|
144
|
+
on the reservation from `metadata.reservationId`. This route MUST be public
|
|
145
|
+
(exclude it from auth middleware) and read the raw request body for signature
|
|
146
|
+
verification. Register its URL in the Stripe dashboard as the webhook endpoint
|
|
147
|
+
after the app is live.
|
|
148
|
+
|
|
149
|
+
### Auth — staff dashboard login (optional)
|
|
150
|
+
1. `vault: { AUTH_PROVIDER_KEY: auth-provider-secret }` (uncomment it), add the
|
|
151
|
+
provider SDK (e.g. `@clerk/nextjs` or `@auth0/nextjs-auth0`) to
|
|
152
|
+
`package.json`.
|
|
153
|
+
2. `middleware.js` — protect `/staff/*` (and staff-only API routes) with the
|
|
154
|
+
provider; leave `/`, `/reserve`, `/api/menu`, `/api/reservations` (POST),
|
|
155
|
+
`/api/webhooks/stripe` public.
|
|
156
|
+
3. Initialize the SDK from `process.env.AUTH_PROVIDER_KEY` (+ any public
|
|
157
|
+
publishable key via `gridctl_env`). The public booking flow needs no login.
|
|
158
|
+
|
|
159
|
+
Keep the public reservation POST open; only staff read/mutate endpoints
|
|
160
|
+
(`GET /api/reservations`, `PATCH/DELETE /api/reservations/[id]`, `/staff/*`) sit
|
|
161
|
+
behind auth.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 5. Deploy steps
|
|
166
|
+
|
|
167
|
+
Runtime app → **local edition** only (Claude Desktop / Claude Code / CLI); the
|
|
168
|
+
build is **asynchronous**.
|
|
169
|
+
|
|
170
|
+
1. `gridctl_login_status` (→ `gridctl_login` if needed). Pick the grid if the
|
|
171
|
+
user has more than one.
|
|
172
|
+
2. `gridctl_init` an app `<name>` — creates the entity + `.cloudgrid/link.json`
|
|
173
|
+
and a `cloudgrid.yaml` with empty `services: {}`. Run `init` FIRST (plug needs
|
|
174
|
+
a linked dir).
|
|
175
|
+
3. **Fill** — write the app under `services/web/`, then set `cloudgrid.yaml` to
|
|
176
|
+
this blueprint's active fields: `name`, `services.web { type: nextjs, path: / }`,
|
|
177
|
+
`needs: { database: true }`, and the `vault:` mappings you actually use.
|
|
178
|
+
4. Store secrets: `gridctl_secrets` for the vault item values (Stripe/SendGrid/
|
|
179
|
+
auth). Non-secret config (publishable keys, feature flags) → `gridctl_env`.
|
|
180
|
+
5. (Optional) `grid dev` — runs Next.js locally with `DATABASE_MONGODB_URL` and
|
|
181
|
+
vault vars injected against dev Mongo. Seed `menu`, test a booking.
|
|
182
|
+
6. `gridctl_plug` — builds + deploys `services/web/`. **Async**: the first
|
|
183
|
+
response is `status: building`, not a URL. Poll `gridctl_status` (or the
|
|
184
|
+
returned poll URL) until live; surface a liveness signal while it builds
|
|
185
|
+
(never a bare silent wait). Only then return the **live app URL** (not the
|
|
186
|
+
build/log link).
|
|
187
|
+
7. Iterate by re-plugging the SAME entity — it updates the same URL. If you
|
|
188
|
+
turned on Stripe, register the live `/api/webhooks/stripe` URL in Stripe.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 6. Edition note
|
|
193
|
+
|
|
194
|
+
This is a **runtime app** (built + deployed container), so it requires the
|
|
195
|
+
**local edition** (Claude Desktop / Claude Code) or the CLI. On the **hosted**
|
|
196
|
+
edition (Claude Web / hosted MCP) you CANNOT build a runtime app — hosted is
|
|
197
|
+
inline-only and can publish static pages only. If the user is on hosted, say so
|
|
198
|
+
plainly and offer a static, non-persistent menu page instead (no bookings), then
|
|
199
|
+
stop the runtime path.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 7. Cron reminders — INTENDED SHAPE, NOT YET DEPLOYABLE (#1543)
|
|
204
|
+
|
|
205
|
+
The design calls for a scheduled job that emails confirmation reminders to guests
|
|
206
|
+
with a booking the next day. On CloudGrid this is a second **cron service** in the
|
|
207
|
+
same entity:
|
|
208
|
+
|
|
209
|
+
```yaml
|
|
210
|
+
services:
|
|
211
|
+
reminder:
|
|
212
|
+
type: cron
|
|
213
|
+
schedule: "0 15 * * *" # daily 15:00
|
|
214
|
+
timezone: UTC
|
|
215
|
+
run: job # runs services/reminder/ as a one-shot job
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
The cron job (`services/reminder/index.js`) reads the SAME grid-injected
|
|
219
|
+
`DATABASE_MONGODB_URL` and the vault-injected `SENDGRID_API_KEY`, queries
|
|
220
|
+
`reservations` where `date` is tomorrow and `reminderSentAt` is null and
|
|
221
|
+
`status` is `confirmed`, sends each a reminder, and stamps `reminderSentAt` so it
|
|
222
|
+
never double-sends.
|
|
223
|
+
|
|
224
|
+
> **PENDING platform issue #1543:** cron deploy is not yet available. Keep the
|
|
225
|
+
> `reminder:` cron block **commented out** in `cloudgrid.yaml` (as shipped) —
|
|
226
|
+
> plugging an entity with an active cron service will be rejected until #1543
|
|
227
|
+
> lands. Build the rest now; enable the cron block once cron ships. Interim
|
|
228
|
+
> workaround: trigger the same reminder logic from an external scheduler hitting
|
|
229
|
+
> a protected HTTP route, or run it manually.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 8. DB wiring reference (copy the app-with-data shape)
|
|
234
|
+
|
|
235
|
+
`services/web/lib/db.js` — lazy cached Mongo client (identical pattern to the
|
|
236
|
+
`app-with-data` template):
|
|
237
|
+
|
|
238
|
+
```js
|
|
239
|
+
import { MongoClient } from "mongodb";
|
|
240
|
+
|
|
241
|
+
function clientPromise() {
|
|
242
|
+
const uri = process.env.DATABASE_MONGODB_URL || process.env.MONGODB_URL;
|
|
243
|
+
if (!uri) throw new Error("DATABASE_MONGODB_URL not set — the grid injects it; use grid dev / grid plug.");
|
|
244
|
+
if (!globalThis.__mongoClientPromise) {
|
|
245
|
+
globalThis.__mongoClientPromise = new MongoClient(uri).connect();
|
|
246
|
+
}
|
|
247
|
+
return globalThis.__mongoClientPromise;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export async function getDb() {
|
|
251
|
+
const client = await clientPromise();
|
|
252
|
+
return client.db();
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Every route/server component imports `getDb()` from here. Mark reservation and
|
|
257
|
+
menu routes `export const dynamic = "force-dynamic"` so they always hit Mongo.
|
|
258
|
+
Validate `partySize`, `date`, `time`, `email` on the server before insert.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# restaurant-reservations template — BLUEPRINT (structure + cloudgrid.yaml)
|
|
2
|
+
|
|
3
|
+
A restaurant website with online reservations: a public Next.js site (menu
|
|
4
|
+
content + a booking form / table booking) backed by grid-shared MongoDB, with
|
|
5
|
+
CloudGrid-native wiring for the database, third-party secrets (Stripe deposit,
|
|
6
|
+
email/SMS via the `vault:` block), optional staff auth, and a scheduled reminder
|
|
7
|
+
job. Reservations persist in Mongo (`needs: { database: true }` → injected
|
|
8
|
+
`DATABASE_MONGODB_URL`); this is a runtime app (local edition, async deploy) —
|
|
9
|
+
not a static page.
|
|
10
|
+
|
|
11
|
+
**This is a blueprint: structure + `cloudgrid.yaml`, adapt and build.** There is
|
|
12
|
+
no app code here. Read `AGENTS.md` for the file tree, the Mongo collections
|
|
13
|
+
(`menu`, `reservations`, `tables`), how CloudGrid injects the DB and vault
|
|
14
|
+
secrets, how to wire Stripe/auth, and the deploy steps — then build the app under
|
|
15
|
+
`services/web/` following it. Note: the confirmation-reminder **cron** service is
|
|
16
|
+
documented but NOT yet deployable (platform issue #1543) — keep that block
|
|
17
|
+
commented.
|
|
@@ -0,0 +1,258 @@
|
|
|
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: restaurant-reservations
|
|
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
|
+
# This is the CloudGrid-correct way to inject third-party secrets (auth provider,
|
|
122
|
+
# Stripe, email). The platform reads the named item from the org vault and injects
|
|
123
|
+
# it as the env var at runtime — never hardcode or commit these.
|
|
124
|
+
#
|
|
125
|
+
# This blueprint uses a booking-provider / notification secret and (optional)
|
|
126
|
+
# Stripe deposit for reservations. Uncomment only the ones you actually wire.
|
|
127
|
+
vault:
|
|
128
|
+
# Stripe secret key — required only if you take a card deposit to hold a table.
|
|
129
|
+
# Used by the Stripe SDK in the deposit checkout + webhook routes.
|
|
130
|
+
STRIPE_KEY: stripe-live-key
|
|
131
|
+
# Transactional email/SMS provider key for confirmation + reminder messages.
|
|
132
|
+
SENDGRID_API_KEY: sendgrid-key
|
|
133
|
+
# Auth provider (Clerk/Auth0) key — only if the restaurant staff dashboard
|
|
134
|
+
# needs a login. Public reservation form needs no auth.
|
|
135
|
+
# AUTH_PROVIDER_KEY: auth-provider-secret
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# ─── CONNECTORS AND HOOKS ──────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
# connectors:
|
|
141
|
+
# - id: team-slack
|
|
142
|
+
# target: org # 'system' | 'org'.
|
|
143
|
+
# channel: "#deploys"
|
|
144
|
+
# hooks:
|
|
145
|
+
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
146
|
+
# via: team-slack
|
|
147
|
+
# template: "Deploy failed for {entity_name}: {error}"
|
|
148
|
+
# channel: "#alerts"
|
|
149
|
+
# triggers:
|
|
150
|
+
# - from: team-slack
|
|
151
|
+
# event: message
|
|
152
|
+
# channel: "#support"
|
|
153
|
+
# route: /webhooks/slack
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
# ─── LOCAL DEVELOPMENT ──────────────────────────────────────────────────────
|
|
157
|
+
|
|
158
|
+
# Config for `grid dev`. Redact fields in dev data snapshots.
|
|
159
|
+
# dev:
|
|
160
|
+
# snapshot:
|
|
161
|
+
# mask:
|
|
162
|
+
# - reservations.email
|
|
163
|
+
# - reservations.phone
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# ─── AGENT METADATA ────────────────────────────────────────────────────────
|
|
167
|
+
|
|
168
|
+
# An agent is an app with kind: agent (above) and an agent: block.
|
|
169
|
+
# agent:
|
|
170
|
+
# purpose: Sync customer data from external CRM every night
|
|
171
|
+
# schedule: "0 2 * * *"
|
|
172
|
+
# trigger: webhook
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# ─── PRIVATE RESOURCE AUTO-DEPENDENCIES ────────────────────────────────────
|
|
176
|
+
|
|
177
|
+
# When true (default), private resources are auto-injected as depends_on.
|
|
178
|
+
# auto_depends_on_private_requires: true
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
# ─── SERVICES (REQUIRED) ───────────────────────────────────────────────────
|
|
182
|
+
#
|
|
183
|
+
# At least one service is required. Key = service name (slug rules).
|
|
184
|
+
# Types: node, nextjs, python, static, cron.
|
|
185
|
+
#
|
|
186
|
+
services:
|
|
187
|
+
web:
|
|
188
|
+
# type (REQUIRED): node | nextjs | python | static | cron
|
|
189
|
+
type: nextjs
|
|
190
|
+
# HTTP route: '/' | '/api' | false (internal) | omitted (=false + warning).
|
|
191
|
+
# Only one service per entity can claim '/'.
|
|
192
|
+
path: /
|
|
193
|
+
# Container port (default 8080; read process.env.PORT). Not for cron.
|
|
194
|
+
# port: 3000
|
|
195
|
+
# nextjs only: base_image: distroless (default) | alpine
|
|
196
|
+
# base_image: distroless
|
|
197
|
+
# node only: lang: javascript (default) | typescript
|
|
198
|
+
# lang: typescript
|
|
199
|
+
# Custom source location (default services/<name>/). '.' = project root.
|
|
200
|
+
# source:
|
|
201
|
+
# path: src/worker
|
|
202
|
+
# Health probe: false/omitted (TCP) | true (/health) | "/path" | {path,expected}
|
|
203
|
+
# health:
|
|
204
|
+
# path: /api/health
|
|
205
|
+
# expected: "200"
|
|
206
|
+
# Static runtime env vars (strings). Reserved: PORT, APP_NAME, SERVICE_NAME,
|
|
207
|
+
# NODE_ENV, MONGODB_URL, REDIS_URL, AI_GATEWAY_URL, N8N_WEBHOOK_URL, CLOUDGRID_*.
|
|
208
|
+
# env:
|
|
209
|
+
# LOG_LEVEL: info
|
|
210
|
+
# Sibling services/private resources that must be Ready first (no cron, no cycles).
|
|
211
|
+
# depends_on:
|
|
212
|
+
# - worker
|
|
213
|
+
# Per-service needs override (merges with app-level needs).
|
|
214
|
+
# needs:
|
|
215
|
+
# queue: true
|
|
216
|
+
# Static-only build step:
|
|
217
|
+
# build:
|
|
218
|
+
# command: npm run build
|
|
219
|
+
# output: dist
|
|
220
|
+
# env:
|
|
221
|
+
# VITE_API_URL: https://api.example.com
|
|
222
|
+
# node_version: "22" # static build step: '18'|'20'|'22'|'24' (quoted)
|
|
223
|
+
# Cron-only: schedule (REQUIRED), timezone (UTC|EST|PST), run (job | https URL)
|
|
224
|
+
# schedule: "0 9 * * 1"
|
|
225
|
+
# timezone: UTC
|
|
226
|
+
# run: job
|
|
227
|
+
# Verbose per-service persistence (prefer needs.disk):
|
|
228
|
+
# persist:
|
|
229
|
+
# - name: scratch
|
|
230
|
+
# path: /tmp/scratch
|
|
231
|
+
# size: 500Mi
|
|
232
|
+
|
|
233
|
+
# ─── CRON SERVICE (INTENDED SHAPE — NOT YET DEPLOYABLE) ──────────────────
|
|
234
|
+
# Scheduled confirmation / reminder sender for upcoming reservations.
|
|
235
|
+
# A cron service has no HTTP path; it runs `run: job` on `schedule`.
|
|
236
|
+
# NOTE: cron deploy is currently a PENDING platform issue (#1543). This block
|
|
237
|
+
# documents the intended shape only — leave it COMMENTED until cron ships,
|
|
238
|
+
# or the plug will reject the entity. See AGENTS.md → "Cron reminders".
|
|
239
|
+
# reminder:
|
|
240
|
+
# type: cron
|
|
241
|
+
# schedule: "0 15 * * *" # daily 15:00 — remind next-day bookings
|
|
242
|
+
# timezone: UTC
|
|
243
|
+
# run: job # runs services/reminder/ as a one-shot job
|
|
244
|
+
# # The cron job reads the SAME injected DATABASE_MONGODB_URL + vault secrets
|
|
245
|
+
# # (SENDGRID_API_KEY) to find tomorrow's reservations and send reminders.
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
needs:
|
|
249
|
+
database: true
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
# ============================================================================
|
|
253
|
+
# NOTES
|
|
254
|
+
# - NOT here: org:/entity_id: (→ .cloudgrid/link.json), secrets (→ grid secrets set),
|
|
255
|
+
# Dockerfile (platform generates from services.*.type).
|
|
256
|
+
# - Deploy: grid plug | Local with grid resources: grid dev
|
|
257
|
+
# - Full reference: docs/cloudgrid-yaml-reference.md | CLI: docs/cli-reference.md
|
|
258
|
+
# ============================================================================
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Template: restaurant-reservations (BLUEPRINT — Next.js + Mongo)
|
|
2
|
+
|
|
3
|
+
A restaurant website with online reservations. A public Next.js site (menu +
|
|
4
|
+
booking form / table booking) backed by grid-shared MongoDB, with CloudGrid-native
|
|
5
|
+
wiring for the DB, third-party secrets (`vault:`), optional Stripe deposit and
|
|
6
|
+
staff auth, and a scheduled reminder job. Reservations persist in Mongo — this is
|
|
7
|
+
a **runtime app** (local edition, async deploy), not a static page.
|
|
8
|
+
|
|
9
|
+
**This is a blueprint, not runnable code.** It ships a `cloudgrid.yaml` (active:
|
|
10
|
+
`name` + `services.web` nextjs + `needs: { database: true }` + a `vault:` block)
|
|
11
|
+
and an `AGENTS.md` structure guide. Fetch both, read `AGENTS.md`, then build the
|
|
12
|
+
app under `services/web/` following it — the proven `app-with-data` shape with a
|
|
13
|
+
`reservations` domain.
|
|
14
|
+
|
|
15
|
+
**Key rules:**
|
|
16
|
+
|
|
17
|
+
1. **App code MUST live under `services/web/`**, not the template root. `path: /`
|
|
18
|
+
is the URL mount, NOT the filesystem path.
|
|
19
|
+
2. **Read `DATABASE_MONGODB_URL` LAZILY** (inside the getter), legacy
|
|
20
|
+
`MONGODB_URL` fallback — the grid injects it; never hardcode, never commit.
|
|
21
|
+
3. **Third-party secrets go through the `vault:` block** (Stripe `STRIPE_KEY`,
|
|
22
|
+
email `SENDGRID_API_KEY`, optional `AUTH_PROVIDER_KEY`) → injected env vars;
|
|
23
|
+
store values with `gridctl_secrets`.
|
|
24
|
+
4. **Declare `needs: { database: true }`** (canonical) — never mix `needs:` and
|
|
25
|
+
`requires:`.
|
|
26
|
+
5. **Cron reminder service is documented but NOT deployable yet** (platform issue
|
|
27
|
+
#1543) — keep the `reminder:` cron block commented.
|
|
28
|
+
|
|
29
|
+
## Fetch bundle
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
gridctl_fetch("template", "restaurant-reservations") # cloudgrid.yaml + AGENTS.md + README
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Then read `AGENTS.md` (file tree, `menu`/`reservations`/`tables` collections,
|
|
36
|
+
CloudGrid env/vault/deploy wiring, Stripe + auth, cron shape) and build under
|
|
37
|
+
`services/web/`. Deploy: `grid init` → fill → `grid plug` (async — poll to a live
|
|
38
|
+
URL). Local edition only.
|
|
39
|
+
|
|
40
|
+
## cloudgrid.yaml (active fields)
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
# On disk this file is the full-annotated reference (templates/_cloudgrid.yaml.reference)
|
|
44
|
+
# with EVERY field present as a comment; only the fields below are uncommented
|
|
45
|
+
# (plus a vault: block and a COMMENTED cron reminder service), so it deploys to
|
|
46
|
+
# exactly these active fields.
|
|
47
|
+
name: restaurant-reservations
|
|
48
|
+
vault:
|
|
49
|
+
STRIPE_KEY: stripe-live-key
|
|
50
|
+
SENDGRID_API_KEY: sendgrid-key
|
|
51
|
+
services:
|
|
52
|
+
web:
|
|
53
|
+
type: nextjs
|
|
54
|
+
path: /
|
|
55
|
+
needs:
|
|
56
|
+
database: true
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
> **Capability:** `needs: { database: true }` → the deployer provisions Mongo and
|
|
60
|
+
> injects `DATABASE_MONGODB_URL` (+ legacy `MONGODB_URL`). Vault items are injected
|
|
61
|
+
> as the mapped env vars. `requires:` is the deprecated v1 alias — don't mix it
|
|
62
|
+
> with `needs:`. See the capability-map for the full injection table.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# revenue-dashboard template — persistent Next.js + Mongo revenue dashboard
|
|
2
|
+
|
|
3
|
+
A minimal but real, deployable revenue/sales dashboard. Sales live in the
|
|
4
|
+
grid-shared MongoDB, so they survive refresh and are shared across
|
|
5
|
+
users/sessions — unlike a static page whose state is in memory only.
|
|
6
|
+
|
|
7
|
+
It shows a **total revenue** figure, a **per-product breakdown**, a **recent
|
|
8
|
+
sales table**, and a form to **add a sale**. Each sale is a document in a `sales`
|
|
9
|
+
collection: `{ product: string, amount: number, at: Date }`.
|
|
10
|
+
|
|
11
|
+
## How the grid gives you a database
|
|
12
|
+
|
|
13
|
+
You do **not** provision a database or set a connection string. In
|
|
14
|
+
`cloudgrid.yaml` you declare `needs: { database: true }`, and the grid:
|
|
15
|
+
|
|
16
|
+
- provisions shared Mongo for the app, and
|
|
17
|
+
- injects the connection string as the **`DATABASE_MONGODB_URL`** environment
|
|
18
|
+
variable (plus the legacy `MONGODB_URL` alias) — at dev-time (`grid dev`) and
|
|
19
|
+
at runtime (after `grid plug`).
|
|
20
|
+
|
|
21
|
+
The app reads it via `process.env.DATABASE_MONGODB_URL` (with a legacy
|
|
22
|
+
`process.env.MONGODB_URL` fallback) in `services/web/lib/db.js` — **lazily,
|
|
23
|
+
inside the `getDb` getter, never at module top level** (a top-level read fails
|
|
24
|
+
`next build`, which imports the module for route analysis before the grid injects
|
|
25
|
+
the var). Never hardcode a connection string; never commit a secret.
|
|
26
|
+
|
|
27
|
+
> **Declare `needs: { database: true }` (the canonical shape).** The deployer
|
|
28
|
+
> provisions Mongo and injects `DATABASE_MONGODB_URL` (plus the legacy
|
|
29
|
+
> `MONGODB_URL` alias). `requires:` is the deprecated v1 alias — don't author new
|
|
30
|
+
> yaml with it, and never set `needs:` and `requires:` together (the validator
|
|
31
|
+
> rejects the combination).
|
|
32
|
+
|
|
33
|
+
## Service layout
|
|
34
|
+
|
|
35
|
+
App code lives under **`services/web/`**, not the template root. `path:` in
|
|
36
|
+
`cloudgrid.yaml` is the URL mount, not the filesystem path — the service named
|
|
37
|
+
`web` means the CLI looks for `services/web/`. Files at the root fail with
|
|
38
|
+
`Error: Service directory not found: …/services/web`.
|
|
39
|
+
|
|
40
|
+
## Run locally
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install
|
|
44
|
+
grid dev # runs Next.js with DATABASE_MONGODB_URL injected against dev Mongo
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Deploy
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
grid plug # builds + deploys the folder (async — poll status until live)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
A runtime deploy is asynchronous: `plug` returns `status: building`; poll status
|
|
54
|
+
until the app is live, then use the returned live URL. Re-plug the same entity
|
|
55
|
+
to update the same URL.
|
|
56
|
+
|
|
57
|
+
## File tree
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
cloudgrid.yaml # name + services.web (nextjs) + needs: { database: true }
|
|
61
|
+
services/web/package.json # next, react, react-dom, mongodb driver only
|
|
62
|
+
services/web/lib/db.js # lazy Mongo client from DATABASE_MONGODB_URL (legacy MONGODB_URL fallback)
|
|
63
|
+
services/web/app/layout.js # root layout + inline CSS
|
|
64
|
+
services/web/app/page.js # server component: total + per-product breakdown + recent table
|
|
65
|
+
services/web/app/sale-form.js # client form: POST a sale, refresh the server component
|
|
66
|
+
services/web/app/api/sales/route.js # GET (list) / POST (add) / DELETE (remove)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Adapt it
|
|
70
|
+
|
|
71
|
+
- Rename the `sales` collection in `services/web/app/api/sales/route.js` and
|
|
72
|
+
`services/web/app/page.js` (e.g. `invoices`, `orders`, `payments`).
|
|
73
|
+
- Change the document fields (add currency, region, customer, MRR flags).
|
|
74
|
+
- Add a chart, date filters, or per-period rollups as the app grows.
|
|
75
|
+
- Add `cache: true` to `needs:` only if you actually need Redis.
|