@cloudgrid-io/mcp 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/corpus/capability-map.md +68 -7
- package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
- package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +226 -8
- package/src/corpus/templates/admin-dashboard/index.md +3 -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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/api-docs/index.md +3 -5
- 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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/changelog/index.md +3 -5
- 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/cloudgrid.yaml +226 -8
- package/src/corpus/templates/crm/index.md +3 -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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/docs-site/index.md +3 -5
- 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/cloudgrid.yaml +226 -8
- package/src/corpus/templates/kanban/index.md +3 -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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/portfolio/index.md +3 -5
- 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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/saas-marketing/index.md +3 -5
- package/src/corpus/templates/status-page/cloudgrid.yaml +222 -4
- package/src/corpus/templates/status-page/index.md +3 -5
- 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/cloudgrid.yaml +226 -8
- package/src/corpus/templates/task-manager/index.md +3 -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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/waitlist/index.md +3 -5
- package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
- package/src/corpus/templates/web-app/index.md +3 -5
- 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/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/company-website.md +46 -0
- package/src/corpus/workflows/course-platform.md +126 -0
- package/src/corpus/workflows/directory.md +101 -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/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/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/subscription-management.md +141 -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
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "quiz-platform",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev",
|
|
7
|
+
"build": "next build",
|
|
8
|
+
"start": "next start"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"next": "^15.1.0",
|
|
12
|
+
"react": "^19.0.0",
|
|
13
|
+
"react-dom": "^19.0.0",
|
|
14
|
+
"mongodb": "^6.12.0"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,10 +1,234 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
#
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# cloudgrid.yaml — Complete Example
|
|
3
|
+
# ============================================================================
|
|
4
4
|
#
|
|
5
|
-
#
|
|
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
|
+
# THIS TEMPLATE (report): a single self-contained static page. The active fields
|
|
17
|
+
# are exactly name + services.web{type: static, path: /}; there are no needs.
|
|
18
|
+
# This cloudgrid.yaml is the reference for plugging it as an OWNED static
|
|
19
|
+
# runtime; the fast path is to deploy it as an INSPIRATION via gridctl_drop
|
|
20
|
+
# (instant, and works on the hosted edition too).
|
|
21
|
+
# ============================================================================
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# ─── IDENTITY ───────────────────────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
27
|
+
# Must start and end with a letter or digit.
|
|
28
|
+
# Becomes part of your public URL: <name>-<4hex>.<org>.cloudgrid.io
|
|
6
29
|
name: report
|
|
30
|
+
|
|
31
|
+
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
32
|
+
# description: Order processing API for the e-commerce platform
|
|
33
|
+
|
|
34
|
+
# Single emoji or short text shown as the entity icon. Max 64 chars.
|
|
35
|
+
# icon: "📦"
|
|
36
|
+
|
|
37
|
+
# Entity type: 'app' (default) or 'agent'. An agent is an app with an agent: block.
|
|
38
|
+
# kind: app
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# ─── NETWORKING ─────────────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
# Whether this entity serves public HTTP traffic.
|
|
44
|
+
# true = public URL + Ingress (default). false = internal only.
|
|
45
|
+
# expose: true
|
|
46
|
+
|
|
47
|
+
# Additional domain names this entity serves on (the platform URL is always active).
|
|
48
|
+
# custom_domains:
|
|
49
|
+
# - orders.example.com
|
|
50
|
+
# - shop.example.com
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# ─── HEALTH PROBE (entity-level override) ──────────────────────────────────
|
|
54
|
+
|
|
55
|
+
# Override the default health check for the entire entity.
|
|
56
|
+
# probe:
|
|
57
|
+
# path: /healthz # HTTP path to probe (default: /).
|
|
58
|
+
# expected: "<500" # '<500' (default), '200', '2xx'.
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
# Slack notification to the org's default channel on deploy failure.
|
|
64
|
+
# true = notify (default), false = silent.
|
|
65
|
+
# notify: true
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# ─── SCALING ────────────────────────────────────────────────────────────────
|
|
69
|
+
|
|
70
|
+
# Replica scaling intent.
|
|
71
|
+
# 'auto' — platform decides from the grid tier (default).
|
|
72
|
+
# 'alert' — single-replica, emit a SPOF warning at plug time.
|
|
73
|
+
# 1-10 — explicit replica count, clamped to the grid max.
|
|
74
|
+
# scale: auto
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
# ─── INFRASTRUCTURE NEEDS ──────────────────────────────────────────────────
|
|
78
|
+
#
|
|
79
|
+
# Declare infrastructure; the platform provisions it and injects connection
|
|
80
|
+
# details as env vars. Nine needs: database, cache, kv, queue, pubsub, vector,
|
|
81
|
+
# object_storage, disk, ai. Simplest form is `true`.
|
|
82
|
+
#
|
|
83
|
+
# needs:
|
|
84
|
+
# # database — MongoDB. Injects DATABASE_MONGODB_URL (+ legacy MONGODB_URL).
|
|
85
|
+
# # true | pool | dedicated | { tier: external, secret: MY_DB }
|
|
86
|
+
# database: true
|
|
87
|
+
# # cache — Redis, LRU eviction (derived data). Injects CACHE_REDIS_URL (+ REDIS_URL).
|
|
88
|
+
# # true | redis | { engine: external, secret: MY_REDIS_URL }
|
|
89
|
+
# cache: true
|
|
90
|
+
# # kv — Redis, no eviction (durable: flags, idempotency). Injects KV_REDIS_URL.
|
|
91
|
+
# kv: true
|
|
92
|
+
# # queue — Redis job-queue substrate (BullMQ). Injects QUEUE_REDIS_URL.
|
|
93
|
+
# queue: true
|
|
94
|
+
# # pubsub — Redis broadcast pub/sub. Injects PUBSUB_REDIS_URL.
|
|
95
|
+
# pubsub: true
|
|
96
|
+
# # vector — pgvector on Postgres. Injects VECTOR_PGVECTOR_URL (+ PGVECTOR_URL).
|
|
97
|
+
# # true | pgvector | { engine: pgvector, dim: 1536 }
|
|
98
|
+
# vector: pgvector
|
|
99
|
+
# # object_storage — GCS bucket. Injects OBJECT_STORAGE_GCS_BUCKET, _GCS_REGION.
|
|
100
|
+
# # true | { size: 10Gi }
|
|
101
|
+
# object_storage: true
|
|
102
|
+
# # disk — persistent FS mount (PVC). Injects DISK_PATH. Pins to 1 replica.
|
|
103
|
+
# # true | { size: 1Gi, mount: /var/data } (forbidden: /proc /sys /dev)
|
|
104
|
+
# disk: true
|
|
105
|
+
# # ai — AI Gateway via @cloudgrid-io/ai. Injects AI_GATEWAY_URL. true | false.
|
|
106
|
+
# ai: true
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
# ─── INTER-ENTITY COMMUNICATION ────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
112
|
+
# calls:
|
|
113
|
+
# - org:atomic/billing-api
|
|
114
|
+
|
|
115
|
+
# Inbound caller policy — who can call YOUR entity.
|
|
116
|
+
# callers:
|
|
117
|
+
# policy: auto # 'auto' | 'manual' (default).
|
|
118
|
+
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
119
|
+
# fallback: deny # 'deny' (default) | 'warn'.
|
|
120
|
+
# # allowed_apps: # required only when scope: explicit
|
|
121
|
+
# # - org:atomic/frontend
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
# Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
127
|
+
# vault:
|
|
128
|
+
# STRIPE_KEY: stripe-live-key
|
|
129
|
+
# SENDGRID_API_KEY: sendgrid-key
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# ─── CONNECTORS AND HOOKS ──────────────────────────────────────────────────
|
|
133
|
+
|
|
134
|
+
# connectors:
|
|
135
|
+
# - id: team-slack
|
|
136
|
+
# target: org # 'system' | 'org'.
|
|
137
|
+
# channel: "#deploys"
|
|
138
|
+
# hooks:
|
|
139
|
+
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
140
|
+
# via: team-slack
|
|
141
|
+
# template: "Deploy failed for {entity_name}: {error}"
|
|
142
|
+
# channel: "#alerts"
|
|
143
|
+
# triggers:
|
|
144
|
+
# - from: team-slack
|
|
145
|
+
# event: message
|
|
146
|
+
# channel: "#support"
|
|
147
|
+
# route: /webhooks/slack
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# ─── LOCAL DEVELOPMENT ──────────────────────────────────────────────────────
|
|
151
|
+
|
|
152
|
+
# Config for `grid dev`. Redact fields in dev data snapshots.
|
|
153
|
+
# dev:
|
|
154
|
+
# snapshot:
|
|
155
|
+
# mask:
|
|
156
|
+
# - users.email
|
|
157
|
+
# - users.phone
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
# ─── AGENT METADATA ────────────────────────────────────────────────────────
|
|
161
|
+
|
|
162
|
+
# An agent is an app with kind: agent (above) and an agent: block.
|
|
163
|
+
# agent:
|
|
164
|
+
# purpose: Sync customer data from external CRM every night
|
|
165
|
+
# schedule: "0 2 * * *"
|
|
166
|
+
# trigger: webhook
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
# ─── PRIVATE RESOURCE AUTO-DEPENDENCIES ────────────────────────────────────
|
|
170
|
+
|
|
171
|
+
# When true (default), private resources are auto-injected as depends_on.
|
|
172
|
+
# auto_depends_on_private_requires: true
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# ─── SERVICES (REQUIRED) ───────────────────────────────────────────────────
|
|
176
|
+
#
|
|
177
|
+
# At least one service is required. Key = service name (slug rules).
|
|
178
|
+
# Types: node, nextjs, python, static, cron.
|
|
179
|
+
#
|
|
7
180
|
services:
|
|
8
181
|
web:
|
|
182
|
+
# type (REQUIRED): node | nextjs | python | static | cron
|
|
9
183
|
type: static
|
|
184
|
+
# HTTP route: '/' | '/api' | false (internal) | omitted (=false + warning).
|
|
185
|
+
# Only one service per entity can claim '/'.
|
|
10
186
|
path: /
|
|
187
|
+
# Container port (default 8080; read process.env.PORT). Not for cron.
|
|
188
|
+
# port: 3000
|
|
189
|
+
# nextjs only: base_image: distroless (default) | alpine
|
|
190
|
+
# base_image: distroless
|
|
191
|
+
# node only: lang: javascript (default) | typescript
|
|
192
|
+
# lang: typescript
|
|
193
|
+
# Custom source location (default services/<name>/). '.' = project root.
|
|
194
|
+
# source:
|
|
195
|
+
# path: src/worker
|
|
196
|
+
# Health probe: false/omitted (TCP) | true (/health) | "/path" | {path,expected}
|
|
197
|
+
# health:
|
|
198
|
+
# path: /api/health
|
|
199
|
+
# expected: "200"
|
|
200
|
+
# Static runtime env vars (strings). Reserved: PORT, APP_NAME, SERVICE_NAME,
|
|
201
|
+
# NODE_ENV, MONGODB_URL, REDIS_URL, AI_GATEWAY_URL, N8N_WEBHOOK_URL, CLOUDGRID_*.
|
|
202
|
+
# env:
|
|
203
|
+
# LOG_LEVEL: info
|
|
204
|
+
# Sibling services/private resources that must be Ready first (no cron, no cycles).
|
|
205
|
+
# depends_on:
|
|
206
|
+
# - worker
|
|
207
|
+
# Per-service needs override (merges with app-level needs).
|
|
208
|
+
# needs:
|
|
209
|
+
# queue: true
|
|
210
|
+
# Static-only build step:
|
|
211
|
+
# build:
|
|
212
|
+
# command: npm run build
|
|
213
|
+
# output: dist
|
|
214
|
+
# env:
|
|
215
|
+
# VITE_API_URL: https://api.example.com
|
|
216
|
+
# node_version: "22" # static build step: '18'|'20'|'22'|'24' (quoted)
|
|
217
|
+
# Cron-only: schedule (REQUIRED), timezone (UTC|EST|PST), run (job | https URL)
|
|
218
|
+
# schedule: "0 9 * * 1"
|
|
219
|
+
# timezone: UTC
|
|
220
|
+
# run: job
|
|
221
|
+
# Verbose per-service persistence (prefer needs.disk):
|
|
222
|
+
# persist:
|
|
223
|
+
# - name: scratch
|
|
224
|
+
# path: /tmp/scratch
|
|
225
|
+
# size: 500Mi
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# ============================================================================
|
|
229
|
+
# NOTES
|
|
230
|
+
# - NOT here: org:/entity_id: (→ .cloudgrid/link.json), secrets (→ grid secrets set),
|
|
231
|
+
# Dockerfile (platform generates from services.*.type).
|
|
232
|
+
# - Deploy: grid plug | Local with grid resources: grid dev
|
|
233
|
+
# - Full reference: docs/cloudgrid-yaml-reference.md | CLI: docs/cli-reference.md
|
|
234
|
+
# ============================================================================
|
|
@@ -17,11 +17,9 @@ The fillable HTML is the real template — fetch it with
|
|
|
17
17
|
## cloudgrid.yaml (reference only)
|
|
18
18
|
|
|
19
19
|
```yaml
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
# needs: {} # none — static, no infrastructure
|
|
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.
|
|
25
23
|
name: report
|
|
26
24
|
services:
|
|
27
25
|
web:
|
|
@@ -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.
|